EDA365电子论坛网

标题: Unix编程之多道程序设计 [打印本页]

作者: mytomorrow    时间: 2020-1-19 11:16
标题: Unix编程之多道程序设计
多道程序设计:分离进程为独立的功能
& a" g3 d: E& c" j6 w# Z+ U+ |% Q- c( z# q

) A+ h0 @+ T( b' M! E' t( J& xUnix的最具特点的程序模块化技法就是将大型程序分解成多个协作进程。6 u5 Q, t+ T2 x, F6 k
3 U! k  p5 V+ m
. q) H7 m! {4 x# F- ]$ o
Unix提倡把程序分解成更简单的子进程,并考虑接口:* e- |' ~; {$ \0 B' j2 @% a: S
降低进程生成的开销。4 `+ r; s5 t0 Q5 d: L# g
提供方法简化进程间通信。
$ o# L& v. p3 M- M4 m3 b提倡使用能由管道和套接字传递的简单、透明的文本数据格式。
2 V) v  k2 L! w: H: q! ?$ v

' ~- y: L3 E6 c" e% I. p9 M* s% H
真正的挑战不是协议语法而是协议逻辑:协议设计既要有充分的表达能力,又能防范死锁。& ^, G! j; j: o7 C2 e# ~
$ p# \( D; l5 @$ K0 e5 [

" u  J) ~& b; Y从性能调整中分离复杂度控制
. f! e1 a6 ^- R4 g" i' C2 J
( D( q0 B# K/ [/ A
) H/ V: j: Z& w6 i. F7 A在开发出可以把全局复杂度降至最低程度的干净体系之前,关注性能问题便是过早优化。- W7 B$ @, ]! C3 Z/ b

1 O4 w' |  L) V+ c6 C
* I( K6 a/ C3 l# H9 E. b: s线程提高了复杂度,应尽量少用线程。5 Y5 c7 z  v# }) y7 x! S+ v

% P5 `6 C! @! T5 {0 w7 B
$ r9 p- g: h/ t" j% Z4 q* X& g将程序划分为多个协作进程的另一重要原因是提高安全性:仅信任较少的代码,而让大部分操作都运行在用户级。2 g8 h9 k7 T# N+ h- F0 o+ x
+ C) T. A6 Y1 j; g9 M

) m4 n* ~4 Q6 MUnix IPC方法! M" d+ s! s( @' Q
4 s/ n% D9 H3 p7 H
! o8 p, v. P' P5 E9 x5 V3 M
1 把任务转给专门程序。7 |( Y: G( c) F% c) O6 G. Y

7 z. t, S; p( J9 d$ ~& z1 `: O; s3 D+ G. {
廉价的进程生成使得程序间协作变得可能,通过调用专门程序来完成专门任务;
. {0 u: P$ f/ w" e9 c8 E8 e" fC库popen可以用来向专门程序传递数据或读取专门程序的返回结果;
+ `$ v4 b  X, w1 k/ u! a) M专门程序运行期间并不需要与父进程交互。8 @# F/ J7 K1 B
) ?% v/ i) x# }
* I0 _/ X0 {  R
示例:3 |2 x& ~" _( t; }; k# X
mutt:调用专门的编辑器。8 U1 C- q% g' U2 P7 S1 j

5 H$ n1 |  b) s+ q$ _* q/ }/ f( U( c' O, z- u2 _# q
2 管道、重定向、过滤器9 [7 J3 C$ A3 C  U2 |
  Q6 x' H$ Q1 B' B( i8 [/ I& }

. ?. z' P" A, [' w管道: |把一个程序的输出连接到另外一个程序的输入;单向性;管道中所有程序并发执行;匿名管道,命名管道(为命名套接字取代)。
- p& b  I7 q  x) }! n重定向:> <! s* s5 z3 P4 g' U3 h! \5 g
pic2graph:调用现有工具的管线。
, n& q2 P5 z* M- v5 ^+ M- cdc和bc:相互组合完成问题。8 |4 @* j* n7 E& }# u* {1 |& ]% h; l
fetchmail:不能使用,因为管道的单向性;不能发出反馈信息。  R! i) j# f2 A6 A. U  P# L  K, j6 U

! ?( v0 j# \1 S. P8 R6 j4 v
7 V5 p7 T! J# Z% M3 包装器6 f" A7 y% T3 C- n% z+ L
脚本中封装命令的固定参数
) B1 u, r3 e* \0 [7 Y. _6 J3 d3 Y- W1 {/ R0 G8 ]! }  E! ^/ J

