在Linux中,每个进程在创建时都会被分配一个数据结构,该数据结构被称为进程控制块(Process Control Block,PCB)。PCB中包含了很多重要的信息,供系统调度和进程执行使用,其中最重要的是进程ID(ProcessID)。进程ID也被称为进程标识符,是一个非负整数,在Linux操作系统中唯一地标识一个进程。一个或多个进程可以合起来构成一个进程组(Process Group)。一个或多个进程组可以合起来构成一个会话(Session)。这样就有了对进程进行批量操作的能力,如通过向某个进程组发送信号来实现向该组中的每个进程发送信号等。
每个进程除了进程ID外还有一些其他标识信息,它们可以通过相应的函数获得。这些函数的声明在unistd.h头文件中。表9-1是这些函数的说明。用户ID和组ID的相关概念如下所示。
●实际用户ID(uid):标识运行该进程的用户。
●有效用户ID(euid):标识以什么用户身份来运行进程。
●实际组ID(gid):实际用户所属组的组ID。
●有效组ID(egid):有效用户所属组的组ID。
获取进程各种标识符的函数表见表9-1。
表9-1 获取进程各种标识符的函数表

【例9-1】获取进程ID。
本例使用函数getpid()、getppid()来获得进程的ID,使用函数getpriority()来获得进程的优先级。
设计步骤
1)在Vim中创建一个新工程文件,命名为“example10_1.c”。
2)在“example9_1.c”中创建的代码如下所示。

3)用GCC编译运行程序,结果如图9-1所示。
1.Linux进程的组成
Linux进程由3部分组成:代码段、数据段和堆栈段,如图9-2所示。

图9-1 例9-1的运行结果

图9-2 Linux进程的组成
(1)代码段
代码段存放程序的可执行代码。
(2)数据段
数据段存放程序的全局变量、常量和静态变量。
(3)堆栈段
堆栈段中的堆用于存放动态分配的内存变量。栈用于函数的调用,存放着函数的参数和函数内部定义的局部变量。
2.Linux进程的状态
一个进程在其生存期内可处于一组不同的状态,这些状态被称为进程状态。进程状态保存在进程任务结构的state字段中。当进程正在等待系统中的资源而处于等待状态时,则称其处于睡眠等待状态。在Linux系统中,睡眠等待状态被分为可中断的等待状态和不可中断的等待状态。
(1)可运行状态(TASK_RUNNING)
当进程正在被CPU执行,或已经准备就绪随时可由调度程序执行时,则称该进程处于可运行(running)状态。进程可以在内核态运行,也可以在用户态运行。当系统资源已经可用时,进程就被唤醒而进入准备运行状态,该状态称为就绪态。这些状态在内核中的表示方法相同,都被称为处于TASK_RUNNING状态。
(2)可中断睡眠状态(TASK_INTERRUPTIBLE)(https://www.xing528.com)
当进程处于可中断等待状态时,系统不会调度该进程执行。当系统产生一个中断或者释放了进程正在等待的资源,或者进程收到一个信号时,都可以唤醒进程转换到就绪状态(运行状态)。
(3)不可中断睡眠状态(TASK_UNINTERRUPTIBLE)
不可中断睡眠状态与可中断睡眠状态类似。但是,处于不可中断睡眠状态的进程只有被使用wake_up()函数明确唤醒时才能转换到可运行的就绪状态。
(4)暂停状态(TASK_STOPPED)
当进程收到信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU时,就会进入暂停状态。可向其发送SIGCONT信号使进程转换到可运行状态。处于该状态的进程将被作为进程终止来处理。
(5)僵死状态(TASK_ZOMBIE)
进程状态之间的转换关系如图9-3所示。

图9-3 进程状态之间的转换关系
当进程已停止运行,但其父进程还没有询问其状态时,则称该进程处于僵死状态。当一个进程的运行时间片用完时,系统就会使用调度程序强制切换到其他的进程去执行。另外,如果进程在内核态执行时需要等待系统的某个资源,此时该进程就会调用sleep_on()或sleep_on_interruptible()自愿地放弃CPU的使用权,而让调度程序去执行其他进程。进程则进入睡眠状态(TASK_UNINTERRUPTIBLE或TASK_INTERRUPTIBLE)。只有当进程从“内核运行状态”转移到“睡眠状态”时,内核才会进行进程切换操作。
在内核态下运行的进程不能被其他进程抢占,而且一个进程不能改变另一个进程的状态。为了避免进程切换时造成内核数据错误,内核在执行临界区代码时会禁止一切中断。
查看进程当前的状态可以使用ps命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等。ps命令的格式如下:

下面对命令选项进行说明。
●-e:显示所有进程。
●-f:全格式。
●-h:不显示标题。
●-l:长格式。
●-w:宽输出。
●-a:显示终端上的所有进程,包括其他用户的进程。
●-r:只显示正在运行的进程。
●-x:显示没有控制终端的进程。
●-u:以用户为主的格式来显示程序状况。
图9-4显示了使用ps命令显示的结果。

图9-4 使用ps命令显示的结果
上述用ps命令显示的数据共分为4个字段,具体说明如下:
●PID:进程标识(ProcessID)。系统就是凭此标识来识别处理此进程的。
●TTY:Teletypewriter。登录的终端机编号。
●TIME:此进程所消耗的CPU时间。
●CMD:正在执行的命令或进程名称。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
