|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
进程管理是操作系统重点、难点问题,也是贯穿Linux学习的知识点。那么什么是进程?- 为什么引入进程的概念?
6 o0 `! e. A* `2 L# ^ 从理论角度看,是对正在运行的程序过程的抽象;
, {% C. U+ @% K; w# o8 D 从实现角度看,是一种数据结构,目的在于清晰地刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。
" G# E1 x8 Q9 K7 z - 什么是进程?5 B2 W8 X: f) \: ] B( x
狭义定义:进程就是一段程序的执行过程。
( p! E* r! [5 Y3 W6 H. G4 t 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
' Q8 C' ?4 c6 Q! n* Z+ I - 进程有怎么样的特征?
% D5 T6 j: Y8 z4 i动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。 M4 o. r( q7 R- u0 E. ?
并发性:任何进程都可以同其他进程一起并发执行# H0 Q& a# ~6 g9 G- G4 f/ V' f
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;' d; Q+ p3 h% K; k7 H% o
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推 进
& Z8 e- c6 J5 U; y) {结构特征:进程由程序、数据和进程控制块三部分组成;
( Y2 R% U* z' q7 H$ s6 F多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果; 但是执行过程中,程序不能发生改变。# o! q1 Y' X. m; M& J
- Linux进程结构?
6 {" _/ i( f* F: L% N- Z Linux进程结构:可由三部分组成:代码段、数据段、堆栈段。也就是程序、数据、进程控制块PCB(Process Control Block)组成。进程控制块是进程存在的惟一标识,系统通过PCB的存在而感知进程的存在。
3 `5 n3 M5 z0 ~0 ]$ a) } 系统通过PCB对进程进行管理和调度。PCB包括创建进程、执行程序、退出进程以及改变进程的优先级等。而进程中的PCB用一个名为task_struct的结构体来表示,定义在include/linux/sched.h中,每当创建一新进程时,便在内存中申请一个空的task_struct结构,填入所需信息,同时,指向该结构的指针也被加入到task数组中,所有进程控制块都存储在task[]数组中。. D- Q& k I/ w
- 进程的三种基本状态?
, d5 `( i) W8 N: u1 z a> 就绪状态:进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。6 n/ ?0 X% x, l1 R7 v
b> 运行状态:进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以 执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
7 {' k- N/ c' s' W) S7 W c> 阻塞状态:由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生 前即使把处理机分配给该进程,也无法运行。
3 L1 a/ ~! |) j& V - 进程和程序的区别?
7 e. D# D8 T. l& O/ @! K a> 程序是指令和数据的有序集合,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个 动态的概念。" r+ V, c. s9 A' }3 e- W) r+ m! ?
b> 程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。
$ ]6 `: j$ `- q- ?0 n c> 进程是由进程控制块、程序段、数据段三部分组成;7 j# z- R: k- g' j/ S l
d> 进程具有创建其他进程的功能,而程序没有。
1 Y7 U. ~# e& I5 }+ _+ |0 n e> 同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程,也就是说同一程序可以对应多个进 程。" c- \( \) R3 F2 K; R0 I- t
f> 在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单元都是进程。8 l% ], ^. s4 o7 k+ Y
- 进程控制?+ A( e4 X3 h- \5 e: e
创建进程' X& B, h- W/ {7 Z3 Z3 Y, {/ Z- I
引起创建进程的事件:: p- r1 ]5 T. n5 J7 ?& M' X
1) 用户登录
! D1 p& d3 L" b& v+ w' W2) 作业调度$ l+ O/ u+ ]2 t, X# y
3) 提供服务4 ~1 z1 E# o# h- v! i' d& n. W
4) 应用请求
! ]7 n8 X# f7 a0 M9 o进程的创建过程
- [3 a! b! \; D3 p" ?2 E* U一旦操作系统发现了要求创建新进程的事件后,便调用进程创建原语Creat()按下述步骤创建一个新 进程。
1 w6 U6 s4 ?! m7 {5 d1 `! e1) 申请空白PCB。为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。9 g- ^- m6 N# I+ ^8 W; O8 I) L
2) 为新进程分配资源。) c9 z4 B B% P' O; b& U) @3 G
3) 初始化进程控制块。PCB的初始化包括:
3 n5 M# p0 }1 ~* f; ^①初始化标识信息,将系统分配的标识符和父进程标识符,填入新的PCB中。3 Q# x r9 G* }* G. E* Y8 l/ Z
②初始化处理机状态信息,使程序计数器指向程序的入口地址,使栈指针指向栈顶。
+ J8 m) o1 {1 ^4 Z③初始化处理机控制信息,将进程的状态设置为就绪状态或静止就绪状态,对于优先级,通常 是将它设置为最低优先级,除非用户以显式的方式提出高优先级要求。, A+ H {+ ^4 L7 B: m. s
4) 将新进程插入就绪队列,如果进程就绪队列能够接纳新进程,便将新进程插入到就绪队列中* B. h# l! A: z$ q, z3 V# g9 V
进程终止
" k$ M* K0 H+ Q6 f/ m8 o引起进程终止的事件
( q7 x5 O6 l r0 n0 U) l' S" [1)正常结束/ i" p$ |3 P; \
2)异常结束
/ h- A: Q/ o* w! N, _& n, C3)外界干预
. b& t1 R$ n; H0 m2 M进程的终止过程/ N( _+ f- |# i
如果系统发生了上述要求终止进程的某事件后,OS便调用进程终止原语,按下述过程去终止指定的进 程。. E4 r* f* h3 Q+ V' _& B# {
1)根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程状态。
3 c9 q1 V) c S; \2)若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真。用于指示该进程 被终止后应重新进行调度。* ]1 Z9 ] o O
3)若该进程还有子孙进程,还应将其所有子孙进程予以终止,以防他们成为不可控的进程。
1 T) W7 r8 r4 U/ U* b% e0 {4)将被终止的进程所拥有的全部资源,或者归还给其父进程,或者归还给系统。# B' y C0 r6 l1 R9 U
5)将被终止进程(它的PCB)从所在队列(或链表)中移出,等待其它程序来搜集信息。
3 B+ t) v) K. g% j; d" @! A, ]阻塞唤醒
: ~2 k+ _! t- k( T$ o1.引起进程阻塞和唤醒的事件/ ^/ V) Q* K5 o2 C+ |
1)请求系统服务
( T( v6 e; l8 G4 I3 @+ p7 r+ D2)启动某种操作1 e( ^) X1 G6 y5 K. d/ ]
3)新数据尚未到达+ d5 k. I% m& V" V$ o! j; d
4)无新工作可做
( v- E" w: K v2 Y& z4 V2.进程阻塞过程( y9 i% ]. U4 Y) u/ l" |
正在执行的进程,当发现上述某事件后,由于无法继续执行,于是进程便通过调用阻塞原语block把自 己阻塞。可见,进程的阻塞是进程自身的一种主动行为。进入block过程后,由于此时该进程还处于执 行状态,所以应先立即停止执行,把进程控制块中的现行状态由执行改为阻塞,并将PCB插入阻塞队 列。如果系统中设置了因不同事件而阻塞的多个阻塞队列,则应将本进程插入到具有相同事件的阻塞 (等待)队列。最后,转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换,亦即, 保留被阻塞进程的处理机状态(在PCB中),再按新进程的PCB中的处理机状态设置CPU环境。, s3 Q; a X0 k, x+ u& e) L5 z. i
3.进程唤醒过程
) U1 b: O' {; v/ T4 K4 a( ]当被阻塞的进程所期待的事件出现时,如I/O完成或者其所期待的数据已经到达,则由有关进程(比如, 用完并释放了该I/O设备的进程)调用唤醒原语wakeup(),将等待该事件的进程唤醒。唤醒原语执行 的过程是:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就 绪,然后再将该PCB插入到就绪队列中。
; ~3 G6 ~( @0 S/ v% ~4 S8 ]1 I 5 J% C: ?0 R, [8 r4 `+ y- K
|
|