一定是红线下得太乱,才不小心把我和你绑在一起了……却没系稳。 收藏本站
登陆 / 注册 搜索

阅读: 5.8K   回复: 3

一个进程的自述

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

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

主题破百
        我听说我的祖先,一生只能帮助人类做一件事,如果你想在这些专用“计算机”上干点别的事儿,例如安装个游戏玩玩,那是绝对不可能的,除非你把它拆掉,然后建一个全新的机器。而我这些祖先们勉强可以称为“程序”。$ k3 ~4 L7 n3 l" ~5 n+ U# x. p

: Y! K& A( _4 S. i' ?        后来有个叫冯诺依曼的人,非常了不起,他提出了“存储程序”的思想,并且把计算机分为五大部件:运算器、控制器、存储器、输入设备、输出设备。2 ?, ~# N8 Q4 @$ n7 c4 e- s
) S' T' c& P! M
        各种各样不同功能的程序写好以后,和程序使用的数据一起存放在计算机的存储器中,即“存储程序”;然后,计算机按照存储的程序逐条取出指令加以分析,并执行指令所规定的操作。
+ U) @7 \5 q, I" U
- B7 x9 m$ }- v
一个进程的自述 Life-of-process-visual3.jpg

+ C$ a, ]' l% e2 f- x0 C& h, U3 V        这样一来,原来的专用计算机变成了通用的计算机,不管你是计算导弹弹道的,模拟核爆炸的,还是计算个人所得税的,统统都可以在一台机器上运行,我就是其中的一员:专门计算员工的薪水。) B9 S% d; J: @

3 s4 z2 U9 h  k* v/ X
进 程 的 诞 生

; k% X, d( I' C' `- U8 _/ L        我所在的计算机是个批处理系统,每次上机时,我和其他程序都排好队,一个接一个的进入内存运行。" V- t1 O& q( B" g( Z4 d2 D4 p7 ?- V
. U" K% O: C0 ]5 O) S- h  E
        每个月末是发薪日,我都要运行一次,这样我每月都能见一次CPU阿甘,这个沉默寡言,但是跑的非常快的家伙。我知道内存看阿甘不顺眼,还告了它一状,说他一遇到IO操作的时候,就歇着喝茶,从来不管不问内存和硬盘的忙的要死的惨境。
) @; W2 I6 ?" P7 A
+ p! A% J4 Q2 V& J  h+ S        其实我倒是觉得挺好,这时候正好和阿甘海阔天空的聊天,他阅程序无数,知道很多内部消息,每一个字节都清清楚楚,和他聊天实在是爽。- T0 q9 f8 `  C9 `# J
8 j- Y  T4 K. K9 F
        又到了月末发薪水的时候,我刚一进入内存,便看到这么一个公告:  @, f9 O) p' i% K2 u. m9 g

+ p1 {: v7 H0 `: L9 Y        公告
9 G) s0 T* l  G        为了创建和谐社会,促进效率和公平,充分发挥每一个人的能力,经系统党委慎重研究决定:本系统自即日起,正式从“批处理系统”转为“多道程序系统”,希望各部门通力配合,一起完成切换工作。/ w! v) U# x+ Q9 f1 A
        系统党委- v3 q9 P' {; ~, x  d/ a
        xxxx年xx月xx日
. ^" r: M/ D6 Y" \: P  A- z! `4 S) o! {- `) P
        我正想着啥是多道程序系统,阿甘便打电话给内存要我的指令开始运行了。和之前一样,运行到了第13869123行,这是个IO指令,我欢天喜地的准备和阿甘开聊了。
- f' G8 b7 k& B0 @. v0 N, v+ U- a8 {2 O+ q$ Q% X( K; N
        阿甘说:哥们,准备保存现场吧,我要切换到另外一个程序来运行啦!9 W" }( v' x  V6 `" l! H; v

! C4 n3 ]" {( C# x        “啊?我这正运行着呢!咱们不喝茶了?& E0 I3 U" X! N

