佛说:不可说,不可说,一说即是错。 收藏本站
登陆 / 注册 搜索

阅读: 5.1K   回复: 3

一个进程的自述

回复 发新帖
仗剑天涯 论坛大牛 2017-7-2 13:21 |显示全部楼层

今生相逢便是缘分,何苦去怨恨,何苦去仇视。

主题破百
十万人都在学习的网络安全知识
        我听说我的祖先,一生只能帮助人类做一件事,如果你想在这些专用“计算机”上干点别的事儿,例如安装个游戏玩玩,那是绝对不可能的,除非你把它拆掉,然后建一个全新的机器。而我这些祖先们勉强可以称为“程序”。0 A1 I% l0 g; Y7 Z
8 }/ H+ N4 q2 ?6 H" y7 c# S
        后来有个叫冯诺依曼的人,非常了不起,他提出了“存储程序”的思想,并且把计算机分为五大部件:运算器、控制器、存储器、输入设备、输出设备。" U' Y. p5 L$ k( ~- |0 e2 [
" A0 k1 X8 B" Z& R5 [+ X7 X- e
        各种各样不同功能的程序写好以后,和程序使用的数据一起存放在计算机的存储器中,即“存储程序”;然后,计算机按照存储的程序逐条取出指令加以分析,并执行指令所规定的操作。
" I9 n2 w8 ]' k4 {
2 R( f6 d# _6 J* i( Z* p* i& c
一个进程的自述 Life-of-process-visual3.jpg
& P" {$ r: K+ @) _" ~8 m
        这样一来,原来的专用计算机变成了通用的计算机,不管你是计算导弹弹道的,模拟核爆炸的,还是计算个人所得税的,统统都可以在一台机器上运行,我就是其中的一员:专门计算员工的薪水。0 z: u- E- o/ U1 \
1 |5 v% Y: l1 o" W4 o; U
进 程 的 诞 生
# s& F( R" Q* i* X
        我所在的计算机是个批处理系统,每次上机时,我和其他程序都排好队,一个接一个的进入内存运行。0 a. P9 C: L: j: {3 ~
/ ~8 [, I' Y, ~; R4 J$ G
        每个月末是发薪日,我都要运行一次,这样我每月都能见一次CPU阿甘,这个沉默寡言,但是跑的非常快的家伙。我知道内存看阿甘不顺眼,还告了它一状,说他一遇到IO操作的时候,就歇着喝茶,从来不管不问内存和硬盘的忙的要死的惨境。- p5 C! N& i0 }

9 Z5 X/ `0 w# }3 Y$ s% ]        其实我倒是觉得挺好,这时候正好和阿甘海阔天空的聊天,他阅程序无数,知道很多内部消息,每一个字节都清清楚楚,和他聊天实在是爽。
7 j- Z! c: I; S
$ I. {0 B" |; m& C5 a# W$ @        又到了月末发薪水的时候,我刚一进入内存,便看到这么一个公告:' e& D  v& N# a
' `1 F+ w# l. ~( u% k8 V; [
        公告
1 }" L9 ]3 X3 v) |9 j+ O8 h  c        为了创建和谐社会,促进效率和公平,充分发挥每一个人的能力,经系统党委慎重研究决定:本系统自即日起,正式从“批处理系统”转为“多道程序系统”,希望各部门通力配合,一起完成切换工作。# S+ w* P- b3 o* \4 l- z2 G' V
        系统党委
% u8 Z  x6 ]  {. g; `3 x        xxxx年xx月xx日
: j  |- x) k5 a2 i8 _
/ Z7 z6 P4 [4 H/ T; k. C2 D        我正想着啥是多道程序系统,阿甘便打电话给内存要我的指令开始运行了。和之前一样,运行到了第13869123行,这是个IO指令,我欢天喜地的准备和阿甘开聊了。
1 O& ~) p/ i' q1 @3 t7 i8 z5 \6 K4 q! F+ [; P1 |0 D
        阿甘说:哥们,准备保存现场吧,我要切换到另外一个程序来运行啦!; w% P7 U3 Y- t8 {; C7 T
3 k- y. `/ |+ J4 T5 i& H- u
        “啊?我这正运行着呢!咱们不喝茶了?* b7 h5 E' {3 x, U/ ]$ n

: a/ R- P" j8 {, D& U* N0 x2 H9 y1 W        “喝啥茶啊,马上另外一个程序就来了!”# V* }- e: m2 @' U

) P$ F" t0 O0 |  ?9 B        "那我什么时候回来再见你?”我问道。
8 R7 T) _7 u7 ?. f; t2 y8 t7 a1 T
9 B1 O/ n2 W! I        “等这个IO指令完成,然后操作系统老大会再给你机会运行的。”$ P. ]; [5 p. Y, p
: E( J+ U; {9 D
        “那谁来记住我当前正在运行第13869123行?还有刚把两个数据从内存装载到了你的寄存器,就是那个EAX,EBX,你一切换岂不都丢了?”我有点着急。
& T8 b6 L# ?9 p: K" a3 E$ t- E
* Y: B4 \( D( \        阿甘说:“所以要暂时保存起来啊,不仅仅是这些,还有你的那些函数在调用过程中形成的栈帧和栈顶,我这里用寄存器EBP和ESP维护着,都得保存起来。”
+ t: ?- |  Y/ k+ w! d# X( {2 J9 s6 [* z! G
        “还有”阿甘接着说,“你打开的文件句柄,你的程序段和数据段的地址,你已经使用CPU的时间,等待CPU的时间。。。。。。以及其他好多好多的东西,统统都要保存下来。”
* E6 s+ x' b, n4 @% [7 n: E0 ^* M& @' R7 Q+ G
        我瞪大了眼睛:“这也太麻烦了吧,原来我只需要关心我的指令和数据,现在还得整这么多稀奇古怪的东西”, V. w  T! Z. D
3 z& p) M6 N/ z: K6 o! G
        “没办法,这就叫做上下文切换,把你的工作现场保存好,这样下一次运行的时候才能恢复啊。对了,老大给你们统一起了一个新的名称:进程!刚才那些需要保存的东西叫做叫做进程控制块(Processing Control Block,PCB),”
' ^" [. z+ q6 j6 M+ L% j6 n& y
+ ?4 |8 U7 |; k! a8 }5 _        我想了想,这个名字还挺贴切的,一个真正进行的程序!只是这个正在进行的程序随时可以被打断啊。
; N. P; @6 f& E$ H- R
2 o! m! b  c" v, c4 U4 ^$ q        我只好保存好上下文,撤出CPU,回到内存里歇着去了,与此同时另外一个程序开始占据CPU运行。
) P+ ~5 y9 M4 k( q, E. F* f' n6 @2 {) R6 R7 p- o
        其实我这个程序,奥,不对,我这个进程被放到一个阻塞队列里,等到IO的数据来了以后,又被赶到了就绪队列中,最后才有机会再次运行,再次见到CPU阿甘。
5 C4 g8 L; B8 b3 K0 e6 }, h% f9 i6 C. V& C) n
        //进程的就绪,阻塞,运行这三个状态的转换和《一个线程的自白》中描述的非常类似。, L2 ^9 e: G7 V9 P% Z, |$ c' a. h
. u/ m! l+ d$ M
        阿甘从我的PCB中取出各种保存的信息,恢复了运行时现场,可是忙活了好一阵,没办法,这就是程序切换必须要付出的代价。
, v0 n6 O: K% ^0 N* U9 s+ @; {: v9 w. {+ v2 N0 @/ R- r
        我有点同情阿甘了,从此以后,他很难再悠闲和和我们海阔天空,每时每刻都处于高速的奔跑中。#j319:. R' q/ |0 d* _! h7 a

+ y5 o/ }" Q8 ?/ J- {& o8 E- a        得益于阿甘的高速度,虽然在同一时刻只有一个程序在运行,但是有很多程序在短时间内不断的切换,在外界看来,似乎多个程序在同时执行。
, i# J  |- _, \0 q* y+ Y* z1 n9 N4 M0 O! x# m! K
        尤其是那些速度超慢的人类,他们开着电脑一边听歌,一边上网,一边QQ,很是自在,理所当然的认为这些程序就是同时在运行。岂不知阿甘是让音乐播放器上运行几十毫秒,然后打断,让浏览器进程运行几十毫秒,再打断,让QQ也运行几十毫秒,如此循环往复。#j334:! V0 \( ?: p% z8 @% B) a

% E% u' t( i$ H' z' w4 a. N        唉,阿甘真是能者多劳啊,这个计算机系统也算是达到了我们党委的目标:兼顾了效率和公平。
  ^1 f. C- a  y# w  i# B. \" C+ I; P0 _2 Q9 Q& Q
线 程

) p' S0 a4 A, D" n( w8 m# P4 u4 l        有了进程就万事大吉了吗?人类的欲望是无止境的,很快就出现了新情况,举个例子来说吧,我有一个兄弟,是个文字处理软件,他和我不一样,他有界面,人类在用的时候能看到,这实在是很幸福,不像我总是在背后默默工作,几乎无人知晓。
& J- ~& L. c6 m6 I% f; D9 X  f: J8 j
        这哥们有个智能的小功能,就是在人类编辑文档的时候能自动保存,防止辛辛苦苦敲的文字由于断电什么的丢掉。& m$ a! c% A+ [% q
/ J! u/ _/ J" J  Y/ n- a! o
        可是这个功能导致了人类的抱怨,原因很简单,自动保存文字是和IO打交道,那硬盘有多慢你也知道,这个时候整个进程就被挂起了,给人类的感觉就是:程序死了,键盘和鼠标不响应了!无法继续输入文字,但是过一会儿就好了。
7 t! f3 J8 u3 }# r+ M9 r* E; v( @& f8 H1 o9 @4 z
        并且这种假死一会儿就会出现一次(每当自动保存的时候),让人不胜其烦。: _, u+ m4 H8 P  j) s" b

