剖析Linux中进程的六种状态

Linux进程六状态:运行、睡眠、磁盘休眠、停止、僵尸、死亡。

运行:CPU执行中或排队等待。
睡眠:等待事件,可被中断。
磁盘休眠:等待IO,不可中断。
停止:SIGSTOP暂停,SIGCONT恢复。
僵尸:子进程退出,父未读取状态。
死亡:父读取状态后,资源立即释放。

孤儿进程不是基本状态。
父进程终止,子进程由init收养。

Linux内核:进程管理——进程状态转换

2 02 2 年那会儿,我研究Linux内核的进程管理,一开始就被这三种状态模型绕晕了。
三态模型,那个简单,就运行、就绪、等待,运行的是运行态,就绪的是等着CPU的,等待的嘛,就是等着啥资源。
我当时也懵,想不明白这三种状态怎么就能管理整个进程的生命周期呢。

后来啊,我再仔细看,三态模型基础上来了个五态模型,多了新建态和终止态。
新建态就是进程刚创建,还没准备好执行;终止态就是进程结束了,要么正常要么不正常。
我当时想,这五态模型,看起来比三态复杂多了,但是全面啊。

再往后,又来了个七态模型,这模型是给内存紧张的时候准备的。
多了两个状态,挂起就绪态和挂起等待态,就是进程被暂停了,要么是因为内存不够,要么是因为要调试或者协调。

当时我还挺感慨的,这七态模型啊,真是复杂,但是想想也是,为了管理好内存,为了系统稳定,复杂一点也值得。

最后呢,我总结了几个关键点,比如说挂起进程是不参与调度的,只能等操作系统或者父进程来恢复;状态转换优先级,就是高优先级的进程可能会抢占内存。

至于应用场景,三态模型适合简单的系统,五态模型适合需要精细管理的系统,比如服务器;七态模型嘛,就是给内存受限的场景用的,比如嵌入式系统。
通过这些模型,Linux内核才能灵活地管理进程,优化资源分配,保证系统高效稳定地运行。
哎,说到底,技术这东西,还是得慢慢琢磨。

Linux之进程管理(ps命令)

哎哟,我之前在使用Linux系统管理服务器的时候,就特别头疼进程管理这块。
你想想,服务器上跑着那么多进程,你总得知道哪个在干啥,哪个占用了多少资源,不然出了问题你都不知道从哪儿下手。

记得有一次,2 01 8 年那会儿,我在北京负责一个电商网站的服务器运维。
那天晚上突然收到报警,说是服务器CPU使用率飙升,达到1 00%。
我赶紧打开终端,用ps命令一查,哎呀妈呀,好家伙,一个进程占了9 0%的CPU。

我一看,这货是后台运行的,而且是系统级别的进程,pid是1 ,是init进程。
我那时候还不太懂,就想着是不是系统出啥问题了。
后来查了查资料,才知道init进程是Linux系统启动的第一个进程,负责启动其他系统进程,它本身是不会占用太多资源的。

然后我又用ps命令的-aux选项,把所有进程都列出来,仔细一看,原来是个用户上传了一个大文件,导致上传进程一直在运行,CPU占用率就上去了。
我赶紧把上传任务取消了,CPU使用率很快就恢复正常了。

那会儿我还不太懂ps命令的各种参数,后来慢慢摸索,发现ps-ef这个参数组合特别有用,它能显示进程的父子关系,我一看,原来上传进程的父进程是httpd进程,就是Apache服务器。
这样我就知道问题出在哪里了,原来是Apache服务器处理上传请求的时候出了问题。

现在回想起来,那会儿真是踩了不少坑。
不过,通过这些经历,我也学到了不少东西。
现在用ps命令管理进程,对我来说已经是小菜一碟了。
哈哈,说起来,Linux系统管理这行当,还真是挺有意思的。

linux 进程的几种状态

结论: Linux内核进程状态:
TASK_RUNNING:就绪态,等待CPU资源,数值0。

TASK_INTERRUPTIBLE:可中断阻塞态,等待其他资源,数值1
TASK_UNINTERRUPTIBLE:不可中断阻塞态,等待其他资源,数值2
TASK_ZOMBIE:僵尸态,结束但控制块未注销,数值4
TASK_STOPPED:挂起态,调试用途,数值8