《操作系统课程设计》实验报告
1.实验内容及目标
请重新实现 timer_sleep 函数,避免忙等待的发生。
在完成之后,你可以在 threads/目录下运行 make check 命令,它会自动检查你的任务有
没有完成。如果已经完成,有 7 个检测应该是通过的,尽管还有很多没有通过。
1. 理论分析及方案设计
与本任务相关的源文件有
threads/目录下
--thread.h, thread.c:有关线程初始化、阻塞、解除阻塞,线程调度等的函数定义和实
现;
--interrupt.h, interrupt.c:与中断有关的处理函数。在 alarm_clock 任务中你需要阅读
intr_handler()函数;
. devices/目录下
--timer.h 和 timer.c:这两个文件在 alarm_clock 任务中比较重要。对定时器中断的处
理程序就在其中,还有你需要修改的 timer_sleep()函数;
避免忙等待的方法应该不止一种,我们在这里提供一种可行的方案。
要避免忙等待,把 timer_sleep()函数中的 while 循环替换掉即可。我们可以考虑将当前
的线程阻塞,等 ticks 个定时器中断结束以后再去唤醒它。当然,这个“等”不再使用
循环来实现,而是在每个定时器中断到来以后都去检查一下是否已经到了唤醒的时机。
如果时机已到,马上将其唤醒;如反之则不做任何操作,即可实现继续等待。没有了循
环调用,其他线程就可以正常在 CPU 上运行,CPU 资源就没有被浪费。
我们通过 block 操作来实现线程的暂停运行,通过 unblock 操作实现该线程的恢复运
行。
2. 实现及验证
1.在 thread 结构体中添加 block_ticks 变量。
2.改动 timer.c 中的 timer_sleep 函数
void
timer_sleep (int64_t ticks)
{
/*
《操作系统课程设计》实验报告
int64_t start = timer_ticks ();*/
ASSERT (intr_get_level () == INTR_ON);
/*while (timer_elapsed (start) < ticks)
thread_yield ();*/
if(ticks>0)
enum intr_level old_level;
//定义变量保存原先的中断状态
struct thread *t;
t=thread_current ();
t->block_ticks = ticks;
//将等待时长设置为需要等待的时间
old_level = intr_disable ();
// thread_block()方法需要关闭中断
thread_block(); //阻塞进程
intr_set_level (old_level); //恢复中断
{
}
}
3.为 timer.c 增加函数用来检查每个进程中的 block_ticks 是否为零
void
block_check(struct thread *t, void *aux UNUSED)
{
if (t->status == THREAD_BLOCKED&&t->block_ticks>0)//看这个线程是不是阻塞态
t->block_ticks--; //将等待的时间自减
if (t->block_ticks == 0)
{
}
thread_unblock (t);
//把 t 线程重新”解锁“
{
}
}
4.修改 timer_interrupt 函数,使其每次中断都对所有线程执行 block_check 函数
《操作系统课程设计》实验报告
static void
timer_interrupt (struct intr_frame *args UNUSED)//nothing 表示这个参数没用
{
enum intr_level old_level;
//和先前一样,记录原来的中断状态
old_level=intr_disable();
//forreach 函数要求关中断。
ticks++;
thread_foreach (block_check, NULL);
intr_set_level (old_level);
//恢复中断
thread_tick ();
//交给操作系统出发中断并且调度新的线程进驻 cpu。
}
3. 结论及心得体会
[对实验进行总结,并阐明本次实验带给自己的心得体会]
这次实验总的来说完成的还算顺利,只是对一些函数进行了局部的修改,对代码的阅读
量也没有太多的要求,只要明白其中的原理发现其实还是蛮简单的。做完这次试验心里高兴
自然是不必多说,终于体会到了什么是程序了,以前看的那些程序都小巫见大巫了。这次实
验还给我一种当黑客的感觉,心里着实有些激动。虽然过程有些枯燥,但丝毫不影响我的兴
趣,同时也让我深深的明白高手估计都是寂寞出来的吧!