实验1:Alarm-Clock指导手册.docVIP

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

西安电子科技大学 《操作系统课程设计》 实 验 指 导 手 册 名称 作者 时间 2013-09-202013-10-22 1.任务描述 源代码devices/timer.c中有一个timer_sleep()函数。定义如下: 该函数的功能是让调用它的线程睡眠一段时间(ticks),然后唤醒。 事实上,Pintos已经实现该函数,只是使用的是“忙等待”的方法(见while循环)。 本实验的要求:重新实现timer_sleep( )函数,避免“忙等待”的发生(策略有多种,请大家设计一种并实现即可) 2.背景知识 2.1源码阅读 为顺利完成本实验,你至少需要阅读以下源代码文件(并非每一行都要读懂),并了解其中关键数据结构和函数的含义,它们是: ../src/threads/目录下: -- thread.h, thread.c:有关线程初始化、阻塞、解除阻塞,线程调度等内容; -- interrupt.h, interrupt.c:与中断有关的处理函数。 ../src/devices/目录下: -- timer.h, timer.c:本实验要修改的time_sleep( )函数就在其中,同时请注意理解定时器中断的处理过程。 2.1.1线程数据结构 在thread.h中定义了一个结构体struct thread,这个结构体用于存放的基本信息 请注意enum thread_status这个枚举类型的变量,用于线程所处的状态。 interrupt) 在操作系统原理课程的学习中,我们知道,多线程的并发执行是通过把CPU按时间片轮流分配给各个线程来实现的,Pintos也不例外。在Pintos中,定时器中断频率定义为TIMER_FREQ,也就是说,每秒有TIMER_FREQ个定时器中断。在time.h中定义为: 由此可知一个定时器中断的时长大约为10ms,这里称为一个ticks。 Pintos中一个时间片的长度 = 4*ticks ≈ 40ms。当一个线程运行了一个时间片后,它必须放弃处理器给其它的线程。那么系统是如何知道当前线程的运行时间,以及何时进行线程切换呢?现在我们便来进行一个分析。 事实上,当每个定时器中断(ticks)到来时,便会引发一次中断,系统对于这种中断的处理过程为: 通过中断管理器(汇编代码)调用intr_handker( )函数; 由intr_handler( )调用timer_interrupt( )函数。 timer_interrupt( )原型为(timer.c中): 全局变量ticks的含义:记录从系统启动到当前时刻总的定时器中断次数。 可以看出该函数的功能为:将全局变量ticks++; 然后调用thread_tick( )函数。 thread_tick( )函数(thread.c中) 代码如下: 我们暂且仅关心阴影部分代码,可以看出,该函数会使得thread_ticks变量加1,如果增加后的thread_ticks变量值不大于4(一个时间片),则返回。否则,则调用intr_yield_on_return( )函数。 thread_ticks和TIME_SLICE变量定义如下: intr_yield_on_return( )函数 该函数的功能为将yield_on_return变量置为true,并返回intr_handler( )函数,定义如下: intr_handler( )中相关代码如下: 可以看出,当yield_on_return为true时,将调用thread_yield( )函数。 thread_yield( )函数,代码如下(thread.c中): 该函数的功能为:迫使当前线程(非idle线程)放弃CPU,使其进入ready_list末尾排队,并通过schedule( )函数调度下一个线程执行。 线程切换 schedule( )函数 定义如下: 可以看到该函数通过next_thread_to_run( )来选择下一个运行线程。由于现在还没有优先级概念,此时ready_list为FIFO结构,因此选择的线程即为ready_list中头部的线程。 next_thread_to_run( )函数定义如下: 其中list_pop_front( )函数的功能为从ready_list中选择最前的结点(线程),并移除。 list_entry( )函数的功能是进行指针格式转换,使得LIST_ELEM转换为thread指针。 至此,系统已经为我们选好了下一个将要执行的线程。如果该线程符合要求,则执行switch_threads( )函数。 switch_threads( )函数(threads/switch.h) switch_thr

文档评论(0)

整理王 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档