进程:
传统上,Linux操作系统下运行的应用程序,服务器和其他程序都称为进程。当然进程不仅仅表示一段处于执行期的可执行代码,还包括其他资源,例如打开的文件,挂起的信号和内核内部数据等。其实还有个概念叫,线程或者说轻量级进程,不过在Linux中线程和进程其实是类似的。可以把线程看做和其他进程共享某些数据和资源的进程。
进程的表示:
通常进程是由一个叫task_struct的结构表示的,或者叫进程描述符(process descriptor)。它包含了内核管理进程的所有信息。task_struct的很多成员并非简单的类型变量,而是指向其他数据结构的指针。其实task_struct中有很多成员,将进程和各个子系统连接起来。由于数量是在太庞大,想立刻搞清楚的话,那基本就在细节里彻底迷失自己啦。但是可以把它们分成很多部分,每个部分表示了进程的一个特定方面。下面就来看看它们吧。
1.状态和执行信息:进程ID(PID),到父进程及其他有关进程的指针等等。
2.有关已经分配的虚拟内存的信息。
3.进程身份凭据:用户ID,组ID和权限等等
4.使用的文件的信息
5.线程信息记录该进程特定于CPU的运行时间数据(没看懂是啥意思....)
6.进程间通信的有关信息
7.该进程所用的信号处理程序,用来响应到来的信号
其中进程标示符,即PID,是内核对进程的唯一标识。当有一个新的进程创建的时候,系统就会给它分配唯一的一个PID进行标示。
进程的状态:
在task_struct中的state域描述了进程当前的状态。每个进程必然处于下列的五种状态中的一种。
1.TASK_RUNNING:即进程正在执行或者在运行队列中等待执行
2.TASK_INTERRUPTIBLE:进程处于睡眠状态,正在等待某事件或资源,一旦收到内核发出的事件已发生的信号,状态即变为TASK_RUNNING
3.TASK_UNINTERRUPTIBLE:内核指示而停用的睡眠进程,不能被外部信号唤醒,只能由内核亲自唤醒
4.TASK_STOPPED:进程停止执行。如调试期间接收到任何信号都会使进程进入这种状态
5.TASK_TRACED:被其他进程跟踪的进程
还有一种所谓的僵尸状态,即EXIT_ZOMBIE。这种程序已经死亡了,因为它的资源,例如内存,和外设的连接等都已经被释放了,但是它们在进程表中仍然存在,所以它们并没有真正死亡,具体为啥嘛...以后再说
进程家族树:
在Linux中树形结构是普遍存在的,例如文件系统以及现在要说的进程。其中init进程是整个进程树的根,所有进程都直接或间接来自于该进程。而每个进程几乎都有自己的孩子进程和父进程。进程具体是怎么创建以及撤销的,那也是后面的事啦。总之进程树和文件树类似,init就是根目录,而一个进程创建子进程就相当于在一个目录下创建新的目录,撤销当然是类似的。
好啦,关于进程的最基本的知识差不多就是这些啦!更复杂的事情等到以后再说吧!
注:本篇文章的内容(包括以后的类似文章)主要参考Love的《Linux内核设计于实现》以及WolfganglMauerer的《深入Linux内核架构》。由于自己在阅读学习的过程中感觉各本书的侧重点以及深入程度都不一样,给初学者带来不小麻烦。所以在这里把自己所学的总结一下,尽量给出内核知识比较精简的知识结构,以便于更好的从宏观上把握,确保不会迷失于繁琐的细节。总的说来,主要是帮助自己梳理了知识,加深了理解吧。如果有帮助到大家,那是最令我开心的事情了!
Linux内核------进程的基本知识,布布扣,bubuko.com