当前位置:   article > 正文

进程控制块PCB结构 task_struct 描述_进程控制块和任务状态段

进程控制块和任务状态段

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早,分析的版本为2.4.16,故出现的一些概念可能跟最新版本内核不同。

此书已经开源,阅读地址 http://www.kerneltravel.net


一、task_struct 结构描述

1.进程状态(State)

进程执行时,它会根据具体情况改变状态。进程状态是调度和对换的依据。Linux 中的 进程主要有如下状态,如表4.1 所示。

(1)可运行状态
处于这种状态的进程,要么正在运行、要么正准备运行。正在运行的进程就是当前进程 (由 current 宏  所指向的进程),而准备运行的进程只要得到CPU 就可以立即投入运行,CPU 是 这些进程唯一等待的系统资源。系统中有一个运行队列(run_queue),用来容纳所有处于可 运行状态的进程,调度程序执行时,从中选择一个进程投入运行。 当前运行进程一直处于该队列中,也就是说,current 总是指向运行队列中的某个元素,只是具体指向谁由调度程序决定。

(2)等待状态
处于该状态的进程正在等待某个事件(Event)或某个资源,它肯定位于系统中的某个 等待队列(wait_queue)中。Linux 中处于等待状态的进程分为两种:可中断的等待状态和 不可中断的等待状态。处于可中断等待态的进程可以被信号唤醒,如果收到信号,该进程就 从等待状态进入可运行状态,并且加入到运行队列中,等待被调度;而处于不可中断等待态 的进程是因为硬件环境不能满足而等待,例如等待特定的系统资源,它任何情况下都不能被 打断,只能用特定的方式来唤醒它,例如唤醒函数wake_up()等。

(3)暂停状态
此时的进程暂时停止运行来接受某种特殊处理。通常当进程接收到SIGSTOP、SIGTSTP、 SIGTTIN 或 SIGTTOU 信号后就处于这种状态。例如,正接受调试的进程就处于这种状态。

(4)僵死状态
进程虽然已经终止,但由于某种原因,父进程还没有执行wait()系统调用,终止进程的 信息也还没有回收。顾名思义,处于该状态的进程就是死进程,这种进程实际上是系统中的 垃圾,必须进行相应处理以释放其占用的资源。

A child that terminates, but has not been waited for becomes a "zombie".  The kernel maintains a 

minimal set of information  about the  zombie  process (PID, termination status, resource usage 

information) in order to allow the parent to later perform a wait to obtain information about the 

child.  As long as a zombie is not removed from the system via a wait, it will consume a slot in  

the kernel  process  table,  and if this table fills, it will not be possible to create further 

processes.  If a parent process terminates, then its "zombie" 
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/333923
推荐阅读
  

闽ICP备14008679号