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