找回密码
 注册
关于网站域名变更的通知
查看: 255|回复: 1
打印 上一主题 下一主题

Unix编程之多道程序设计

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-1-19 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
多道程序设计:分离进程为独立的功能9 y2 |1 T+ T: L! y) v1 c7 c$ @
0 ~- Y3 {: X. r# C6 S% y4 m

* @* {  E$ O' b9 I, P  B5 o" LUnix的最具特点的程序模块化技法就是将大型程序分解成多个协作进程。0 ~0 S! Z- o# b) \% N4 O( R
% I  t1 I* n. m! }/ O0 _+ Y
' }1 L+ v" P' h: K
Unix提倡把程序分解成更简单的子进程,并考虑接口:$ O: s9 v8 K6 f* r: ~+ [" X8 K
降低进程生成的开销。3 J+ M, L" ~! u  X0 e  w
提供方法简化进程间通信。5 S) e2 m- i9 Y1 W% U; a/ w
提倡使用能由管道和套接字传递的简单、透明的文本数据格式。
8 u9 Q- a3 ]5 y

5 r4 _" j) Z0 M  ~7 W1 G2 p5 M- ^* `0 C* r2 ~" y
真正的挑战不是协议语法而是协议逻辑:协议设计既要有充分的表达能力,又能防范死锁。
5 R' N8 ^$ T' I6 U( g+ X
" \9 Z' K8 i- w4 U* g' `" @
" C6 A0 M: V  m从性能调整中分离复杂度控制- W- L; o8 s4 z9 f

- u! d. x4 K% }% Z! S- i6 ]7 A" f  v3 T
在开发出可以把全局复杂度降至最低程度的干净体系之前,关注性能问题便是过早优化。6 v& ?) A; [6 h1 r

' @  k, `# h: |% `7 u
0 x8 w9 E$ f: O8 p6 M线程提高了复杂度,应尽量少用线程。
$ T% g6 P" I+ x# f) F4 `3 u% A% n* q; x# F
1 f  T& o: Q  l( R+ n9 |+ R4 y
将程序划分为多个协作进程的另一重要原因是提高安全性:仅信任较少的代码,而让大部分操作都运行在用户级。
3 ~6 k, L% ]6 X% }- A- K
1 d9 w! ~6 S) l' y
! J) i- q) h: m- {- ^0 ?5 c7 I, TUnix IPC方法
9 R) q+ [. Q- V( E4 s7 x% r8 a& c0 e* I3 O  w

! E5 \# l: f7 v$ w$ e7 f1 把任务转给专门程序。* A2 c! R" o  S
; R3 z2 B$ [8 c6 o$ [

7 o# K/ b6 H: V, n: {- x7 N' O廉价的进程生成使得程序间协作变得可能,通过调用专门程序来完成专门任务;
0 x1 x0 B# j. ^C库popen可以用来向专门程序传递数据或读取专门程序的返回结果;3 [# Q+ I. G, H
专门程序运行期间并不需要与父进程交互。# }4 Y1 U5 f% @2 w

5 T' j" K/ Y! D7 X, \: \: n! J* ~6 T. S( X
示例:
; O, @6 b  m# u) D/ Q' ?$ Q- dmutt:调用专门的编辑器。
$ C6 r5 j1 z4 v) l
* j# ^6 B$ T$ G+ d+ B1 q6 Q4 g; E; J" }! ]5 G2 I9 H# W
2 管道、重定向、过滤器+ H( D, u* f2 y6 T
# I7 {4 }: L9 Q9 g8 f) p' u1 O

6 g. o6 J7 S. P0 N3 h6 n2 Z  j管道: |把一个程序的输出连接到另外一个程序的输入;单向性;管道中所有程序并发执行;匿名管道,命名管道(为命名套接字取代)。
" n3 Y/ N  u" H) _# v1 a重定向:> <5 q/ z+ Q$ g2 C0 t* Z7 r& D
pic2graph:调用现有工具的管线。& l% ], H. E% W% S* X. Q0 U, L
dc和bc:相互组合完成问题。
3 y$ y8 y; ^7 nfetchmail:不能使用,因为管道的单向性;不能发出反馈信息。2 `9 L5 n9 s+ @" C/ E$ m7 L

0 z; K4 Y! T& x9 D- o1 ~: m7 Y( l3 ]" G7 Z9 Z0 y
3 包装器
: u# d7 L" m. k% O4 n) Z1 Q+ `脚本中封装命令的固定参数
1 l/ v/ S  y- x! A/ f
, h7 F  q) t" M. L9 S3 ^
+ l- g& @1 l" B( k+ m4 安全性包装器
( a: H2 G/ n  T- M$ U7 K3 c8 @: D! I/ ^( t" t4 o+ G
/ @0 t9 E. c0 _2 Y& v% w) ~
安全性包装器:调用专门程序检查某类凭证,然后根据返回结果执行后一个程序;  Y1 U- ^. S" h% h0 ?- O" K3 `* @
bernstein链与管道类似;只不过每个继发阶段的程序取代了前一阶段的程序,而不是与之并行。
: l: g; h, g; N9 W+ _: z5 I6 f2 n
3 ^) |1 l+ F- X0 f3 b+ m$ G
. e$ S, C" ^5 h1 D" n+ w5 从进程, u5 R8 R' ?% g2 e

$ q1 b' u4 P( \& w3 c6 J
, ]+ k7 t; R( X  R主从通信很复杂,只有在协议无关轻重。
6 L' o0 _$ M( u. Y
+ E) Y% N/ m% r7 W4 U  I) p2 P: _& j0 |6 y) c+ u# q& R
6 对等进程间通信7 ^' D9 ?: G# N6 P- V% e

' K9 |& F" _1 A9 m+ i. i7 Z  d: q* v5 V% |" G
临时文件:简单,灵活,但容易引起名字冲突,提前中断会造成问题;文件容易被修改,安全问题;, {% [2 e, F0 F* ~- @6 I5 {
信号:软中断,SIGHUP一般被用作重启初始化,而用SIGTERM作为正常退出的信号;
6 n+ S+ g, E- `1 Y" A7 Dpidfile:守护进程只允许一个实例运行,则可作为文件锁使用。
* k- T2 Y4 v. y0 j  ifetchmail信号:唤醒已经存在的进程或者新建进程来获取邮件。
* R* F6 \5 g- H2 S0 X  r
' o, d7 J2 `4 h( c# [" k# k, ]( F' ]. s. Y+ g) ~: w* G
套接字:双向IPC
0 H9 D& R' @: F/ v; v" rPostgreSQL:客户端和服务器端分开。: Z8 a) l0 f8 l; V5 O. z
$ Y- e0 X' }; n9 M, q5 k
. U& C3 G. g! L4 ?2 v; G
共享内存:速度快,只用在同一机器上。mmap,将文件映射到内存。自己处理竞争和死锁;避免通过网络栈复制数据的开销。
) _2 n% r) {7 o/ ~. e5 @) u# J8 `4 A

