进程是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源。
在Linux 中每一个进程都由task_ struct 数据结构来定义. task_ struct就是我们通常所说的PCB.她是对进程控制的唯一手段也是最有效的手段. 当我们调用fork() 时, 系统会为我们产生一个task_struct结构。然后从父进程,那里继承一些数据, 并把新的进程插入到进程树中, 以待进行进程管理。
因此了解task_struct的结构对于我们理解任务调度(在linux 中任务和进程是同一概念)的关键。
在我自己的linux下,该结构体位于如下目录:
如上图所示,我们有两种进程状态:
1.state //关于运行时候的状态
2.exit_state //退出状态
对应的状态就是图上#define定义的,下面我们来看看具体都有些什么含义?
TASK_RUNNING表示进程要么正在执行,要么正要准备执行。
TASK_ INTERRUPTIBLE表示进程被阻塞(睡眠),直到某个条件变为真。条件一旦达成,进程的状态就被设置为TASK_RUNNING。
TASK_ UNINTERRUPTIBLE的意义与TASK_INTERRUPTIBLE类似,除了不能通过接受一个信号来唤醒以外。
__ TASK _STOPPED表示进程被停止执行。
__ TASK _TRACED表示进程被debugger等进程监视。
EXIT_ZOMBIE表示进程的执行被终止,但是其父进程还没有使用wait()等系统调用来获知它的终止信息。
EXIT_DEAD表示进程的最终状态。
现在我们来正式看看task_struct的定义(很长,大约有300多行,这里只截图一小部分):
参考: