- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验1:Alarm-Clock 黄伯虎 任务描述 源代码devices/timer.c中有一个timer_sleep 函数。定义如下: 任务描述 本实验任务: 重新实现timer_sleep 函数,避免“忙等待”的发生 策略有多种,请大家设计一种并实现即可 相关源代码 为顺利完成本实验,你至少需要阅读以下源代码文件 并非每一行都要读懂 ,并了解其中关键数据结构和函数的含义,它们是: ../src/threads/目录下: thread.h, thread.c:有关线程初始化、阻塞、解除阻塞,线程调度等内容; interrupt.h, interrupt.c:与中断有关的处理函数。 ../src/devices/目录下: timer.h, timer.c:本实验要修改的time_sleep 函数就在其中,同时请注意理解定时器中断的处理过程。 数据结构 thread.h中定义了一个结构体struct thread,这个结构体用于存放线程的基本信息 数据结构 Pintos中线程的状态有四种,threads.h中定义如下: 系统的驱动 驱动力:定时器中断(timer interrupt) 定时器中断频率 time.h : 中断处理过程 中断处理过程 其它需关注函数 thread_current 获取当前的线程的指针。 thread_foreach thread_action_func *func, void *aux 遍历当前ready queue中的所有线程,并且对于每一个线程执行一次func操作(注意到这里的func是一个任意给定函数的指针,参数aux则是你想要传给这个函数的参数)。实际上Pintos中所有ready的线程被保存在一个链表 ready_list 中,这个函数做得不过是遍历了一遍链表而已。注意这个函数只能在中断关闭的时候调用。 其它需关注函数 thread_block 和thread_unblock thread *t 这是一对儿函数,区别在于第一个函数的作用是把当前占用CPU的线程阻塞掉(放到waiting queue里面);第二个函数作用是将已经被阻塞掉的进程t唤醒到ready队列中。 timer_ticks 返回自从系统启动经过的时间量 以ticks为单位 。 timer_elapsed 返回自某个时刻起经过的时间量(以ticks为单位)。 一种策略 要求 基本要求:实现本讲义中策略 同时我们鼓励提出新的策略并尝试实现! 实验结果测试 进入 ../printos/src/threads/目录,运行#make check命令,它会自动检查你的任务有没有完成。如果已经完成,应有7个检测通过 Xidian University OS Curriculum Design 《操作系统课程设计》 CPU 该函数的功能是让调用它的线程睡眠一段时间 ticks ,然后唤醒。 事实上,Pintos已经实现该函数,只是使用的是“忙等待”的方法 见while循环 。 由此可知一个定时器中断的时长大约为10ms,这里称为一个ticks。 Pintos中一个时间片的长度 4*ticks ≈ 40ms。当一个线程运行了一个时间片后,它必须放弃处理器给其它的线程。那么系统是如何知道当前线程的运行时间,以及何时进行线程切换呢? Timer interrupt 系统接受到后调用intr_hannder 调用timer_interrupt intr_handler 中 CPU wait ready 下次实验课大家一起探讨! * * * *
文档评论(0)