Linux进程的概念笔记

上周,我那个朋友给我解释了Linux进程的概念。
进程就是应用程序的一次执行过程,就像你打开一个软件,它就在电脑上变成一个进程。

进程有三种状态,就像人一样,有时候在干活(运行状态),有时候等着轮到自己干活(就绪状态),有时候因为某些原因干不了活(阻塞状态)。

程序和进程可不一样,程序是静态的,就像一本菜谱,进程是动态的,就像你按照菜谱做菜的过程。

进程管理很重要,就像一个管家,负责分配资源(CPU、内存),调度任务,保证系统稳定运行。

2 02 3 年,我发现进程管理就像一个复杂的游戏,需要操作系统这个游戏规则制定者,合理分配资源,调度进程,才能让整个游戏(系统)玩得顺畅。
你看着办,我有点困了,算了。

进程的状态

说白了,进程状态就两种核心逻辑:要么在抢资源,要么在等资源。
Linux多了几个特殊状态,但本质都围绕这两条线。

先说最重要的,就绪态和执行态的切换是操作系统调度的心脏。
去年我们跑的那个项目里,单核CPU上同时有5 个进程就绪时,调度器每5 0ms轮询一次,直接把CPU利用率拉到9 8 %。
另外一点,不可中断休眠态(D状态)特别致命,去年某次磁盘IO风暴里,几个进程卡在D状态,导致整个系统响应变慢3 000ms以上——用行话说叫雪崩效应,其实就是前面一个小延迟把后面全拖垮了。

还有个细节挺关键的,僵尸态(Z状态)是父进程的bug收尸场。
我们之前有个脚本子进程退出后,父进程忘了用wait(),结果1 小时内系统表里多了2 00个Z状态进程,占满了内核的PCB缓存。
说实话挺坑的,但有个招儿:在bash里用disown -h子进程PID,能强制回收。

我一开始也以为僵死进程会无限期耗内存,后来发现Linux会自动超时释放,但那个超时时间默认是3 0分钟——等等,还有个事,孤儿进程被init领养后,新父进程也能用waitpid()抢到退出码,这点很多人没注意。

建议:写脚本处理子进程时,顺手加个wait()或者trap 'wait',省得以后踩坑。

当进程状态值state为1026时表示什么?

你好!进程的三种基本状态:
就绪(Ready)状态: 当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。

执行(Running)状态: 当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。

阻塞(Blocked)状态: 正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。
引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

进程三种状态间的转换:
(1 ) 就绪→执行: 处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。

(2 ) 执行→就绪: 处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。

(3 ) 执行→阻塞: 正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。

(4 ) 阻塞→就绪: 处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。

进程运行状态: 一个进程在其生存期内,可处于一组不同的状态下,称为进程状态,如下图所示。
进程状态保存在进程任务结构的state字段中。
当进程正在等待系统中的资源而处于等待状态时,则称其处于睡眠等待状态。
在Linux系统中,睡眠等待状态分为可中断的和不可中断的等待状态。