7 y! o: w& D" j要避免的问题和方法
0 X4 [. R4 V0 V) v& U3 v: {) R' r: r, R
; T6 j& \0 i* Z$ q; I
复杂的结构比文本流难以处理。RPC提供了丰富接口,但恰恰将问题复杂化了。% B! z1 ]* Y) }' C5 h) U% t
文本流:性能损失是线程的,但可通过硬件升级来补偿。
8 U7 Y5 l9 y* N, YXML-RPC和SOAP综合了文本流和RPC方法的优点。
) @& s; G0 l' j2 Z7 r4 n
) M. N7 n& a  r
- v1 o7 O! g- U5 d. H线程
7 |$ h, F9 D( L: {! s+ W, H7 G+ r% u% X
  p. i# w6 E; H2 V
局部变量共享全局内存使得需要加入竞争和临界区的控制,同时bug也会增多。2 F+ w9 p/ T, X. H2 O
时序依赖问题
; ^! O  L" Y  i9 Q+ W; W尽管线程没有进程上下文切换的开销,但锁定共享数据结构的开销同样昂贵。
; M' [' y, E+ ^客户端/服务器划分:由服务器集中管理所有资源争用,降低了复杂性,也有利于适应分布式计算。. \5 a& T0 u5 N) }- b
把线程、远程过程调用接口和重量级的面向对象设计结合使用特别危险。
9 W3 }, D0 s. }
0 `" K' v! V( a, {# D" y1 _+ O" D5 V/ h! S: g: p: q2 t

+ E% K4 {3 L3 f9 m  C# T* a( x( ^/ i+ t" p4 C( f
真实世界里的编程其实就是管理复杂度的问题。能够管理复杂度的工具都是好东西。但当这些工具不是控制而是增加复杂度的时候,最好扔掉,从零开始。3 i0 X0 h: u! Q0 a1 r% k# X( [7 a

! Q9 J: a3 v: i# g8 q& s
0 T# F, s; w. P1 z+ S& z; S9 b" o* b$ I* p% m

2 @2 U# c3 a2 v
, C. d6 i; t& r

该用户从未签到

2#
发表于 2020-1-19 18:56 | 只看该作者
Unix编程之多道程序设计
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-26 01:15 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表