西安电子科技大学 操作系统课程设计
(2016年度)
实 验 报 告
实验名称:Alarm-Clock 班级: 姓名: 学号:
西安电子科技大学《操作系统课程设计》实验报告 2016年度
一、实验内容
重新实现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)
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。 }
西安电子科技大学《操作系统课程设计》实验报告 2016年度
pintos在每次时间中断时(即每一个时间单位(ticks))调用一次timer_interrupt,将 cpu强制交换操作系统,即返还内核状态。
timer_sleep()中执行while()循环实现,当前时间若不满足挂起的时间要求,则调用thread_yield()函数继续循环,如果满足则直接压入就绪队列。实际上只存在两个态,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()函数,使得系统每次调用他的时候都检查一 下我的这个进程是否已经等待了足够长得时间了。如果还没有够,则不管它,如果已经足 够长了,则调用 thread_unblock()函数将它召唤回 ready_queue 中。
Running Ready 西安电子科技大学《操作系统课程设计》实验报告 2016年度
Running Block Ready
三、详细实现
1、修改thread.h,在struct_thread结构体中添加一个新的成员变量ticks_blocked用来记录 thread被阻塞了多久
2、修改thread.c,修改 thread_create函数,使得ticks_blocked初始化为0。
3、打开 timer.c文件,修改 timer_sleep 函数和 timer_interrup 函数
西安电子科技大学《操作系统课程设计》实验报告 2016年度
修改时钟中断处理函数, 加入线程sleep时间的检测
4、在 thread.c 文件中添加上面 timer_interrupt 函数中用到的函数checkInvokd 函数,并在thread.h中添加相关声明,检查调用情况。
四、实验结果
西安电子科技大学《操作系统课程设计》实验报告 2016年度
共有7个测试通过。 五、心得体会
在原本的方案中,是只有两个状态,后来自己添加的阻塞状态,和在操作系统课中学到的三种基本状态运用到实际中,运行、阻塞、就绪机制的配合,让系统真正实现管理机制,防止一直占用进程,提高系统的利用率。 参考文献
[1]斯坦福大学教学课程,pintos操作系统project详解