操作系统实验报告,时钟原语.docxVIP

  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文档。上传文档
查看更多
操作系统实验报告,时钟原语

一、实验名称时钟原语的改进二、实验目的理解并掌握Pintos的安装和使用;初步掌握Pintos内核线程构造及同步机理;具有对Pintos内核代码进行修改和调试的能力。三、实验内容及要求重新实现devices/timer.c中的timer_sleep()函数。该函数现有的实现虽然是正确的,但所采用的是“忙等”技术,通过不停地循环调用thread_yield()并查询是否已经达到等待时间。新的实现要求采用线程同步机制来替换这样的忙等技术。void timer_sleep (int64_t ticks)的需求说明如下:将调用此函数的线程挂起至少ticks所指定的若干个时钟周期。当这段时间过去后,将该线程激活并放入就绪队列。此函数可用于实现实时功能,如按照规定的时间间隔发送报文等。Pintos系统时钟中断频率的缺省值为100,我们不建议修改此值,因为不适当的设置会造成很多意想不到的错误。要求达到的指标:通过Pintos所提供的所有相关测试。 四、算法设计思想(字体标为红色的为改动的代码) (一)忙等待VS.唤醒机制的实现:/* 介绍实现中新声明的或者改变了的主要结构体、全局或局部变量,简短说明其设置的目的?*/1.在thread.h文件中,我们在 struct thread 结构体中添加一个新的成员变量 ticks_blocked用来记录thread被阻塞了多久:struct thread { /* Owned by thread.c. */tid_t tid; /* 线程标识符 */enum thread_status status;/* 线程状态 */char name[16];???????? /* Name (for debugging purposes). */uint8_t *stack;?????????? /* Saved stack pointer. */int priority;???????????? /* 优先级 */struct list_elem allelem;? /* List element for all threads list. */int ticks_blocked; /* 存储记录该进程已经被block多久了*//* Shared between thread.c and synch.c. */struct list_elem elem;?????? /* List element. */#ifdef USERPROG /* Owned by userprog/process.c. */uint32_t *pagedir;???????? /* Page directory. */#endif /* Owned by thread.c. */unsigned magic;????????? /* Detects stack overflow. */ }; 2.打开thread.c,并修改thread_create函数,添加变量ticks_blocked,使得ticks_blocked初始化为0。注意添加的位置,需要在线程t创建出来之后,thread_unblock之前 intr_set_level (old_level); /*Initialize added vars*/ t-ticks_blocked = 0;3.改动timer.c中的timer_sleep函数Voidtimer_sleep (int64_t ticks) /*让此线程等待ticks单位时长,然后再执行。参数是需要等待的时间长度*/{ /* int64_t start = timer_ticks ();//记录开始时的系统时间 ASSERT (intr_get_level () == INTR_ON);//断言检测,中断应为开 while (timer_elapsed (start) ticks) //如果流逝时间=ticks时就返回。否则将持续占用cpu thread_yield ();*/If(ticks=0){Return;// 检查用户程序中的等待时间是否有错;} enum intr_level old_level=intr_disable(); //保存原先的中断状态(thread_block函数调用需要中断关闭)! struct thread * curThread = thread_current(); curThread-ticks_blocked = ticks;//线程应该阻塞(睡眠)的时间间隔 thread_block(); //阻塞进程 intr_set_level (

文档评论(0)

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

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

1亿VIP精品文档

相关文档