网站大量收购闲置独家精品文档,联系QQ:2885784924

Linux内核设计与实现第三章进程管理.ppt

Linux内核设计与实现第三章进程管理.ppt

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章 进程管理 本章讨论了进程的内核抽象,以及进程如何被创建、销毁和管理。由于操作系统最终目的是让用户运行程序,所以这章是最基础的内容。 相关章节 第三章 进程调度 第十五章 进程地址空间 作业及实验(一) 作业: (1)请分析linux执行程序的ELF格式,并描述其加载执行的过程 (2)请分析linux进程调度器的接口,设计并实现一个调度算法,并分析其性能。 实验: (1)设计一个linux进程调度器 进程与线程 执行线程,简称线程:是在进程中活动的对象。每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对象是线程,而不是进程。 线程模型 Linux:线程 = 进程 Windows:线程 != 进程 进程虚拟机制 两种虚拟机制 虚拟处理器 虚拟内存。 虚拟处理器 给进程一种假象,让进程觉得自己在独享处理器。 虚拟内存 让进程在获取和使用内存时觉得自己拥有整个系统的所有内存资源。 线程之间(在同一个进程中的线程)可以共享虚拟内存,但拥有各自的虚拟处理器。 如何查看进程信息 ps –a Kill -9 PID 进程的信息 Proc文件系统 Proc/PID目录下 Pmap内存区域 Objdump -x 进程树 进程树 第一个进程Init 在Linux系统中,通常调用fork()系统调用创建进程 该系统调用通过复制一个现有进程来创建一个全新的进程。 通常创建新的进程都是为了执行新的、不同的程序,而接着调用exec()这族函数创建新的地址空间,并把新的程序载入。 最终程序通过exit()系统调用退出执行。这个函数会终结进程并将其占用的资源释放掉。 内核把进程存放在叫做任务队列(task list)的双向循环链表中。 链表中的每一项都是类型为task_struct,称为进程描述符(process description)的结构,该结构定义在include/linux/sched.h文件中。 进程描述符中包含一个具体进程的所有信息。 2.1.1 分配进程描述符 Linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色的目的。(通过预先分配和重复使用task_struct,可以避免动态分配和释放所带来的资源消耗。) 各个进程的task_struct存放在它们内核栈的尾端。从而避免使用额外的寄存器专门记录。所以只需在栈底(对于向下增长的栈)或栈顶(对于向上增长的栈)创建一个新的结构struct thread_info。在x86上,struct thread_info在文件asm/thread_info.h中定义如下: 每个任务的thread_info结构在它的内核栈的尾端分配。结构中task域中存放的是指向该任务实际task_struct的指针。 内核通过一个唯一的进程标识值(process identification value)或PID来标识每个进程。 PID是一个数,最大值默认设置为32767(short int短整型的最大值)。它存放在每个进程的进程描述符中。它实际上就是系统中同时存在的进程的最大数目。也可由系统管理员通过修改/proc/sys/kernel/pid_max来提高上限。 在内核中,访问任务通常需要获取指向其task_struct指针。通过current宏查找当前正在运行进程的进程描述符的速度就显得尤其重要。它是随着硬件体系结构不同从而它的实现也不同。 #define current (get_current()) 在x86系统上,current把栈指针的后13个有效位屏蔽掉,用来计算出thread_info的偏移,该操作通过current_thread_info()函数完成。汇编代码如下: movl $-8192,%eax andl %esp,%eax 最后,current 在从thread_info的task域中提取并返回task_struct的地址。 static inline struct task_struct *get_current(void) { return current_thread_info()-task; } 2.1.3 进程状态 2.1.4 设置当前进程状态 2.1.5 进程上下文 可执行程序代码是进程的重要组成部分。这些代码从可执行文件载入到进程的地址空间执行。 一般程序在用户空间执行。当一个程序执行了系统调用或触发了某个异常,它就陷入了内核空间。称内核“代表进程执行”并处于进程上下文中。 系统调用和异常处理是对内核明确定义的接口。进程只有通过这些接口才能陷入内核执行(对内核的所有访问都必须通过这些接口) 进程树 Linux进程之间存在一个明显的继承关系。所有的进程都是PID为1的init进程的后代。内核在系统启动的

文档评论(0)

junjun37473 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档