西安电子科技大学
操作系统课程设计
(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文档