多用户环境调度续.pptVIP

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
多用户环境调度续

第六章. 系统调度,COW Fork和IPC (lab4) 提纲 多用户环境调度 COW Fork (写时拷贝环境创建) 用户环境间通讯(IPC) 多用户环境调度 Idle 环境及yield RR (Round-Robin) Scheduling 子进程的创建(Dumb Fork) 多用户环境调度(续) Idle 用户环境 #include inc/x86.h #include inc/lib.h void umain(void) { binaryname = idle; while (1) { sys_yield(); breakpoint(); } } 多用户环境调度(续) sys_yield的执行路线 多用户环境调度(续) yield 放弃本用户环境的执行 选择“适当”的用户环境投入运行 “适当”应该根据具体的调度算法进行 多用户环境调度(续) RR (Round-Robin) Scheduling 循环轮转算法 应该寻找除了释放CPU的当前用户环境(curenv)和idle用户环境之外的“下一个”用户环境投入运行(采用env_run),在找不到的情况下将idle用户环境投入运行(breakpoint)。 由于idle用户环境占据了envs[0],应该在envs[1]到envs[NENV-1]之间寻找“下一个”用户环境。 完成sched_yield(void)函数 多用户环境调度(续) 子进程的创建(Dumb Fork) 完成sys_exofork(void)函数 分配用户环境管理数据结构 将创建的子环境的上下文设置为当前用户环境的上下文 设置创建的子环境的状态为ENV_NOT_RUNNABLE 完成空间分配和映射等辅助函数 sys_env_set_status (设置状态) sys_page_alloc (为用户态环境分配页面) sys_page_map (建立页面的映射关系) sys_page_unmap (取消页面的映射关系) 多用户环境调度(续) Dumb Fork (user/dumbfork.c) 思考: 如何让父环境在调用sys_exofork( ) 后返回子环境的envid,而子环境返回0? 如何通过页面分配和拷贝实现子用户环境的运行? UTEMP的作用是什么?这里能不能用UTOP? 修改kern/init.c运行dumbfork.c COW Fork COW的概念 User Trap Frame的设置 用户态页面失效处理 Fork COW Fork(续) COW的概念 在dumb fork中,JOS采用的是全拷贝的方法(从UTEXT到end)来运行子环境 然而通过复制父环境的方法来提供子环境的运行上下文会是相当重负载的 特别是当子环境创建后,需要加载不同于父环境的代码和数据开始运行的情况(如通过Shell的exec创建的子环境) 考虑三种类型的段:代码段、数据段(包括附加数据段)、堆栈段。其中代码段是完全不需要拷贝的,只需要映射即可。 采用写时复制技术(即当有数据更新的时候才复制整个被写的页面)来完成子环境的创建 COW Fork(续) COW的概念(续) 因为写时复用技术的采用,就需要对子环境对页面的写操作进行截获 完成这项工作,最简单的办法就是利用缺页中断 JOS中采用的是用户级缺页中断处理的方法 在子环境的管理数据结构中定义回调函数env_pgfault_upcall,用户环境通过调用sys_env_set_pgfault_upcall系统调用来设置自己的缺页中断处理函数,并让内核态的中断处理过程调用被登记的中断处理函数。 思考:JOS采用这种用户级的缺页处理方法的优缺点是什么? COW Fork(续) User Trap Frame的设置 思考: 1. 为什么要设置User Trap Frame? 2. 如何设置User Trap Frame,为什么要通过这样的办法来设置? 3. 如何判断是不是nested page fault 4. 当从内核态回到用户态的时候,如何跳到用户态的页面失效处理函数入口? 完成: lib/pgfault.c的set_pgfault_handler( void (*handler)(struct UTrapframe *utf)) kern/syscall.c的 sys_env_set_pgfault_upcall (envid_t envid, void *func) kern/trap.c的page_fault_handler (struct Trapframe *tf) COW Fork(续) 用户态页面失效处理 注意:用户态页面失效处理过程

文档评论(0)

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

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

1亿VIP精品文档

相关文档