进程的状态与标识符

内核将所有进程存放在双向循环链表(进程链表)中,链表的节点都是task_struct,称为进程控制块的结构。该结构包含了与一个进程相关的所有信息,如进程的状态、进程的基本信息、进程标识符、内存相关信息、父进程相关信息、与进程相关的终端信息、当前工作目录、打开的文件信息、所接收的信号信息等。
下面将详细阐述task_struct结构中最为重要的两个域:state(进程状态)和pid(进程标识符)。

  1. 进程状态
    Linux中的进程有以下几种主要状态。
    (1)运行态(TASK_RUNNING):进程当前正在运行,或者正在运行队列中等待调度。
    (2)可中断的睡眠态(TASK_INTERRUPTIBLE):进程处于阻塞(睡眠)状态,正在等待某些事件发生或能够占用某些资源。处在这种状态下的进程可以被信号中断。接收到信号或被显式地唤醒呼叫(如调用wake_up系列宏:wake_up、wake_up_interruptible等)唤醒之后,进程将转变为TASK_RUNNING状态。
    (3)不可中断的睡眠态(TASK_UNINTERRUPTIBLE):此进程状态类似于可中断的阻塞状态(TASK_INTERRUPTIBLE),只是它不会处理信号,把信号传递到这种状态下的进程不能改变它的状态。只有在它所等待的事件发生时,进程才被显式地唤醒呼叫唤醒。
    (4)停止态(TASK_STOPPED):进程的执行被暂停,当进程收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号,就会进入暂停状态。
    (5)僵尸态(EXIT_ZOMBIE):子进程运行结束,父进程未退出,并且未使用wait函数族(如使用waitpid()函数)等系统调用来回收子进程的资源。处在该状态下的子进程已经放弃了几乎所有的内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其父进程收集。
    (6)消亡态(EXIT_DEAD):即进程退出,不占用任何资源,更不会被调度,该状态不可见。
  2. 进程标识符
    Linux内核通过唯一的进程标识符(进程的身份证号)PID(Process ID)来标识每个进程。PID存放在task_struct的pid字段中。
    当系统启动后,内核通常作为某一个进程的代表。一个指向task_struct的宏current用来记录正在运行的进程。current经常作为进程描述符结构指针的形式出现在内核代码中,例如,current->pid表示处理器正在执行的进程的PID。当系统需要查看所有的进程时,则调用for_each_process()宏,这将比系统搜索数组的速度要快得多。
    在Linux中获得当前进程的进程号(PID)和父进程号(PPID)的系统调用函数分别为getpid()和getppid()。

猜你喜欢

转载自blog.csdn.net/anton_99/article/details/99702350