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