- 1、本文档共92页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux操作系统分析与实践第三讲:进程管理 《Linux操作系统分析与实践》课程建设小组 北京大学 二零零八年春季 *致谢:感谢Intel对本课程项目的资助 本讲主要内容 Linux中的进程 Linux进程控制 Linux的进程调度 Linux源代码阅读示例: 进程调度schedule部分的阅读 一、Linux中的进程 进程 是程序执行时的一个实例 从内核的观点来看,进程的目的是担当分配系统资源(CPU 时间,存储器等)的实体 Linux中的关于进程的代码大部分是如何管理进程的代码 每个进程运行的是程序的代码 轻量级进程 线程代表进程的一个执行流,内核无法感知 Linux使用轻量级进程对多线程应用程序提供更好的支持 轻量级进程可以共享资源 通过将轻量级进程与线程相关联,内核可以独立调度线程 进程描述符task_struct (include/linux/sched.h) 进程描述符(续) Task_struct结构的描述: 进程标识 进程状态(State) 进程调度信息和策略 标识号(Identifiers) 进程通信有关的信息(IPC) 进程链接信息(Links) 时间和定时器信息(Times and Timers) 文件系统信息(Files System) 处理器相关的上下文信息 进程描述符(续) Linux中每一个进程由一个task_struct数据结构来描述(进程控制块PCB) 进程描述符放在动态内存中而且和内核态的进程栈放在一个独立的8KB的内存区中 好处:通过esp就能引用进程描 述符 current宏 current宏 current宏获取当前正在运行的进程描述符的指针,current宏经常作为进程描述符出现在内核代码里,例如current-pid返回当前正在运行的进程的PID值 进程的状态 task_struct 中的state 表示进程当前的状态 Linux中的进程有5个状态: 状态之间的转换 进程链表 task_struct中的 struct task_struct *next_task, *prev_task; TASK_RUNNING状态的进程链表 task_struct中的 struct list_head run_list; list_head是Linux内核当中定义的一个数据结构用来实现双向链表,Linux内核中使用上百个向链表来存放各种数据结(include\list.h) 进程PID hash task_struct中的pid 为了快速的从pid值获得进程描述符。需要有hash表 hash_pid(),unhashpid()在pidhash表中分别插入和删除一个进程 find_task_by_pid()查找散列表并返回给定PID的进程描述符指针 进程之间的父子关系 task_struct中的 struct task_struct *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr; p_opptr : original parent (process 1 或者创建它的父进程) p_pptr: parent (父进程,有时候是调试时的调试监管进程) p_cptr: child (指向自己最年轻的子进程) p_ysptr:指向比自己年轻的兄弟进程 p_osptr:指向比自己老的兄弟进程 进程之间的父子关系(续) 进程之间的父子关系(续) Linux中的0号进程,通常称为swapper进程,是所有进程的祖先。由它执行cpu_idle()函数,当没有其他进程处于TASK_RUNNING的时候,调度程序会选择0号进程运行 0号进程创建1号进程,通常称为init进程。它创建和监控其他进程的活动 进程的地址空间 Linux把进程的线性地址空间组织为一个个线性区 每一个线性区对应一组连续的页 线性区之间不重叠 进程的地址空间(续) task_struct struct mm_struct *mm; 内存描述符 mm_struct 里面有一个字段mmp 指向内存线性区链表的首部。 进程的地址空间(续) 每个线性区有一定的访问权限 在增加或删除线性区时,Linux尽量合并访问权限相同且相邻的线性区 进程的地址空间(续) 进程堆的管理 每个进程都拥有一个特殊的线形区:堆 内存描述符里面的start_brk和brk字段限定了这个区的开始地址和结束地址 常用的C库函数:malloc(),free() 系统调用brk()用于直接修改堆大小 二、LINUX进程控制 Linux进程的创建和执行 相关的数据结构和系统调用 进程的创建 程序的执行 Linux进程的撤消 相关的数据结构 系统创建进程时,Linux为新进程分
文档评论(0)