6 c9 @5 `- f+ w0 R$ q8 J0 W资源利用率,我们上面说到,单个进程存在资源浪费的情况,举个例子,当你在为某个文件夹赋予权限的时候,输入程序无法接受外部的输入字符,只能等到权限赋予完毕后才能接受外部输入。综合来讲,就是在等待程序时无法执行其他工作。如果在等待程序的同时可以运行另一个程序,那么将会大大提高资源的利用率。(资源并不会觉得累)因为它不会划水~( M1 S' A8 F6 ~& y- \# d
公平性,不同的用户和程序对于计算机上的资源有着同样的使用权。一种高效的运行方式是为不同的程序划分时间片使用资源,但是有一点需要注意,操作系统可以决定不同进程的优先级,虽然每个进程都有能够公平享有资源的权利,但是每次前一个进程释放资源后的同时有一个优先级更高的进程抢夺资源,就会造成优先级低的进程无法获得资源,久而久之会导致进程饥饿。 , y8 q9 t7 q7 u* q6 _便利性,单个进程是无法通信的,通信这一点我认为其实是一种避雷针策略,通信的本质就是信息交换,及时进行信息交换能够避免信息孤岛,做重复性的工作;任何并发能做的事情,顺序编程也能够实现,只不过这种方式效率很低,它是一种 阻塞式 的。 4 \7 }" ^8 W+ N! R但是,顺序编程(也称为串行编程)也不是一无是处的,串行编程的优势在于其直观性和简单性,客观来讲,串行编程更适合我们人脑的思考方式,但是我们并不会满足于顺序编程,we want it more!!! 。资源利用率、公平性和便利性促使着进程出现的同时也促使着线程的出现。 ( F0 C0 s5 D1 H+ W ( \' u& O$ ~8 O! G' K1 P " \7 u8 Y( c8 N如果你还不是很理解进程和线程的区别的话,那么我就以我多年操作系统的经验(吹牛逼,实则半年)来为你解释一下:进程是一个应用程序,而线程是应用程序中的一条顺序流。9 n# a: d7 A h2 d- j/ D# i
/ p# A' m+ z9 }! {4 ~; N( \# m
* V2 o- a R7 E) [& {, b0 `8 Z % D0 q5 `7 y, \+ T# X% i) B" @; S9 |& [. c$ C' e
" w. e1 G" h, s h
# C5 l" _6 {4 P4 x _0 G
: ~& t( n- N0 Y/ o, Q' @
6 u" {* f4 \6 i: }& x; a' Y# ^ x
1 W+ Q7 v* @5 P: l4 C/ H* ~4 Y" _: c8 }; D9 T
线程会共享进程范围内的资源,例如内存和文件句柄,但是每个线程也有自己私有的内容,比如程序计数器、栈以及局部变量。下面汇总了进程和线程共享资源的区别5 V/ C& i. O5 [
$ l$ c2 z) p6 p2 Z. D, w
& P, B* \; O% O& P; \# R$ R2 ~ D $ I& Q3 D* l' v/ k2 K7 Z/ w) a7 I7 K. y- C/ L
& ]" \% p: v; S' M: V$ H4 u, Q9 i6 k% V
线程被描述为一种轻量级的进程,轻量级体现在线程的创建和销毁要比进程的开销小很多。 ) z& L# O/ {2 l# Y ; ]+ m2 x* A- z8 p7 |' h ^6 N" z% @# F3 w3 E
注意:任何比较都是相对的。. e- Z2 o x5 j) o/ ^( }+ w
% ?$ R+ W4 c, F, W3 B; U \3 z4 Z; Q" W" S; C" {在大多数现代操作系统中,都以线程为基本的调度单位,所以我们的视角着重放在对线程的探究。 7 p- Q; w+ ~9 k# g + o' Q: j. T% r2 B6 J, {' |4 Y " T9 \. _; ~ n0 S线程3 W5 p0 C8 U) u
优势和劣势6 N' E5 {# p+ o9 |& M4 R& n5 g
合理使用线程是一门艺术,合理编写一道准确无误的多线程程序更是一门艺术,如果线程使用得当,能够有效的降低程序的开发和维护成本。 + B @: i, l7 Q- \0 `6 `2 [3 G6 c" E! i/ _. U