Linux系统中的进程管理.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux系统中的进程管理 进程是操作系统中最核心的概念之一。本文在对Linux 进程源代码分析的基础上,对Linux中的进程、进程建立方式、进程调度策略和调度过程进行了分析。 1 Linux进程概述 按照Linux的术语,将正在运行的一道程序称为进程,一个进程包括四个方面的基本元素:可供执行的程序;专用的系统空间堆栈;进程控制块;进程专用的用户空间堆栈.在一个给定时刻内,进程处于下面六种状态之一.在/include/linux/sched.h 定义的进程状态: #define TASK_RUNNING 0 /* 进程准备好运行 */ #define TASK_INTERRUPTIBLE 1 /* 等待特定事件,可以被信号中断 */ #define TASK_UNINTERRUPTIBLE 2 /* 等待特定硬件条件,不可以被信号中断*/ #define TASK_ZOMBIE 4 /* 进程已经退出 */ #define TASK_STOPPED 8 /* 进程已经停止运行 */ #define TASK_SWAPPING 16 /* 进程正在执行磁盘交换工作 */ 任何时刻一个处理机仅能执行一个进程,而可能不止一个进程处于TASK_RUNNING 状态。TASK_RUNNING 并不意味着该进程可以立即获得CPU(虽然有时候是这样),而是仅仅说明只要CPU 一旦可用,进程就可以立即准备执行了。进程处于TASK_ZOMBIE 状态,意味进程已经退出了(或已经被杀掉了),但是其相关的struct task_struct 结构并没有被删除。这样即使子进程已经退出,也允许父进程对已经死去的子孙进程进行查询。父进程通过调用 wait 来获取TASK_ZOMBIE 进程的信息,同时释放它占用的struct task_struct 结构。进程间的状态转换关系如图1所示: 图1 进程状态转换关系图 图2说明了进程间的关系。在系统中,所有的任务组成一个家族,系统启动时创建的 #1 进程(init进程)是所有进程的祖先。每个struct task_struct 中有五个指向进程图表中自己位置的指针,通过这五个指针来确定自己在整个进程家族中的位置。 图2 进程链接关系图 ·p_opptr 指向进程的原始祖先,通常和p_pptr 类似。 ·p_pptr 指向进程的当前祖先。 ·p_cptr 指向进程最近子孙。 ·p_ysptr 指向进程下一个最年轻兄弟。 ·p_osptr 指向进程下一个最年老兄弟。 这个指针的集合提供了浏览系统中进程集合的方法,在处理诸如查找进程祖先或者查找进程子孙时这些指针是很方便的。这些指针是由两个宏维护的: /* /include/linux/sched.h */ REMOVE_LINKS(p) /* 从图中移出进程节点 */ SET_LINKS(p) /* 在图中插入进程节点 */ 这两个宏都可以调整next_task/prev_task 的链接,增加或删除叶子进程,而从不对拥有子孙进程的进程进行处理。 2 主要数据结构 2.1 task_struct 数据结构 Linux中表示进程控制块的数据结构是 task_struct。task_struct 结构是进程实体的核心, Linux 内核通过对该结构的相关操作来控制进程,task_struct 结构是一个进程存在的唯一标志。Linux 将所有task_struct 结构的指针存储在task 数组中,数组的大小就是系统能容纳的进程数目,默认为512。数组描述如下: /* /include/linux/task.h */ #define NR_TASKS 512 /* task 数组的大小512 */ /* /kernel/sched.c */ struct task_struct *task[NR_TASKS]={init_task,}; Linux 通过task 数组管理系统中所有的进程。系统定义了全局变量nr_tasks 记录系统中进程的数目,描述如下: /* /kernel/fork.c */ int nr_tasks=0; /* 初始化为0 个进程在运行 */ 数据结构task_struct从逻辑上划分为以下几部分: ·进程状态 ·进程调度信息 ·标识符——指示拥有该进程的用户(用户ID、GID 等等) ·进程通信有关信息(IPC, InterProcess Communication) ·时间和定时器 ·进程间的链接 ·文件系统信息 ·虚拟内存信息 ·处理机相关信息 2.2 其它相关的数据结构 task 定义为由指向stru

文档评论(0)

1234554321 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档