& N, q" z  {& S; }: `" o* x4 安全性包装器
4 D) t; f# \4 E( Q
9 Z4 k3 S! O+ B- Y9 E* U/ ]! T$ W* e+ B* _6 q  s- T" B/ Z
安全性包装器:调用专门程序检查某类凭证,然后根据返回结果执行后一个程序;6 f- o) d' e0 Y7 o. p$ Q
bernstein链与管道类似;只不过每个继发阶段的程序取代了前一阶段的程序,而不是与之并行。
1 J. J5 B) I' g9 I# v1 ^0 r" h6 }4 B) |' a6 q" Y/ M9 m/ W$ i
1 t  v4 F# ~2 z3 s: e' w' P
5 从进程0 o- |+ N2 [( H) ?9 u6 w5 S1 Y% a

& S6 n9 ?2 K' [% {
+ k" ^1 L6 U* x9 ]8 W主从通信很复杂,只有在协议无关轻重。6 d' t# p6 U4 h1 J: w" }
) S8 k* U2 Y9 Q/ d+ }- T4 u
+ d$ c( O9 [. g& Z* P) x7 s
6 对等进程间通信3 v% p% X% Y4 v) |: y; Z
$ X9 |) W9 a  B: @9 X: h7 J2 ?3 {9 h( @

" d. m, D$ X# C% i! y临时文件:简单,灵活,但容易引起名字冲突,提前中断会造成问题;文件容易被修改,安全问题;. ^1 X4 y7 u5 d, y
信号:软中断,SIGHUP一般被用作重启初始化,而用SIGTERM作为正常退出的信号;  |8 n9 Q2 l, N$ h' l/ ~
pidfile:守护进程只允许一个实例运行,则可作为文件锁使用。
) _7 P9 q2 N& M/ M: Dfetchmail信号:唤醒已经存在的进程或者新建进程来获取邮件。' j  d2 U. Z0 h5 m) F" d

5 S0 y5 {  \9 t1 b- w  \
' ^: C% Z+ _% @/ z5 k+ x% E4 B" u' ~套接字:双向IPC1 L5 t5 ]1 X7 Q$ q/ a( x' V+ F  J
PostgreSQL:客户端和服务器端分开。6 _2 m2 M2 \' W' ]5 A
2 B% ~, {8 E" H" V# b- [# ^
; m% L, X" u5 ?5 X& d$ q& c
共享内存:速度快,只用在同一机器上。mmap,将文件映射到内存。自己处理竞争和死锁;避免通过网络栈复制数据的开销。: E& B4 y1 v4 ?0 x$ J
$ u+ I& l9 V6 T6 c2 b

6 W. J+ K$ O, M5 H( i要避免的问题和方法
* M/ ?# }+ E% s& i' O2 c8 V0 e' |: Y- P7 a, U
7 G2 \9 n- x/ W$ _" B+ e
复杂的结构比文本流难以处理。RPC提供了丰富接口,但恰恰将问题复杂化了。
" Y- ?2 f5 n8 @( X文本流:性能损失是线程的,但可通过硬件升级来补偿。) A4 u1 A3 y' C$ p- K5 ?/ g5 u, B  O
XML-RPC和SOAP综合了文本流和RPC方法的优点。/ O: {, i  n/ w! l& v. J
3 ]* I, i+ B6 A# o

& Z5 Z( b. q3 f" S0 N0 y线程
& [" [) l0 w' h2 G7 f" Y
/ R' K) G" o, n
* r0 L0 C; ]% T0 L局部变量共享全局内存使得需要加入竞争和临界区的控制,同时bug也会增多。) i0 `: R0 z. k+ k7 p  t
时序依赖问题9 b8 T! q) f" A" n& w& ^7 A
尽管线程没有进程上下文切换的开销,但锁定共享数据结构的开销同样昂贵。
) w; h; `+ H' Y+ k客户端/服务器划分:由服务器集中管理所有资源争用,降低了复杂性,也有利于适应分布式计算。% @( P- Y- b8 }, X2 T! f* K
把线程、远程过程调用接口和重量级的面向对象设计结合使用特别危险。
4 j5 v7 D, W8 i2 Z8 J6 r3 w5 V3 d" P2 Y
& \1 H; K7 U# d# ]+ O

  N, K6 e9 U" E, q0 L* a/ N0 |* J& y+ `$ r6 t
真实世界里的编程其实就是管理复杂度的问题。能够管理复杂度的工具都是好东西。但当这些工具不是控制而是增加复杂度的时候,最好扔掉,从零开始。
; ~! d# e- N3 ]0 Q+ f  Y- ]
' B; k+ s2 Y: Y# Y8 A2 e) P3 Q! E# U' v8 W* `; s; H! ]) p

& [  Z8 w9 C2 t( P3 C4 ?
: ]  e8 ]7 L0 O
0 K+ Q) Q- x! E) q& S6 [- x. m
作者: CCxiaom    时间: 2020-1-19 18:56
Unix编程之多道程序设计




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2