Linux内核开发 — 进程控制

本章主要是以代码的角度分析进程的定义、状态、数据结构等概念。

进程的定义

       进程是一段运行的程序,他是一个动态的可执行实体。而程序是代码和数据的集合,代码是一个静态的实体,程序是可以供多个进程使用,比如相同的应用程序可以在不同的计算机上运行而产生多个进程。

 

进程四要素

进程四要素主要是针对代码中对线程、进程的区别而言:

l  有一段程序供其执行

l  有进程专用的内核堆栈空间

l  有内核控制块(有一个task_struct 数据结构),拥有内核控制块,才能被内核调度

l  有独立的用户空间

 

如何进程、用户线程、内核线程:

      

 

进程的状态

 

1)#defineTASK_RUNNING                           0

正在被CPU执行,或者已经就绪,随时可以执行。进程刚创建就处于这种状态下。

 

2)#defineTASK_INTERRUPTIBLE         1

处于等待中的进程,待等待条件为真时被唤醒,也可以由信号过着中断唤醒。


3)#defineTASK_UNINTERRUPTIBLE    2

处于等待中的进程,待资源有效时背唤醒,但是不可以被其他进程的信号或者中断唤醒。

      

4)#define__TASK_STOPPED                 4

       进程中止执行。当接收到SIGSTOP或者SIGTSTP信号时进入此状态,知道接收到SIGCONT信号后,进程重新回到 TASK_RUNNING状态。

 

5)#define__TASK_TRACED                          8

       处于调试状态的进程

 

6)  #defineEXIT_ZOMBIE                       16

表示进程已经终止执行,但是父进程尚未通过waitpid()收集进程死亡的相关信息。

 

7)  #defineEXIT_DEAD                                 32

进程终止的最终状态,父进程已经收集完进程死亡相关信息,此进程将被系统删除。

 

8)  #defineTASK_DEAD                                64

进程退出是处于此状态(EXIT_DEAD和EXIT_ZOMBIE由单独的变量来记录,是对TASK_DEAD的细分)。

 

9)  #defineTASK_WAKEKILL                 128

类似于TASK_UNINTERRUPTIBLE,Linux 2.6.25 内核新增的状态,可被致命信号(SIGKILL)唤醒。

 

#define TASK_KILLABLE          (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)

#define TASK_STOPPED            (TASK_WAKEKILL | __TASK_STOPPED)

#define TASK_TRACED             (TASK_WAKEKILL | __TASK_TRACED)

#define TASK_NORMAL            (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE)

进程的数据结构

       在Linux 中进程、线程都采用task_struct数据结构进行描述,下面将讲诉最主要的几个数据结构成员的用途。

volatile long state; //进程状态

unsigned int flags; //进程描述相关标志

int prio, static_prio, normal_prio; //进程优先级,数值越大,优先级越小

unsigned int rt_priority; //进程运行优先级

unsigned int policy; //进程调度策略

int exit_state; //进程退出时的状态

struct mm_struct *mm; //进程内存管理信息

pid_t pid;//进程号

 

 

数据结构与内核堆栈空间

       Linux的内核堆栈只有两个页面大小(8K),在2.4的内核中,task_struct是被放在内核堆栈的底部。


       然而在2.6的版本调整了数据结构的占用存储空间的方式,内核堆栈底部只放一个thread_info_structure的数据结构,此结构描述了task_struct所在的位置。

       Linux内核中有一个current的指针,总是指向正在执行的task_struct。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。