4 [  V9 z# ^& z- o9 O6 i7 }        “喝啥茶啊,马上另外一个程序就来了!”, b/ X% P+ N  s) ~0 C
2 s) g( e% ^. p( ~1 _
        "那我什么时候回来再见你?”我问道。
8 `4 e# V4 _0 ?. A4 s1 j$ B, q9 M2 X* x
        “等这个IO指令完成,然后操作系统老大会再给你机会运行的。”4 l9 g9 l4 v- S( S" x
+ N0 ]+ R+ I. I1 d
        “那谁来记住我当前正在运行第13869123行?还有刚把两个数据从内存装载到了你的寄存器,就是那个EAX,EBX,你一切换岂不都丢了?”我有点着急。
2 E; N# x; Z4 k1 O$ P! h  L
" r2 Y* x, j/ Y1 V9 x) j- m1 I$ [        阿甘说:“所以要暂时保存起来啊,不仅仅是这些,还有你的那些函数在调用过程中形成的栈帧和栈顶,我这里用寄存器EBP和ESP维护着,都得保存起来。”
: k5 A& h; h6 h; c1 _/ n' {1 B: i' g; K0 f" a  Y
        “还有”阿甘接着说,“你打开的文件句柄,你的程序段和数据段的地址,你已经使用CPU的时间,等待CPU的时间。。。。。。以及其他好多好多的东西,统统都要保存下来。”2 W. m& K: \5 Z4 R0 j

% S% I1 O& u. ^        我瞪大了眼睛:“这也太麻烦了吧,原来我只需要关心我的指令和数据,现在还得整这么多稀奇古怪的东西”
3 `- C" W, P  `1 m1 q/ k- f7 i' m5 a5 W* T& |! d5 g6 g( |: b
        “没办法,这就叫做上下文切换,把你的工作现场保存好,这样下一次运行的时候才能恢复啊。对了,老大给你们统一起了一个新的名称:进程!刚才那些需要保存的东西叫做叫做进程控制块(Processing Control Block,PCB),”1 F1 H6 M6 B8 m/ e8 K

( W% p3 X* L1 q% g  Z5 x  u        我想了想,这个名字还挺贴切的,一个真正进行的程序!只是这个正在进行的程序随时可以被打断啊。
6 q" D& _) q! k/ {% ?  p: K  o2 I* _  E- a" j+ D
        我只好保存好上下文,撤出CPU,回到内存里歇着去了,与此同时另外一个程序开始占据CPU运行。
% s  G& D7 E! t8 a
: [, v& ]- {: D0 x        其实我这个程序,奥,不对,我这个进程被放到一个阻塞队列里,等到IO的数据来了以后,又被赶到了就绪队列中,最后才有机会再次运行,再次见到CPU阿甘。
! b+ e: R; @2 W
' y. u  u$ W' E+ s2 R* ^        //进程的就绪,阻塞,运行这三个状态的转换和《一个线程的自白》中描述的非常类似。
- T; N, Z4 ^7 B# Z
) ^6 I! L; I* i( b        阿甘从我的PCB中取出各种保存的信息,恢复了运行时现场,可是忙活了好一阵,没办法,这就是程序切换必须要付出的代价。
3 u2 m, j4 u$ F" f. j1 v" F# b4 p! V' U/ A
        我有点同情阿甘了,从此以后,他很难再悠闲和和我们海阔天空,每时每刻都处于高速的奔跑中。#j319:
% H' b2 O7 M6 q# v* n# N( L
, R# R3 a7 h7 T, f9 k8 k) O        得益于阿甘的高速度,虽然在同一时刻只有一个程序在运行,但是有很多程序在短时间内不断的切换,在外界看来,似乎多个程序在同时执行。
" ~; z/ W! t3 \/ B7 @: F. a# v4 W; H  w) C8 L! i; F) c7 ]+ T
        尤其是那些速度超慢的人类,他们开着电脑一边听歌,一边上网,一边QQ,很是自在,理所当然的认为这些程序就是同时在运行。岂不知阿甘是让音乐播放器上运行几十毫秒,然后打断,让浏览器进程运行几十毫秒,再打断,让QQ也运行几十毫秒,如此循环往复。#j334:) t: m7 o4 o6 {( M

1 A. O. ^, i4 e% u; q8 Y* o        唉,阿甘真是能者多劳啊,这个计算机系统也算是达到了我们党委的目标:兼顾了效率和公平。. ^# r) J! E3 c( b# K
1 C+ k( a" D# ^2 N6 t. ^
线 程
( X) C8 c* q/ ~' @& r6 m$ `
        有了进程就万事大吉了吗?人类的欲望是无止境的,很快就出现了新情况,举个例子来说吧,我有一个兄弟,是个文字处理软件,他和我不一样,他有界面,人类在用的时候能看到,这实在是很幸福,不像我总是在背后默默工作,几乎无人知晓。
4 J# B9 S. h/ Q( m' P5 S3 n% l( D. r# s9 C0 O/ F2 I+ B1 N
        这哥们有个智能的小功能,就是在人类编辑文档的时候能自动保存,防止辛辛苦苦敲的文字由于断电什么的丢掉。
  q! y/ C9 e5 J( w! X6 R. x! b# C
7 a4 N9 B5 Y  t5 f( g        可是这个功能导致了人类的抱怨,原因很简单,自动保存文字是和IO打交道,那硬盘有多慢你也知道,这个时候整个进程就被挂起了,给人类的感觉就是:程序死了,键盘和鼠标不响应了!无法继续输入文字,但是过一会儿就好了。% r- M! t0 C- P9 b) k+ C6 r
3 Y3 y0 C/ u# W- F& I  m5 G" H
        并且这种假死一会儿就会出现一次(每当自动保存的时候),让人不胜其烦。" b/ i/ l2 Q  F* B2 c& O: {
$ g7 s7 }) k. |3 s! g! T5 e- \/ \8 ?
        系统党委研究了很久,他们当然可以用两个进程来解决问题,一个进程负责和用户交互,另外一个进程负责自动保存,但是,这两个进程之间完全是独立的,每个人都有自己的一亩三分地(地址空间),完全互不知晓,进程之间通信的开销实在是太大,他们没有办法高效的操作那同一份文档数据。# i. G! H& e  ^  N

! X( g6 F5 ^6 ]% V0 M8 l        后来还是劳模阿甘想出了一招:可以采用多进程的伟大思想啊!
; }8 v& g' @# {+ `. A8 j  r, r# {7 m- V. r5 e
        把一个进程当成一个资源的容器,让里边运行几个轻量级的进程,就叫线程吧,这些线程共享进程的所有资源,例如地址空间,全局变量,文件资源等等。- |- l6 m8 A; L9 M* a3 Q, `1 Q

0 {7 Z2 O. o$ ?9 M) U  Q        但是每个线程也有自己独特的部分,那就是要记住自己运行到哪一行指令了,有自己的函数调用堆栈,自己的状态等等,总而言之,就是为了能像切换进程那样切换线程。
$ R" D. M9 n. s: c
8 v) ?+ I: h& m; w2 {
一个进程的自述 1-进程.jpg

+ u, p( b2 D* v- D# V0 V        拿我那个哥们的情况来说,一个进程保存着文档的数据,进程中有两个线程,一个负责和用户交互,另外一个专门负责定时的自动保存,IO导致的阻塞就不会影响另外一个了。
* |, Y9 Y3 U  ]2 {: V) u- \( n& k5 z4 W
        注意,这两个线程都能访问进程的所有东西,他们两个要小心,不要发起冲突才好--这是人类程序员要做的事情了,不归我们管。
6 l- |3 @7 v/ V  k
6 s% w+ x/ i5 ?! B
争 吵
' _" [" j" N5 ?& ~0 T8 ^
        阿甘的建议被采纳了,其实这几乎是唯一的解决问题方式了,但是由谁来管理引起了激烈争吵。* b7 h, S1 w9 A; `' t) C
5 v( U8 N$ c+ Y0 S
        系统党委有一波人坚持要在用户空间实现线程,换通俗的话说就是让那些进程在自个儿内部去管理线程,他们的理由也很充分:你们自己实现了线程,可以自己定制自己的调度算法,多灵活啊;: o8 d; z! p% \/ T1 y
+ X7 `2 U% L- \' l  _  A
        所有的线程切换都在进程内完成,不用请求我们操作系统内核来处理,效率多高啊;
% D+ f/ \0 P, D# j8 p% O5 A$ f+ L: ~4 \( O: r
        况且你们可以在那些内核不支持线程的操作系统中运行,移植性多好啊。7 g( z) e' w6 f/ m- X& k
+ ?' @) \6 r; P- ^1 [! S* z0 r# t/ ?
一个进程的自述 2-进程.png
5 r9 b7 K) h" T& K; v3 `- m0 O- X4 @
        我们清楚的知道这是内核想做甩手掌柜,因为他们选择性的忽略了一个致命的问题:如果由我们实现线程,则操作系统内核还是认为我们只是一个进程而已,对里边的线程一无所知,对进程的调度还是以进程为最小单位。8 h# [9 d/ }+ ]. c* W+ _5 p

$ I4 }4 }6 ?& v7 L7 Y+ p        一旦出现阻塞的系统调用,不仅仅阻塞那个线程,还会阻塞整个进程!5 K& V* ?& {  g' ^! D- X
; P+ k4 s' R' ^7 T1 u
        例如文字处理器那个进程,如果负责定时保存的线程发起了IO调用,内核会认为,这是由进程发起的,于是就把整个进程给挂起了,虽然和用户交互的进程还是可以运行,也被强制的随着进程挂起来,不响应了,这多么悲催啊,又回到了老问题上去了。0 N) h' U9 G* ?2 v

% T7 ^. k! U% F' m& h. m9 Y        所以我们坚决不能答应,我们则一致的要求:在内核中实现线程!内核需要知道进程中线程的存在,内核需要维护线程表,并且负责调度!& d* D8 \  p+ y2 V/ {9 n

: R4 `/ d* Z& A  A
一个进程的自述 3-进程.png

" L/ L# l  o" `) U& i/ |% `        党委的人傲慢的说:你们不嫌累吗,每次创建一个线程都得通过我们内核,多慢啊。0 l6 g" h- U8 X" }. a9 p
% m! Y5 f* U8 v" w, T: `
        我们说:只有这样,一个线程的IO系统调用才不会阻塞我们整个进程啊,你们完全可以选择同一个进程的另外一个线程去执行。  Q  t7 |* l# u
/ @; U( s6 x: ]! K. y7 S5 `
        双发僵持不下,最后只好妥协,那就是:混合着实现吧。
/ p  b4 J" {3 O. e1 C! I5 [: W7 }8 y7 X! D
        用户空间的进程可以创建线程(用户线程),内核也会创建线程(内核线程),用户线程映射到内核线程上。) C5 H* a' b0 R
0 b* d4 X/ i1 S8 v) K4 y3 b6 w
一个进程的自述 4-进程.jpg
& V+ m: W/ H) L6 E
        问题基本解决了,但也带来了新的问题,我们的系统也变的越来越复杂,尤其是进程之间的通信和线程之间的同步,会那些程序员们带来无穷无尽的烦恼,这是后话了,有机会下次再说吧。
  G  Q+ {2 Q1 Y( o, F$ i# E) l2 g$ J
上一篇
下一篇

评分

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

查看全部评分


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

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

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

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

你们有见过这么整齐的十五个字吗2 d- Q8 p& Q' C" s: p3 o
这么整齐的十五个字人家最喜欢了
9 D, ~. W; b# x4 [, s他们都说打出十五字才是最标准的; R- s+ k' t0 K: f( Y. [
我也没办法因为我要打十五个字啊
- @* b1 V+ I' {! r* j5 |( A我说了多少次了不要只打十五个字
& V- p' z6 r. K2 t' @, H) k4 Y* F你们那些十五字神马的完全弱爆了
7 W7 k5 k" F2 k, k  Y都怪吧主删我贴所以我只能到处逛
+ D! J4 ]  r- ^# a为了经验我没办法只能遇贴就灌水$ _* [' c. N- _
灌水也要讲技术保证句句是十五字
/ e* p! H1 L; v* u6 P( Y如今发帖有困难整不好就被删贴了
8 ^% R/ }: u% x. J3 O我也没办法吧主他老是删我帖子啊) S! s/ a9 S, b8 L! {' w9 L
只能够这样用十五字来混混经验了
% G8 T8 V/ ^/ N0 Q; @用十五字混经验的有谁比我厉害呢- ^, i# E/ H5 N# Y* P8 `
有前排就要占没前排也要灌一下水1 x' Y* Z9 \/ Z1 R
有前排不占或者不灌水是会后悔的
. F/ S1 {0 A. f$ c3 }无论是多么无聊的帖子我都会去的
: e2 H: r, [5 B6 h# J4 `* m9 m因为为了一句话万一这贴子火了呢) y# [* N$ ^) N/ y" P) H
句句十五个字有哪个高手能超越呢0 h1 I! X; V+ P6 @6 A8 Q
#367:
深海里的那抹蓝 「龙战于野」 2018-1-20 23:45 来自手机 |显示全部楼层

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

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

本版积分规则

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

GMT+8, 2021-4-11 09:44 , Processed in 0.034651 second(s), 22 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表