|
zdjpnwusi3u64012786252.gif
4 P+ u& t$ v" a3 i; S. f
点击上方蓝色字体,关注我们' h9 `1 k. ]5 ^. h
( t$ ?; {% A8 Y9 F! ^' r I% @
在 Linux 系统中,进程状态及其转换关系是进程调度和管理的核心。我们可以将这些状态视作进程在其生命周期中所处的不同阶段。" v) o3 \0 o, j
4 D3 o3 y* B Z: \, J
ykyaecwsze564012786352.png
7 Y* N! T, K4 W8 Q% ]( X/ A
进程各状态之间的切换0 m$ T+ k" Z2 y
- d. r6 a& E) L) C& F
1、就绪态(Ready)" S1 G$ [2 ^: C6 l
( {1 f# q7 k, @$ P4 e1 V* t就绪态表示进程已经具备执行的条件,所有资源都已准备好,但由于 CPU 正在忙于执行其他任务,进程暂时没有获得执行权。* e: h8 B7 x/ T) U# i4 c
, u. t3 z1 D; Z/ |" S就绪态是动态的,当 CPU 变得空闲时,调度器会从就绪态链表中选择一个进程进行执行。) x8 s- G+ {# R5 H+ G
4 \* g4 @ r) p, u9 E' d5 k: R转换关系:6 h2 _4 e5 F- K4 _6 d9 a
从创建态进入就绪态:进程在创建时进入就绪态,等待被调度。从运行态回到就绪态:当进程的时间片耗尽或 CPU 被其他更高优先级的进程抢占,进程会回到就绪态,等待下次调度。4 Z( _7 E7 q8 A- [
4 m& J4 m# Q2 z9 n u' G7 U
2、运行态(Running)* u, S8 P6 q f' G
运行态表示进程正在被 CPU 执行。CPU 将按照调度算法分配给该进程时间片,允许其在有限时间内执行。1 _ ~( o# G/ v7 P) V
( f* _8 |+ i/ B* d! u转换关系:5 c/ Y2 g m0 `8 Y+ Q& A5 Y
从就绪态进入运行态:当调度器选中某个进程并为其分配 CPU 时,进程进入运行态。从运行态转换到其他状态:
! d# E2 G L6 z! N4 }2 k* V如果进程时间片耗尽,会返回到就绪态。如果进程需要等待某种资源或事件,会进入睡眠态(等待态)。进程也可以通过收到信号进入暂停态。$ P4 @! M1 w$ z @. S& H
9 C; z! }* n5 p
3、僵尸态(Zombie)
+ T# ^2 K( N- G( C, S5 o' R$ n) M/ M僵尸态进程(Zombie Process)是指进程已完成执行,但其父进程尚未通过 wait() 或 waitpid() 系统调用获取其退出状态并清理资源。
K7 B4 V2 y; w K+ K' f; P3 t. z3 Q" v, o+ R+ I; c2 D
因此,进程仍然保留着一个条目以供父进程读取其退出状态。9 a8 U( V; H( h, H, a. k
$ ?) t) Z" E" H) d1 d0 X4 m
僵尸态进程不会消耗任何 CPU 资源,但其进程表项仍占用系统资源。( h8 K X, M4 o6 c/ d2 p
7 X1 K4 t# r* h- t9 P$ F2 ^4 h5 M, C, j
转换关系:! `, u: m) Y4 g2 K# M# W7 |
从运行态进入僵尸态:当进程执行完毕并调用 exit() 结束运行后,进入僵尸态,等待父进程回收其资源。从僵尸态到消失:一旦父进程读取子进程的退出状态,系统会删除僵尸进程条目,释放其占用的资源。" M, Z, o; ~0 A6 y
% H9 ~6 d+ U$ W$ f4、可中断睡眠态(Interruptible Sleep)
/ a6 o t8 k' r& V可中断睡眠态是进程正在等待某一事件的发生,例如等待 I/O 操作完成。
3 L& H0 x# `0 D8 G; d: _( l8 o* S
) v& s, X1 @" x# `$ `此时进程处于睡眠状态,可以通过信号唤醒。9 j, b q; G0 W+ [! y! N
9 \$ J( Z S- W! `- r- S3 ]
转换关系:
/ L3 ^+ a! W$ y0 ]1 G! V从运行态进入可中断睡眠态:进程调用某些阻塞型系统调用(如 read() 等)等待某种外部事件时进入此状态。从可中断睡眠态进入就绪态:当外部事件(如 I/O 完成或信号触发)发生时,进程被唤醒,进入就绪态。
6 y& L, a* q4 h5 n4 _
* M% N2 u* z0 `7 I( U6 T* F8 S5、不可中断睡眠态(Uninterruptible Sleep)% ~2 J. v+ q D# ]9 v( H. ^
不可中断睡眠态是进程等待某种无法通过信号唤醒的资源。
! p6 m! R% n5 V& S8 \5 y+ c8 {+ y( G$ v* I6 y
例如,等待硬件操作完成时,进程会进入此状态。此时进程不会响应任何信号,直到所等待的事件发生。2 `' R2 h+ D3 f
8 @7 o- {$ }, S4 A' K) J转换关系:' B; V+ v, L( c
从运行态进入不可中断睡眠态:进程等待特定资源(如硬件 I/O)时进入此状态。从不可中断睡眠态进入就绪态:
* I' K! N0 ?. k当等待的资源可用时,进程会从不可中断睡眠态醒来,重新进入就绪态。; _! t8 Z- ^/ v. l" s9 C7 j
% F6 _- C o7 ~8 E- G. R6、暂停态(Stopped)- b# N- p( f) A8 {, A
暂停态是进程被暂停运行的状态,通常由接收到 SIGSTOP 信号导致。
- r9 n+ C9 t2 p1 y8 N& Z) \9 L' K7 F0 \3 ^/ b
进程停止运行但没有终止,所有的上下文信息都会被保留。
: t2 f9 ^5 r4 l! x* V* S3 w+ ^3 L% V8 a# @2 ^
转换关系:+ T. P9 m% `+ B" H, d
从运行态或就绪态进入暂停态:进程接收到 SIGSTOP 信号后会进入暂停态,暂停其执行。从暂停态回到就绪态:当进程接收到 SIGCONT 信号时,进程恢复执行并进入就绪态,等待 CPU 调度。# i9 e8 {& X/ y1 m
! A* b# q0 M& v; `; _Linux 进程的状态变化主要受 CPU 调度、系统调用、信号机制以及资源可用性等因素的影响。
/ ?3 E; o' }' m( M$ F. I, a8 o. r* ?2 Z
掌握进程状态的转换不仅有助于理解 Linux 的调度机制,也能有效帮助调试与优化系统中的进程行为。8 W% C1 C! i, ?6 n# A; v
zp0lb15juaa64012786452.jpg
/ t# [1 X P* v% r
5 Y T! p% _2 {: \) B: L
yogi2f0otvd64012786552.gif
/ o# y4 w) [8 R, Y' C. F# j! ~点击阅读原文,更精彩~ |
|