进程的几种状态和解释

进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。

进程状态:一个进程的生命周期可以划分为一组状态,这些状态刻画了整个进程。进程状态即体现一个进程的生命状态。

进程状态:

一般来说,进程有三个状态,即就绪状态,运行状态,阻塞状态。

运行态:进程占用CPU,并在CPU上运行;
       就绪态:进程已经具备运行条件,但是CPU还没有分配过来;
       阻塞态:进程因等待某件事发生而暂时不能运行;
下面是3种状态转换图:

当然理论上上述三种状态之间转换分为六种情况;

       运行——>就绪:1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态。

       就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU

      运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求

      阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列

      以下两种状态是不可能发生的:

        阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取

       就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态。

在一些系统中,又增加了一些新状态,如挂起状态,可运行状态,深度睡眠状态,浅度睡眠状态,暂停状态,僵死状态。

可运行状态:运行状态和就绪状态的合并,表示进程正在运行或准备运行,Linux 中使用TASK_RUNNING 宏表示可运行状态。

      浅度睡眠状态:进程正在睡眠(被阻塞),等待资源的到来是唤醒,也可以通过其他进程信号或时钟中断唤醒,进入运行队列。Linux 中使用TASK_INTERRUPTIBLE 宏表示此状态。

      深度睡眠状态:其和浅度睡眠基本类似,但不可被其他进程信号或时钟中断唤醒。Linux 中使用TASK_UNINTERRUPTIBLE 宏表示此状态。

      暂停状态:进程暂停执行接受某种处理。Linux 使用TASK_STOPPED 宏表示此状态。

      僵死状态:进程已经结束但未释放进程控制块(PCB),Linux 使用TASK_ZOMBIE 宏表示此状态。

挂起状态:在执行状态的进程通过挂起即可进入就绪状态,如图所示,就绪状态和阻塞状态都分为活动态和静止态。由活动态向静止态转换就是通过挂起实现的。

引入挂起状态的原因有:

(1) 终端用户的请求。当终端用户在自己的程序运行期间发现有可疑问题时,希望暂时使自己的程序静止下来。亦即,使正在执行的进程暂停执行;若此时用户进程正处于就绪状态而未执行,则该进程暂不接受调度,以便用户研究其执行情况或对程序进行修改。我们把这种静止状态称为挂起状态。 

(2) 父进程请求。有时父进程希望挂起自己的某个子进程,以便考查和修改该子进程,或者协调各子进程间的活动。

(3) 负荷调节的需要。当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行。

(4) 操作系统的需要。操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账。

Linux进程有多种运行状态,具体如下: 1. **运行态(R)**:处于可执行态的进程就绪运行态之间轮回。就绪态的进程一旦被调度程序选中,就进入运行态。等待时间片耗尽之后,退出CPU,转入就绪态等待下一次的调度。处于此轮回的进程运行就绪之间不断快速切换[^2]。 2. **睡眠态(S)**:处于运行态的进程,有时需要等待某个事件或某种资源的发生,此时已无法占有CPU继续工作,于是退出CPU,转入睡眠态。当等待的事件发生后,进程被唤醒,进入就绪态。睡眠态又可分为可中断睡眠态不可中断睡眠态(D 状态),正是因为得不到IO的响应,进程才进入了uninterruptible sleep状态(D 状态),要想使进程从该状态恢复,就得使进程等待的IO恢复,比如如果是因为从远程挂载的NFS卷不可访问导致进程进入uninterruptible sleep状态的,那么可以通过恢复该NFS卷的连接来使进程的IO请求得到满足,除此之外,要想干掉处在D状态进程就只能重启整个Linux系统(D进程并不能通过kill kill -9 杀掉)[^2][^4]。 3. **暂停态(T)**:运行态、暂停态就绪态构成一个回路。当处于运行态的进程接受到暂停执行信号时,它放弃CPU,进入暂停态,当暂停的进程获得恢复执行信号时,就转入就绪态[^2]。 4. **深度睡眠状态(D)**:即不可中断睡眠态,与普通睡眠态不同,处于此状态进程不响应异步信号,只能通过等待的资源可用或者系统重启来恢复[^4]。 5. **僵尸状态(Z)**:处于运行态的进程调用退出函数exit后,进入僵死态。父进程对该进程进行处理后,撤销其PCB。此时,这个进程就完成了它的使命,从僵死态走向消失[^2]。 6. **孤儿进程**:当一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程进程号为1)收养,并由init进程对它们完成状态收集工作。虽然引用中未对其进行详细状态定义,但它也是进程在特殊情况下的一种状态情况。 ```python # 示例代码,用于简单模拟进程状态变化(仅为示意,非真实进程状态控制) import time # 模拟进程进入运行态 def running_state(): print("Process is in running state") time.sleep(2) # 模拟运行一段时间 # 模拟进程进入睡眠态 def sleep_state(): print("Process is in sleep state") time.sleep(3) # 模拟睡眠一段时间 # 模拟进程状态变化 running_state() sleep_state() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值