/ {% r8 t+ y' T/ Y0 k        系统党委研究了很久,他们当然可以用两个进程来解决问题,一个进程负责和用户交互,另外一个进程负责自动保存,但是,这两个进程之间完全是独立的,每个人都有自己的一亩三分地(地址空间),完全互不知晓,进程之间通信的开销实在是太大,他们没有办法高效的操作那同一份文档数据。( \9 G* C& Q3 o6 |/ O# I

; w5 C) [( j! V        后来还是劳模阿甘想出了一招:可以采用多进程的伟大思想啊!: N/ F9 Y9 U- p8 Z& |

* G+ P$ u1 w$ I% t& C        把一个进程当成一个资源的容器,让里边运行几个轻量级的进程,就叫线程吧,这些线程共享进程的所有资源,例如地址空间,全局变量,文件资源等等。2 X3 C- u9 W2 c4 N# Y: R7 M

( W0 i3 Z: q; U, E$ Y; s9 r1 x9 _        但是每个线程也有自己独特的部分,那就是要记住自己运行到哪一行指令了,有自己的函数调用堆栈,自己的状态等等,总而言之,就是为了能像切换进程那样切换线程。
& Q, M8 Z! h' u
) Z! w# i! j8 h: w) A( h
一个进程的自述 1-进程.jpg
, o- A1 |7 Q; a
        拿我那个哥们的情况来说,一个进程保存着文档的数据,进程中有两个线程,一个负责和用户交互,另外一个专门负责定时的自动保存,IO导致的阻塞就不会影响另外一个了。3 P6 T0 e% Q9 w2 G

1 e) m: X3 b/ g        注意,这两个线程都能访问进程的所有东西,他们两个要小心,不要发起冲突才好--这是人类程序员要做的事情了,不归我们管。
8 u5 i: `7 M0 v/ Z6 \, E- ^6 y/ X! u, ~( o2 H2 n
争 吵
) C, h' z8 M1 O0 r
        阿甘的建议被采纳了,其实这几乎是唯一的解决问题方式了,但是由谁来管理引起了激烈争吵。
7 x* ^# t& J* D, ^
& V3 x  s1 @! _) f" I6 r        系统党委有一波人坚持要在用户空间实现线程,换通俗的话说就是让那些进程在自个儿内部去管理线程,他们的理由也很充分:你们自己实现了线程,可以自己定制自己的调度算法,多灵活啊;6 t- z: d# V, w

+ R' w' r: r4 M& `& Y        所有的线程切换都在进程内完成,不用请求我们操作系统内核来处理,效率多高啊;
5 ^0 v: j4 ~, v) j/ V- v9 J9 s3 _& i4 {: o" j0 f
        况且你们可以在那些内核不支持线程的操作系统中运行,移植性多好啊。
8 I- C% f' d, x" R3 E% B* A8 @" @  S, j
一个进程的自述 2-进程.png
6 c- H* `+ u$ `8 E
        我们清楚的知道这是内核想做甩手掌柜,因为他们选择性的忽略了一个致命的问题:如果由我们实现线程,则操作系统内核还是认为我们只是一个进程而已,对里边的线程一无所知,对进程的调度还是以进程为最小单位。
& Y* F  U) c$ B) L# m% M$ k/ v* S; X4 D% O4 t, e7 `+ @
        一旦出现阻塞的系统调用,不仅仅阻塞那个线程,还会阻塞整个进程!
