操作系统分析.pptx
《操作系统分析.pptx》由会员分享,可在线阅读,更多相关《操作系统分析.pptx(84页珍藏版)》请在咨信网上搜索。
1、Linux的进程的进程xlanchen2007.9.18xlanchen2007.9.25Linux Operating Systems Analysis2主要内容主要内容l进程描述符l进程切换l进程的创建和删除l进程调度xlanchen2007.9.25Linux Operating Systems Analysis3进程的概念进程的概念l进程是执行程序的一个实例l进程和程序的区别l几个进程可以并发的执行一个程序l一个进程可以顺序的执行几个程序xlanchen2007.9.25Linux Operating Systems Analysis4进程描述符进程描述符l为了管理进程,内核必须对每个
2、进程进行清晰的描述。l进程描述符提供了内核所需了解的进程信息linclude/linux/sched.hstruct task_structl数据结构很庞大l基本信息l管理信息l控制信息xlanchen2007.9.25Linux Operating Systems Analysis5xlanchen2007.9.25Linux Operating Systems Analysis6Linux进程的进程的状态状态l可运行状态(TASK_RUNNING)l可中断的等待状态(TASK_INTERRUPTIBLE)l不可中断的等待状态(TASK_UNINTERRUPTIBLE)l暂停状态(TASK_
3、STOPPED)l僵死状态(TASK_ZOMBIE)l状态值的改变通常是一个简单的赋值l内核也提供set_task_state 和set_current_state 宏xlanchen2007.9.25Linux Operating Systems Analysis7进程状态转换图进程状态转换图xlanchen2007.9.25Linux Operating Systems Analysis8标识一个进程标识一个进程l使用进程描述符地址l进程和进程描述符之间有非常严格的一一对应关系,使得用32位进程描述符地址标识进程非常方便l使用PID(Process ID,PID)l每个进程的PID都存放在
4、进程描述符的pid域中l032767l新pid的产生:get_pidl+1l循环xlanchen2007.9.25Linux Operating Systems Analysis9获得一个进程的获得一个进程的pidl系统调用getpidsys_getpidl关于进程组l使用组链表l所有进程共享组内第一个进程的pidl数据:tgpidl单独一个进程可以看成只有一个进程的组lgetpid返回组pidxlanchen2007.9.25Linux Operating Systems Analysis10进程描述符和进程的进程描述符和进程的内核内核堆栈堆栈lLinux为每个进程分配一个8KB大小的内存区
5、域,用于存放该进程两个不同的数据结构:l进程描述符l进程的内核堆栈进程处于内核态时使用,不同于用户态堆栈内核控制路径所用的堆栈很少,因此对栈和描述符来说,8KB足够了xlanchen2007.9.25Linux Operating Systems Analysis11Task_unionlC语言允许用如下的一个union结构来方便的表示这样的一个混合体l进程描述符的分配/回收/访问lalloc_task_structlfree_task_struct lget_task_struct=2048xlanchen2007.9.25Linux Operating Systems Analysis12
6、current宏进程描述符宏进程描述符l从刚才看到的进程描述符和内核态堆栈之间的配对,内核可以很容易的从esp寄存器的值获得当前在CPU上运行的进程的描述符指针l因为这个内存区是8KB=213大小,内核必须做的就是让esp有13位的有效位,以获得进程描述符的基地址l这个工作由current宏来完成8191=8192-1=0 x2000-1=0 x1fff取反:0 xffffe000(最后13位为0)xlanchen2007.9.25Linux Operating Systems Analysis13Current宏的使用宏的使用lCurrent宏可以看成当前进程的进程描述符指针,在内核中直接使
7、用l比如current-pid返回在CPU上正在执行的进程的PIDxlanchen2007.9.25Linux Operating Systems Analysis14进程链表进程链表l为了对给定类型的进程(比如所有在可运行状态下的进程)进行有效的搜索,内核维护了几个进程链表l所有进程链表在进程描述符中:xlanchen2007.9.25Linux Operating Systems Analysis15lSET_LINKS和REMOVE_LINKS宏用来分别在进程链表中插入和删除一个进程描述符。xlanchen2007.9.25Linux Operating Systems Analysis
8、16lfor_each_task宏扫描整个进程链表xlanchen2007.9.25Linux Operating Systems Analysis17TASK_RUNNING状态的进程链表状态的进程链表l当内核调度程序寻址一个新的进程在cpu上运行时,必须只考虑可运行进程,因为扫描整个进程链表效率很低l引入了可运行状态的双向循环链表,也叫运行队列l进程描述符使用用来实现运行队列xlanchen2007.9.25Linux Operating Systems Analysis18对可运行队列的一些操作函数对可运行队列的一些操作函数增加/删除一个可运行进程可运行队列的长度,可运行进程的个数唤醒一
9、个进程,使一个进程可运行xlanchen2007.9.25Linux Operating Systems Analysis19pidhash表及链接表表及链接表l在一些情况下,内核必须能从进程的PID得出对应的进程描述符指针。例如kill系统调用l为了加速查找,引入了pidhash散列表l用pid_hashfn宏把PID转换成表的索引xlanchen2007.9.25Linux Operating Systems Analysis20pidhash表及链接表表及链接表xlanchen2007.9.25Linux Operating Systems Analysis21进程之间的亲属关系进程之间
10、的亲属关系l程序创建的进程具有父子关系,在编程时往往需要引用这样的父子关系。进程描述符中有几个域用来表示这样的关系xlanchen2007.9.25Linux Operating Systems Analysis22等待队列等待队列l当要把除了TASK_RUNNING状态之外的进程组织在一起时,linux使用了等待队列lTASK_STOPPED和TASK_ZOMBIE不在专门的链表中lTASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE状态的进程再分成很多类,每一类对应一个特定的事件。在这种情况下,进程状态提供的信息满足不了快速检索,因此,内核引进了另外的进程链表,叫
11、做等待队列l等待队列在内核中有很多用途,尤其是对中断处理、进程同步和定时用处很大xlanchen2007.9.25Linux Operating Systems Analysis23l等待队列使得进程可以在事件上的条件等待,并且当等待的条件为真时,由内核唤醒它们l等待队列由循环链表实现l在等待队列上内核实现了一些操作函数Add_wait_queueremove_wait_queuexlanchen2007.9.25Linux Operating Systems Analysis24等待队列的链表等待队列的链表xlanchen2007.9.25Linux Operating Systems An
12、alysis25进程等待进程等待l等待一个特定事件的进程能调用下面几个函数中的任一个lsleep_onlsleep_on_timeoutlinterruptible_sleep_onlinterruptible_sleep_on_timeoutl进程等待由需要等待的进程自己进行(调用)xlanchen2007.9.25Linux Operating Systems Analysis26sleep_onxlanchen2007.9.25Linux Operating Systems Analysis27进程的进程的唤醒唤醒l利用wake_up或者wake_up_interruptible等一系列
13、的宏,都让插入等待队列中的进程进入TASK_RUNNING状态xlanchen2007.9.25Linux Operating Systems Analysis28进程切换进程切换(process switching)l为了控制进程的执行,内核必须有能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程的执行,这叫做进程切换,任务切换,上下文切换xlanchen2007.9.25Linux Operating Systems Analysis29进程上下文进程上下文l包含了进程执行需要的所有信息l用户地址空间包括程序代码,数据,用户堆栈等l控制信息进程描述符,内核堆栈等l硬件上下文xlanc
14、hen2007.9.25Linux Operating Systems Analysis30硬件上下文硬件上下文l尽管每个进程可以有自己的地址空间,但所有的进程只能共享CPU的寄存器。l因此,在恢复一个进程执行之前,内核必须确保每个寄存器装入了挂起进程时的值。这样才能正确的恢复一个进程的执行l硬件上下文:进程恢复执行前必须装入寄存器的一组数据l包括通用寄存器的值以及一些系统寄存器l通用寄存器如eax,ebx等l系统寄存器如eip,esp,cr3等等xlanchen2007.9.25Linux Operating Systems Analysis31l在linux中l一个进程的硬件上下文主要保存
15、在thread_struct中l其他信息放在内核态堆栈中xlanchen2007.9.25Linux Operating Systems Analysis32thread_structxlanchen2007.9.25Linux Operating Systems Analysis33上下文切换上下文切换lswitch_to宏执行进程切换,schedule()函数调用这个宏一调度一个新的进程在CPU上运行l在schedule()中找到调用switch_to宏的位置lswitch_to利用了prev和next两个参数:lprev:指向当前进程lnext:指向被调度的进程xlanchen2007.
16、9.25Linux Operating Systems Analysis34当前进程仍然是prev这个push操作针对的是当前进程的堆栈保存esi,edi,ebp保存esp到%0中嵌入式汇编中用这种方法表示输入、输出参数,可以从0开始编号%0是什么?保存esp到当前进程的上下文中从next的上下文中取出堆栈的位置,将其作为当前堆栈堆栈被切换在prev进程的上下文中设置返回地址,返回到下面标号为1处从next进程的上下文中取得该进程的返回地址,放入堆栈中调用_switch_to函数xlanchen2007.9.25Linux Operating Systems Analysis35进程切换的关键
17、语句进程切换的关键语句l堆栈的切换从此,内核对next的内核态堆栈操作,因此,这条指令执行从prev到next真正的上下文切换,因为进程描述符和内核态堆栈紧密联系在一起,改变内核态堆栈就意味改变当前进程xlanchen2007.9.25Linux Operating Systems Analysis36l什么时候next进程真正开始执行呢?lcall=保存返回地址+跳转到target处执行lret=从堆栈上获得返回地址,并跳转到该返回地址处执行l?当_switch_to正常返回时,发生了什么事情?xlanchen2007.9.25Linux Operating Systems Analysis
18、37标号为标号为1的执行代码处的执行代码处l一个进程被正常切换出时,保存的eip总是标号为1的那个位置l当这个进程再次被调度运行时,恢复在堆栈上的返回地址总是这个11:popl%ebppopl%edipopl%esixlanchen2007.9.25Linux Operating Systems Analysis38_switch_tol_switch_to用来处理其他上下文的切换l此时,使用的堆栈是next进程的堆栈,这个堆栈上没有_switch_to需要的参数prev和nextl怎么传参呢?l找到_switch_to的函数定义和函数声明l找到FASTCALL的定义xlanchen2007.
19、9.25Linux Operating Systems Analysis39_switch_to的关键操作的关键操作lunlazy_fpu()处理数学协处理器l保存和恢复fs、gsl等等xlanchen2007.9.25Linux Operating Systems Analysis40?哪里切换了进程的地址空间?哪里切换了进程的地址空间l从执行switch_to的位置往前找xlanchen2007.9.25Linux Operating Systems Analysis41Project:进程的切换:进程的切换l对Linux中进程的切换过程进行分析,提交分析报告xlanchen2007.9.
20、25Linux Operating Systems Analysis42进程的创建进程的创建l许多进程可以并发的运行同一程序,这些进程共享内存中程序正文的单一副本,但每个进程有自己的单独的数据和堆栈区l一个进程可以在任何时刻可以执行新的程序,并且在它的生命周期中可以运行几个程序l又如,只要用户输入一条命令,shell进程就创建一个新进程xlanchen2007.9.25Linux Operating Systems Analysis43l传统的UNIX操作系统采用统一的方式来创建进程l子进程复制父进程所拥有的资源l缺点:l创建过程慢、效率低l事实上,子进程复制的很多资源是不会使用到的l现代UN
21、IX内核通过引入三种不同的机制来解决这个问题xlanchen2007.9.25Linux Operating Systems Analysis44l1、写时复制技术,Copy-On-Writing,COW写时复制技术允许父子进程能读相同的物理页。l只要两者有一个进程试图写一个物理页,内核就把这个页的内容拷贝到一个新的物理页,并把这个新的物理页分配给正在写的进程xlanchen2007.9.25Linux Operating Systems Analysis45l2、轻量级进程允许父子进程共享许多数据结构l页表l打开的文件列表l信号处理l3、vforkl使用vfork创建的新进程能够共享父进程的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 分析
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。