Linux操作系统分析与实践第三讲:进程管理.ppt
《Linux操作系统分析与实践第三讲:进程管理.ppt》由会员分享,可在线阅读,更多相关《Linux操作系统分析与实践第三讲:进程管理.ppt(92页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、LinuxLinux操作系统分析与实践操作系统分析与实践第三讲:进程管理第三讲:进程管理LinuxLinux操作系统分析与实践课程建设小组操作系统分析与实践课程建设小组北京大学北京大学二零零八年春季二零零八年春季*致谢:感谢致谢:感谢IntelIntel对本课程项目的资助对本课程项目的资助本讲主要内容本讲主要内容Linux中的进程中的进程Linux进程控制进程控制Linux的进程调度的进程调度Linux源代码阅读示例源代码阅读示例:进程调度进程调度schedule部分的阅读部分的阅读一、一、Linux中的进程中的进程进程进程 是程序执行时的一个实例是程序执行时的一个实例从内核的观点来看,进程的
2、目的是担当从内核的观点来看,进程的目的是担当分配系统资源分配系统资源(CPU 时间,存储器等时间,存储器等)的实的实体体Linux中的关于进程的代码大部分是如何中的关于进程的代码大部分是如何管理进程的代码管理进程的代码每个进程运行的是程序的代码每个进程运行的是程序的代码轻量级进程轻量级进程线程代表进程的一个执行流,内核无法线程代表进程的一个执行流,内核无法感知感知Linux使用轻量级进程对多线程应用程序使用轻量级进程对多线程应用程序提供更好的支持提供更好的支持轻量级进程可以共享资源轻量级进程可以共享资源通过将轻量级进程与线程相关联,内核可以通过将轻量级进程与线程相关联,内核可以独立调度线程独立
3、调度线程进程描述符进程描述符task_struct(include/linux/sched.h)进程描述符进程描述符(续续)Task_struct结构的描述:结构的描述:1.进程标识进程标识2.进程状态进程状态(State)3.进程调度进程调度信息信息和和策略策略4.标识号标识号(Identifiers)5.进程通信有关的信息进程通信有关的信息(IPC)6.进程链接信息进程链接信息(Links)7.时间和定时器信息时间和定时器信息(Times and Timers)8.文件系统信息文件系统信息(Files System)9.处理器相关的上下文信息处理器相关的上下文信息进程描述符进程描述符(续续
4、)Linux中每一个进程由一个中每一个进程由一个task_struct数数据结构来描述(进程控制块据结构来描述(进程控制块PCB)进程描述符放在动态内存中而且和内核进程描述符放在动态内存中而且和内核态的进程栈放在一个独立的态的进程栈放在一个独立的8KB的内存的内存区中区中好处:通过好处:通过esp就能引用进程描就能引用进程描述符述符current宏宏current宏宏current宏获取当前正在运行的进程描述符的宏获取当前正在运行的进程描述符的指针,指针,current宏经常作为进程描述符出现在宏经常作为进程描述符出现在内核代码里,例如内核代码里,例如current-pid返回当前正返回当前正
5、在运行的进程的在运行的进程的PID值值进程的状态进程的状态task_struct 中的中的state 表示进程当前的状态表示进程当前的状态Linux中的进程有中的进程有5个状态个状态:(include/linux/sched.h)#define TASK_RUNNING0#define TASK_INTERRUPTIBLE 1#define TASK_UNINTERRUPTIBLE2#define TASK_ZOMBIE4#define TASK_STOPPED8状态之间的转换状态之间的转换进程链表进程链表task_struct中的中的 struct task_struct*next_task
6、,*prev_task;TASK_RUNNING状态的进程链表状态的进程链表task_struct中的中的struct list_head run_list;list_head是是Linux内核当中定义的一个数据结构用内核当中定义的一个数据结构用来实现双向链表,来实现双向链表,Linux内核中使用上百个向链表内核中使用上百个向链表来存放各种数据结来存放各种数据结(includelist.h)struct list_head struct list_head*next,*prev;进程进程PID hashtask_struct中的中的pid为了快速的从为了快速的从pid值获得进程描述符。需要值获
7、得进程描述符。需要有有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(父进程,有时
8、候是调试时的父进程,有时候是调试时的调试监管进程调试监管进程)p_cptr:child(指向自己最年轻的子进程指向自己最年轻的子进程)p_ysptr:指向比自己年轻的兄弟进程:指向比自己年轻的兄弟进程p_osptr:指向比自己老的兄弟进程:指向比自己老的兄弟进程进程之间的父子关系进程之间的父子关系(续续)进程之间的父子关系进程之间的父子关系(续续)Linux中的中的0号进程号进程,通常称为通常称为swapper进进程,是所有进程的祖先。由它执行程,是所有进程的祖先。由它执行cpu_idle()函数,当没有其他进程处于函数,当没有其他进程处于TASK_RUNNING的时候,调度程序会的时候,调度
9、程序会选择选择0号进程运行号进程运行0号进程创建号进程创建1号进程,通常称为号进程,通常称为init进程。进程。它创建和监控其他进程的活动它创建和监控其他进程的活动进程的地址空间进程的地址空间Linux把进程的线性地址空间组织为一个把进程的线性地址空间组织为一个个线性区个线性区每一个线性区对应一组连续的页每一个线性区对应一组连续的页线性区之间不重叠线性区之间不重叠进程的地址空间进程的地址空间(续续)task_struct struct mm_struct*mm;内存描述符内存描述符 mm_struct 里面有一个字段里面有一个字段mmp 指向内存线性区链表的首部。指向内存线性区链表的首部。进程
10、的地址空间进程的地址空间(续续)每个线性区有一定的访问权限每个线性区有一定的访问权限在增加或删除线性区时,在增加或删除线性区时,Linux尽量合并尽量合并访问权限相同且相邻的线性区访问权限相同且相邻的线性区进程的地址空间进程的地址空间(续续)进程堆的管理进程堆的管理每个进程都拥有一个特殊的线形区:堆每个进程都拥有一个特殊的线形区:堆内存描述符里面的内存描述符里面的start_brk和和brk字段限字段限定了这个区的开始地址和结束地址定了这个区的开始地址和结束地址常用的常用的C库函数:库函数:malloc(),free()系统调用系统调用brk()用于直接修改堆大小用于直接修改堆大小二、二、LI
11、NUX进程控制进程控制Linux进程的创建和执行进程的创建和执行相关的数据结构和系统调用相关的数据结构和系统调用进程的创建进程的创建程序的执行程序的执行Linux进程的撤消进程的撤消相关的数据结构相关的数据结构系统创建进程时,系统创建进程时,Linux为新进程分配一为新进程分配一task_struct结构,进程结束时收回其结构,进程结束时收回其task_struct结构结构Linux在内存空间中分配了一块空间来存在内存空间中分配了一块空间来存放进程的放进程的task_struct结构,并将所有的结构,并将所有的task_struct结构的指针放在一个结构的指针放在一个task数组数组中,该数组
12、是在操作系统内核中专门开中,该数组是在操作系统内核中专门开辟的一块区域,数组大小也就是系统中辟的一块区域,数组大小也就是系统中所能容纳的进程的数目所能容纳的进程的数目相关的数据结构相关的数据结构(续续)Task数组的结构:数组的结构:struct task_struct*taskNR_TASKS=&init_task;NR_TASKS是数组的大小,默认是是数组的大小,默认是512相关的数据结构相关的数据结构(续续)Task_struct结构的描述:结构的描述:1.进程标识进程标识2.进程状态进程状态(State)3.进程调度进程调度信息信息和和策略策略4.标识号标识号(Identifiers)
13、5.进程通信有关的信息进程通信有关的信息(IPC)6.进程链接信息进程链接信息(Links)7.时间和定时器信息时间和定时器信息(Times and Timers)8.文件系统信息文件系统信息(Files System)9.处理器相关的上下文信息处理器相关的上下文信息相关的系统调用相关的系统调用Fork()通过复制调用进程来建立新的进程,通过复制调用进程来建立新的进程,是最基本的进程建立过程是最基本的进程建立过程Exec 包括一系列系统调用,它们都是通过用包括一系列系统调用,它们都是通过用一个新的程序覆盖原来的内存空间,实现进程一个新的程序覆盖原来的内存空间,实现进程的转变的转变Wait()提
14、供初级的进程同步措施,能使一个提供初级的进程同步措施,能使一个进程等待,直到另外一个进程结束为止。进程等待,直到另外一个进程结束为止。Exit()该系统调用用来终止一个进程的运行该系统调用用来终止一个进程的运行如何区分父进程和子进程的功能?如何区分父进程和子进程的功能?父子进程怎样被调度执行?父子进程怎样被调度执行?父子进程在内存中如何存放?父子进程在内存中如何存放?子进程如何继承父进程的资源?子进程如何继承父进程的资源?进程的创建过程进程的创建过程 新的进程通过克隆旧的进程来建立,当前进新的进程通过克隆旧的进程来建立,当前进程是通过程是通过fork()系统调用来建立新的进程系统调用来建立新的
15、进程 当系统调用结束时,内核在系统的物理内存当系统调用结束时,内核在系统的物理内存中为新进程分配新的中为新进程分配新的task_struct结构,并为结构,并为新进程要使用的堆栈分配物理页和进程标志新进程要使用的堆栈分配物理页和进程标志符符 父进程和子进程共享打开的文件父进程和子进程共享打开的文件 fork()的简单流程的简单流程Fork调用执行示意调用执行示意 如上图所示,分别使如上图所示,分别使fork调用前后的两个部分调用前后的两个部分 PC指向当前执行的语句,指向当前执行的语句,fork之前,它指向第之前,它指向第一个一个printf语句,语句,fork调用之后进程调用之后进程A、B一
16、起一起运行,运行,A是父进程,是父进程,B是子进程进程是子进程进程A的副本,的副本,执行与执行与A一样的程序。两个一样的程序。两个pc都指向第二个都指向第二个printf语句。也就是语句。也就是AB从程序的相同点开始执从程序的相同点开始执行行Fork内存的变动内存的变动Fork()执行的内存变动如下:执行的内存变动如下:分配分配1页给页给task_struct结构结构分配分配1页给内核堆栈页给内核堆栈分配分配1页给页给pg_dir并且给并且给page_tables分配一些页分配一些页Fork硬件相关的变化硬件相关的变化硬件相关的变化硬件相关的变化SS被置为内核堆栈被置为内核堆栈(0 x10)E
17、SP被置为新分配栈的顶端被置为新分配栈的顶端(kernel_stack_page)CR3指向新分配的页目录指向新分配的页目录 (由由copy_page_table()完成完成)Idt=_LDT(task_nr)建立新的局部描述符建立新的局部描述符为新的任务状态段为新的任务状态段(tss)和局部描述符表和局部描述符表(ldt)装入装入gdt从父进程继承剩下的寄存器从父进程继承剩下的寄存器Fork系统调用系统调用Pid_t fork(void);由由fork创建的新进程称为子进程。该函数被调创建的新进程称为子进程。该函数被调用一次,会返回两次。给子进程的返回值是用一次,会返回两次。给子进程的返回值
18、是0,给父进程的返回值是子进程的进程,给父进程的返回值是子进程的进程ID。然后。然后子进程和父进程继续执行子进程和父进程继续执行fork之后的指令。子之后的指令。子进程拥有父进程数据空间,堆和栈的拷贝,但进程拥有父进程数据空间,堆和栈的拷贝,但是它们并不是共享这些存储空间。这里就用到是它们并不是共享这些存储空间。这里就用到了了“写时复制写时复制”技术技术写时复制写时复制写时复制技术写时复制技术(copy_on_write)Linux通过写时复制技术来调入执行的程序通过写时复制技术来调入执行的程序 Linux将可写虚拟内存页的页表项标志为只读,当将可写虚拟内存页的页表项标志为只读,当进程向该内存
19、页写入数据时,处理器会发现内存访问进程向该内存页写入数据时,处理器会发现内存访问中的问题中的问题(向只读页中写入向只读页中写入),然后会导致操作系统可,然后会导致操作系统可以捕获的页故障,由操作系统来完成内存页的复制以捕获的页故障,由操作系统来完成内存页的复制 一个给定的物理页面可以代表多个逻辑页面,当这一个给定的物理页面可以代表多个逻辑页面,当这个页被一个进程从另一个进程处得到共享时,它是逻个页被一个进程从另一个进程处得到共享时,它是逻辑上的拷贝辑上的拷贝 如前面的如前面的fork调用,逻辑拷贝整个进程的地址空间,调用,逻辑拷贝整个进程的地址空间,仅当试图修改页面仅当试图修改页面(产生写错误
20、产生写错误)才真正的拷贝才真正的拷贝程序的执行程序的执行用用fork创建子进程之后,为了让父进程和子进创建子进程之后,为了让父进程和子进程执行不同的任务,经常需要调用一种程执行不同的任务,经常需要调用一种exec函函数以执行另一个程序。当进程调用数以执行另一个程序。当进程调用exec函数时,函数时,该进程完全由新程序替代。新程序从该进程完全由新程序替代。新程序从main开始开始执行执行exec并不创建新进程,前后进程并不创建新进程,前后进程ID是不变的。是不变的。它是用另外一个程序替代了当前进程的正文,它是用另外一个程序替代了当前进程的正文,数据,堆和栈数据,堆和栈exec函数函数exec执行
21、时的内存变化执行时的内存变化1页分配给可执行文件头页分配给可执行文件头1页或者多页分配给堆栈页或者多页分配给堆栈硬件相关的变化:硬件相关的变化:clear_page_tables()移去旧页移去旧页在新的在新的LDT中设置描述符中设置描述符包含包含argv和和envp的的“脏脏”页被分配页被分配设置调用者的指针设置调用者的指针设置调用者的堆栈指针指向建立的堆栈设置调用者的堆栈指针指向建立的堆栈更新内存段的边界更新内存段的边界Fork VS Exec 因为因为fork只能建立相同程序的副本,如果它只能建立相同程序的副本,如果它是程序员唯一可以使用的建立进程的手段,会是程序员唯一可以使用的建立进程
22、的手段,会影响影响linux的性能的性能 exec系列系统调用把新进程装入调用进程的系列系统调用把新进程装入调用进程的地址空间,改变调用进程的代码。如果地址空间,改变调用进程的代码。如果exec成成功,调用者进程将被覆盖,从新进程的入口地功,调用者进程将被覆盖,从新进程的入口地址开始执行。址开始执行。exec只用新进程取代了原来的进只用新进程取代了原来的进程。并且没有返回数据程。并且没有返回数据进程的撤销进程的撤销撤销时机撤销时机主动撤销:执行完代码,通知内核释放进程主动撤销:执行完代码,通知内核释放进程的资源的资源被动:内核有选择地强迫进程死掉。被动:内核有选择地强迫进程死掉。e.g内核内核
23、代表进程运行时在内核态产生不可恢复的异代表进程运行时在内核态产生不可恢复的异常常进程的撤销进程的撤销进程可能已死,但必须保存它的描述符,进程可能已死,但必须保存它的描述符,在你进程得到通知后才可以删除在你进程得到通知后才可以删除僵死状态:表明进程已死,但需要等待僵死状态:表明进程已死,但需要等待父进程删除父进程删除撤销过程分为撤销过程分为进程终止:释放进程占有的大部分资源进程终止:释放进程占有的大部分资源进程删除:彻底删除进程的所有数据结构进程删除:彻底删除进程的所有数据结构系统调用系统调用_exit()C编译程序总是把编译程序总是把exit()插入到插入到main()的最的最后一条语句之后,
24、后一条语句之后,exit()调用调用_exit()系统系统调用调用_exit()调用调用do_exit()释放进程所占资源,释放进程所占资源,终止进程终止进程进程终止:进程终止:do_exit()删除内核对终止进程的大部分引用:删除内核对终止进程的大部分引用:信号量队列中的进程描述符信号量队列中的进程描述符删除进程描述符中与分页、文件系统、打开文件描删除进程描述符中与分页、文件系统、打开文件描述符和信号处理相关数据结构述符和信号处理相关数据结构减小进程所用模块的引用计数减小进程所用模块的引用计数将进程描述符的将进程描述符的exit_code字段设置为终止代号字段设置为终止代号更新父子进程的亲属
25、关系,强制将自己的子进更新父子进程的亲属关系,强制将自己的子进程作为其它某个进程的子进程,以等待该父进程作为其它某个进程的子进程,以等待该父进程进行删除程进行删除调用调用schedule()进行调度进行调度进程删除进程删除父进程调用父进程调用wait()类系统调用检查子进程类系统调用检查子进程是否终止是否终止若子进程包含终止代号,则父进程通过若子进程包含终止代号,则父进程通过release()释放僵死进程的描述符释放僵死进程的描述符释放进程释放进程id从进程链表中删除进程描述符从进程链表中删除进程描述符释放存放进程描述符的内存区释放存放进程描述符的内存区三、三、Linux的进程调度的进程调度s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 操作系统 分析 实践 第三 进程 管理
限制150内