/ D! b: w6 R$ `6 u, Z# l) j0 ~. m: C; u' Y" S. L) a$ g
        例如文字处理器那个进程,如果负责定时保存的线程发起了IO调用,内核会认为,这是由进程发起的,于是就把整个进程给挂起了,虽然和用户交互的进程还是可以运行,也被强制的随着进程挂起来,不响应了,这多么悲催啊,又回到了老问题上去了。8 f& H/ x% k6 J; {1 u
$ Q( [2 z- T( h. w$ s
        所以我们坚决不能答应,我们则一致的要求:在内核中实现线程!内核需要知道进程中线程的存在,内核需要维护线程表,并且负责调度!
0 v5 D8 m6 m. |$ ~, p* U" r7 H& ]
3 X7 N0 v2 C' A4 p" E! J* U
一个进程的自述 3-进程.png
5 N+ {+ N/ b$ u4 l" r8 E$ L
        党委的人傲慢的说:你们不嫌累吗,每次创建一个线程都得通过我们内核,多慢啊。
! ~* C* a  F4 Q$ \( g6 C6 x/ u& _' P7 l0 d: l
        我们说:只有这样,一个线程的IO系统调用才不会阻塞我们整个进程啊,你们完全可以选择同一个进程的另外一个线程去执行。
( V* _4 Z, g+ _" p) @: i1 s3 }! P/ k0 D0 @" ^+ V7 i# p
        双发僵持不下,最后只好妥协,那就是:混合着实现吧。  t- }) s" K$ X
+ c, _. A. S2 `* \7 K
        用户空间的进程可以创建线程(用户线程),内核也会创建线程(内核线程),用户线程映射到内核线程上。3 O" d  J" F; r( i" b. @
8 z+ l) s3 Q0 j( M, F
一个进程的自述 4-进程.jpg

. j6 ~/ l( j, \& W) w        问题基本解决了,但也带来了新的问题,我们的系统也变的越来越复杂,尤其是进程之间的通信和线程之间的同步,会那些程序员们带来无穷无尽的烦恼,这是后话了,有机会下次再说吧。
& b  N. g; ?; r1 V& F4 B; \( D- L" M: q) t6 E  f, d$ N# A) u

上一篇:  一块硬盘的自述

下一篇:  一块网卡的自述

评分

参与人数 1成长值 +1 金币 +1 展开 理由
清风徐来 + 1 + 1 热心回复!

查看全部评分


巴黎环抱的花海龙战于野 2017-8-31 19:20 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

小白一个 顶一下
映画「出类拔萃」 2018-1-20 22:35 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

你们有见过这么整齐的十五个字吗
. k. }, Z' \5 J; v) i这么整齐的十五个字人家最喜欢了2 N4 B' K& h8 Q" u9 S7 l
他们都说打出十五字才是最标准的
1 l4 h. u* h; O, a# k$ C" a% t9 v我也没办法因为我要打十五个字啊
( I# x0 X6 u8 @  u& k9 K+ ]我说了多少次了不要只打十五个字
: E7 w; o* ^* z你们那些十五字神马的完全弱爆了
& B# z% Z" D4 _6 b+ V4 `1 F都怪吧主删我贴所以我只能到处逛/ ~* f2 O2 p  ~2 a+ U  y
为了经验我没办法只能遇贴就灌水
: Q6 H& ?4 R! z- H  W3 A灌水也要讲技术保证句句是十五字
5 ?9 O$ I3 C- N+ ]$ S4 ^2 H& K如今发帖有困难整不好就被删贴了6 w' e/ W$ n+ c/ R8 p* ~! _
我也没办法吧主他老是删我帖子啊6 ^3 O5 k+ H" N$ K5 l7 k, h
只能够这样用十五字来混混经验了. j& S3 m6 {+ E. p5 ]
用十五字混经验的有谁比我厉害呢% \/ U* Y6 R1 ?" a% }
有前排就要占没前排也要灌一下水& N$ W' u% \0 Q5 [
有前排不占或者不灌水是会后悔的! V* U. m6 l8 ~0 _
无论是多么无聊的帖子我都会去的
$ S. T' ]& y$ b; o: b/ h因为为了一句话万一这贴子火了呢' A8 b1 I* q3 Q/ B$ o# p& T
句句十五个字有哪个高手能超越呢
5 R; {! W; u) q4 i#367:
深海里的那抹蓝「出类拔萃」 2018-1-20 23:45 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

尔等果如其母戏寡人欤?#y447:
您需要登录后才可以回帖 登录 | 注册账号  

本版积分规则

关于本站|大事记|小黑屋|古黑论 网站统计

GMT+8, 2020-6-4 16:20 , Processed in 0.041623 second(s), 27 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表