logo资料库

1---17030140015+党奇伟+西电计算机操作系统课程设计实验一Alar-clock2.doc

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
一、实验内容
重新修改代码,并重新编写timer_sleep()函数,使得“忙等待”不会发生
二、分析及设计
三、详细实现
四、实验结果
五、心得体会
参考文献
[1]老师提供的关于pintos的PDF文档
西安电子科技大学 操作系统课程设计 (2019 年度) 实 验 报 告 实验名称: Alarm-Clock 班 姓 学 级: 名: 号: 1703014 党奇伟 17030140015
计算机科学与技术学院《操作系统课程设计》实验报告 一、实验内容 重新修改代码,并重新编写timer_sleep()函数,使得“忙等待”不会发生 二、分析及设计 Timer_sleep 函数原型: Void timer_sleep (int64_t ticks) { //ticks是等待时长 int64_t start = timer_ticks (); //记录初始时间 ASSERT (intr_get_level () == INTR_ON); while(timer_elapsed(start) =ticks则返回。 thread_yield (); //否则就继续占用 CPU不放。 } Timer_sleep函数利用忙等待的方法,用一个while循环不断地请求CPU来判断是 否经过了足够的时间长度。如果elapse足够的时间长度后则返回。 timer_interrupt 函数原型 static void timer_interrupt (struct intr_frame *args UNUSED){//UNUSED是一个宏,表 示参数没用 enum intr_level old_level; //和先前一样,记录原来的中断状态 old_level=intr_disable(); //forreach函数要求关中断。 ticks++; thread_foreach (block_check, 0); intr_set_level (old_level); //恢复中断 thread_tick (); //交给操作系统出发中断并且调度新的线程进驻 CPU。
计算机科学与技术学院《操作系统课程设计》实验报告 } pintos在每次时间中断时(即每一个时间单位(ticks))调用一次 timer_interrupt,将 CPU强制交换操作系统,即返还内核状态。 timer_sleep()中执行while()循环实现,当前时间若不满足挂起的时间要求,则 调用thread_yield()函数继续循环,如果满足则直接压入就绪队列。实际上只存 在两个态,Running和Ready,并没有真正意义上的睡眠与唤醒 如图: Running Ready 由于在 while() 循环中, 一直会进行 thread_yield() 操作。而在在代码 thread_yield()函数的注释中可以看到: /* Yields the CPU. The current thread is not put to sleep and may be scheduled again immediately at the scheduler's whim. */ 这也验证上面所说的线程并没有真正进入睡眠,且该线程有可能又一次立即被调 度,这样 的结果就是产生了忙等待。 解决:在 timer_sleep()函数中使线程进入 Block(阻塞) 态。系统运行一 段时间后,睡眠时间到,再对该线程进行唤醒,从 Block 态转入 Ready 态。改 造后的机制为如图。 即在 timer_sleep(函数中让该进程暂时阻塞(调用 thread_block()),
计算机科学与技术学院《操作系统课程设计》实验报告 然后过了 ticks个时间段后再把它加回到 ready queue 中。因为每一次时间中 断的时候恰好是 ticks 加一 的时候,因此我们可以改进 timer_interrup()函 数,使得系统每次调用他的时候都检查一 下我的这个进程是否已经等待了足够 长 得 时 间 了 。 如 果 还 没 有 够 , 则 不 管 它 , 如 果 已 经 足 够 长 了 , 则 调 用 Running Block Ready thread_unblock()函数将它召唤回 ready_queue 中。 三、详细实现 1、重新实现thread.h, 在struct_thread结构体中添加一个新的成员变量 ticks_blocked用来记录 thread被阻塞了多久 2、重新实现thread.c,重新实现 thread_create函数,使得ticks_blocked初始 化为0。
计算机科学与技术学院《操作系统课程设计》实验报告 3、打开 timer.c文件,重新实现 timer_sleep 函数和 timer_interrup 函数 重新实现时钟中断处理函数, 加入线程sleep时间的检测
计算机科学与技术学院《操作系统课程设计》实验报告 4、在 thread.c 文件中添加上面 timer_interrupt 函数中用到的函数 checkInvokd 函数,并在thread.h中添加相关声明,检查调用情况。 四、实验结果
计算机科学与技术学院《操作系统课程设计》实验报告 此时共有7个测试通过。 五、心得体会 通过这次实验,我充分地体会到了实践的重要性,同时也深刻地理解了 课本所学知识要应用到实践性的课程设计中的不容易。在整个的程序编写中,曾 出现过几次语法错误,让我有所迷茫,但是经过一番修改和同学们的悉心解答后, 我终于改好了代码,并实现了功能。通过实验,我这次体会到了运行、阻塞、就 绪机制的配合和相互作用在实践中的运用,将《操作系统》课程中的相关知识做 了很好的巩固和提升。这次试验受益匪浅,感谢老师、感谢学院安排的相关课程。 参考文献 [1]老师提供的关于pintos的PDF文档
分享到:
收藏