4.进程对程序运行过程的描述
程序的运行是一个动态的过程,我们人类对动态过程的描述都是通过采样的方法来实现的。所谓采样,就是获取一些离散的样本,然后连续播放以描述动态的过程。
为了对进程从产生到消亡的这个动态变化的过程进行捕获和描述,就需要定义进程各种状态并制定相应的状态转换策略,从而实现对进程的控制。在操作系统理论中,引入了三种状态用于概括程序的行为。这三种状态是:
运行态: 进程占有CPU,并在CPU上运行
5.Linux中的进程状态及转换
Linux中引入了四类六种进程状态:
就绪态(TASK_RUNNING):正在运行或准备运行。
睡眠态
Linux设计中,考虑到任一时刻在一个CPU上运行的进程最多只有一个,而准备运行的进程可能有若干,为了管理上的方便,把就绪态和运行态合并为一个状态叫“就绪态”,把所有就绪态进程放进一个队列中,调度程序从这个队列中选中一个进程投入运行。
等待态根据被唤醒条件划分为三种:
浅度睡眠的进程在等待的资源有效时会被唤醒,也可以被信号或时钟中断唤醒;
深度睡眠的进程只有在等待的资源有效时会被唤醒;
致命状态类似于深度睡眠,但可以响应一些致命信号,该状态在Linux2.6.25版本内核中被引入。
向进程发送一个SIGSTOP信号,它就会因响应该信号而进入暂停状态(TASK_STOPPED)(除非该进程本身处于TASK_UNINTERRUPTIBLE状态而不响应信号)。(SIGSTOP与SIGKILL信号一样,是非常强制的。不允许用户进程通过signal系列的系统调用重新设置对应的信号处理函数。)
向进程发送一个SIGCONT信号,可以让其从TASK_STOPPED状态恢复到TASK_RUNNING状态。
当进程正在被跟踪时,它处于TASK_TRACED这个特殊的状态。“正在被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。比如在gdb中对被跟踪的进程下一个断点,进程在断点处停下来的时候就处于TASK_TRACED状态。而在其他时候,被跟踪的进程还是处于前面提到的那些状态。
对于进程本身来说,TASK_STOPPED和TASK_TRACED状态很类似,都是表示进程暂停下来。
而TASK_TRACED状态相当于在TASK_STOPPED之上多了一层保护,处于TASK_TRACED状态的进程不能响应SIGCONT信号而被唤醒。只能等到调试进程通过ptrace系统调用执行PTRACE_CONT、PTRACE_DETACH等操作(通过ptrace系统调用的参数指定操作),或调试进程退出,被调试的进程才能恢复TASK_RUNNING状态。
僵死状态:进程执行结束且释放了大部分资源(几乎所有的内存空间,没有任何可执行代码),也不能被调度,但尚未释放其PCB。而僵死进程的PCB中保存着对程序员和系统管理员非常重要的很多信息:进程如何死亡?这个进程占用的总系统CPU时间和总用户CPU时间分别是多少?发生缺页中断的次数和收到信号的数目又是多少?