进程的状态
2016-04-15 13:06
183 查看
了对进程从产生到消亡的整个过程进行跟踪和描述,就需要定义各种进程的各种状态并制定相应的状态转换策略,以此来控制进程的运行。
不同的操作系统对进程的状态解释不同,但是最基本的状态都是一样的。包括一下三种:
运行态:进程占用CPU,并在CPU上运行;
就绪态:进程已经具备运行条件,但是CPU还没有分配过来;
阻塞态:进程因等待某件事发生而暂时不能运行;
进程在一生中,都处于上述3中状态之一。
下面是3种状态转换图
当然理论上上述三种状态之间转换分为六种情况;
运行---》就绪:这是有调度引起的,主要是进程占用CPU的时间过长
就绪---》运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
运行---》阻塞:发生了I/O请求或等待某件事的发生
阻塞---》就绪:进程所等待的事件发生,就进入就绪队列
以上4种情况可以相互正常转换,不是还有两种情况吗?
阻塞--》运行:即使给阻塞进程分配CPU,也无法执行,操作系统載进行调度时不会載阻塞队列进行挑选,其调度的选择对象为就绪队列:
就绪--》阻塞:因为就绪态根本就没有执行,何来进入阻塞态?
现在知道了进程的三种基本状态,但是載操作系统具体现实中,设计者可以根据实际情况设置不同的状态,这样以来,就出现了以下几种状态:
可运行态:他是运行态和就绪态的合并,表示进程正在运行或准备运行,Linux 中使用TASK_RUNNING 宏表示此状态。
浅度睡眠态:进程正在睡眠(被阻塞),等待资源到来是唤醒,也可以通过其他进程信号或时钟中断唤醒,进入运行队列。Linux 使用TASK_INTERRUPTIBLE 宏表示此状态。
深度睡眠态:其和浅度睡眠基本类似,但有一点就是不可其他进程信号或时钟中断唤醒。Linux
使用TASK_UNINTERRUPTIBLE 宏表示此状态。
暂停状态:进程暂停执行接受某种处理。如正在接受调试的进程处于这种状态,Linux 使用TASK_STOPPED 宏表示此状态。
僵死状态:进程已经结束但未释放PCB,Linux 使用TASK_ZOMBIE 宏表示此状态。
我们可以来看下以上宏在内核中的定义:
#define TASK_RUNNING 0
183 #define TASK_INTERRUPTIBLE 1
184 #define TASK_UNINTERRUPTIBLE 2
185 #define __TASK_STOPPED 4
186 #define __TASK_TRACED 8
187 /* in tsk->exit_state */进程的退出状态
188 #define EXIT_ZOMBIE 16
189 #define EXIT_DEAD 32
190 /* in tsk->state again */我理解为进程的唤醒状态
191 #define TASK_DEAD 64
192 #define TASK_WAKEKILL 128
193 #define TASK_WAKING 256
194 #define TASK_STATE_MAX 512
195
196 #define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW"
以下是LINUX进程间状态转换和内核调用图解
不同的操作系统对进程的状态解释不同,但是最基本的状态都是一样的。包括一下三种:
运行态:进程占用CPU,并在CPU上运行;
就绪态:进程已经具备运行条件,但是CPU还没有分配过来;
阻塞态:进程因等待某件事发生而暂时不能运行;
进程在一生中,都处于上述3中状态之一。
下面是3种状态转换图
当然理论上上述三种状态之间转换分为六种情况;
运行---》就绪:这是有调度引起的,主要是进程占用CPU的时间过长
就绪---》运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
运行---》阻塞:发生了I/O请求或等待某件事的发生
阻塞---》就绪:进程所等待的事件发生,就进入就绪队列
以上4种情况可以相互正常转换,不是还有两种情况吗?
阻塞--》运行:即使给阻塞进程分配CPU,也无法执行,操作系统載进行调度时不会載阻塞队列进行挑选,其调度的选择对象为就绪队列:
就绪--》阻塞:因为就绪态根本就没有执行,何来进入阻塞态?
现在知道了进程的三种基本状态,但是載操作系统具体现实中,设计者可以根据实际情况设置不同的状态,这样以来,就出现了以下几种状态:
可运行态:他是运行态和就绪态的合并,表示进程正在运行或准备运行,Linux 中使用TASK_RUNNING 宏表示此状态。
浅度睡眠态:进程正在睡眠(被阻塞),等待资源到来是唤醒,也可以通过其他进程信号或时钟中断唤醒,进入运行队列。Linux 使用TASK_INTERRUPTIBLE 宏表示此状态。
深度睡眠态:其和浅度睡眠基本类似,但有一点就是不可其他进程信号或时钟中断唤醒。Linux
使用TASK_UNINTERRUPTIBLE 宏表示此状态。
暂停状态:进程暂停执行接受某种处理。如正在接受调试的进程处于这种状态,Linux 使用TASK_STOPPED 宏表示此状态。
僵死状态:进程已经结束但未释放PCB,Linux 使用TASK_ZOMBIE 宏表示此状态。
我们可以来看下以上宏在内核中的定义:
#define TASK_RUNNING 0
183 #define TASK_INTERRUPTIBLE 1
184 #define TASK_UNINTERRUPTIBLE 2
185 #define __TASK_STOPPED 4
186 #define __TASK_TRACED 8
187 /* in tsk->exit_state */进程的退出状态
188 #define EXIT_ZOMBIE 16
189 #define EXIT_DEAD 32
190 /* in tsk->state again */我理解为进程的唤醒状态
191 #define TASK_DEAD 64
192 #define TASK_WAKEKILL 128
193 #define TASK_WAKING 256
194 #define TASK_STATE_MAX 512
195
196 #define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW"
以下是LINUX进程间状态转换和内核调用图解
相关文章推荐
- 基于局部均方差相关信息的图像去噪及其在实时磨皮美容算法中的应用。
- 【Qt】按钮键
- getelementbyid属性与用法
- 【NodeJs】使用TCP套接字收发数据的简单实例
- Android中Bitmap,byte[],Drawable相互转化
- sql中date数据处理
- HTTP方法 谓词 及在nginx中如何关闭(limit_except) 【转】
- FZU 2093 找兔子 状压DP
- ArrayList vs LinkedList vs Vector 区别
- 基于jquery的tabsUI实现思路
- (1)spring boot起步之Hello World【从零开始学Spring Boot】
- ubuntu命令记录
- drupal7网站定制主题中使用定制jquery脚本
- Linux内核分析8:理解进程调度时机、进程调度、进程切换
- 【leetcode】169. Majority Element
- HTTP方法 谓词 及在nginx中如何关闭(limit_except) 【转】
- Linux中查看系统资源占用情况的命令【转载】
- iOS crash dSYM
- Java中final、static
- linux下sed基本用法详解