欢迎来到天天文库
浏览记录
ID:60847756
大小:1.41 MB
页数:6页
时间:2020-12-22
《西电计算机操作系统课程设计.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、西安电子科技大学操作系统课程设计(2016年度)实验报告实验名称:Alarm-Clock班级:姓名:学号:一、实验内容重新实现timer_sleep()函数,避免“忙等待”的发生二、分析及设计Timer_sleep函数原型:Voidtimer_sleep(int64_tticks){//ticks为等待的时间长度int64_tstart=timer_ticks();//记录开始时的系统时间ASSERT(intr_get_level()==INTR_ON);while(timer_elapsed(start)=tick
2、s时就返回。thread_yield();//否则将持续占用cpu。}Timer_sleep函数使用忙等待的方法,用一个while循环不断地请求CPU来判断是否经过了足够的时间长度。如果elapse足够的时间长度后则返回。timer_interrupt函数原型staticvoidtimer_interrupt(structintr_frame*argsUNUSED){//UNUSED是一个宏,表示参数没用enumintr_levelold_level;//和先前一样,记录原来的中断状态old_level=intr_disable();//forreach函数要求关中
3、断。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和R
4、eady,并没有真正意义上的睡眠与唤醒如图:RunningReady由于在while()循环中,不断的进行thread_yield()操作。通过查看源代码中thread_yield()函数注释:/*YieldstheCPU.Thecurrentthreadisnotputtosleepandmaybescheduledagainimmediatelyatthescheduler'swhim.*/这也验证上面所说的线程并没有真正进入睡眠,且该线程有可能又一次立即被调度,这样的结果就是产生了忙等待。解决:在timer_sleep()函数中使线程进入Block(阻塞)态。
5、系统运行一段时间后,睡眠时间到,再对该线程进行唤醒,从Block态转入Ready态。改造后的机制为如图。即在timer_sleep(函数中让该进程暂时阻塞(调用thread_block()),然后过了ticks个时间段后再把它加回到readyqueue中。因为每一次时间中断的时候恰好是ticks加一的时候,因此我们可以改进timer_interrup()函数,使得系统每次调用他的时候都检查一下我的这个进程是否已经等待了足够长得时间了。如果还没有够,则不管它,如果已经足够长了,则调用thread_unblock()函数将它召唤回ready_queue中。Running
6、BlockReady三、详细实现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、情况。四、实验结果共有7个测试通过。五、心得体会在原本的方案中,是只有两个状态,后来自己添加的阻塞状态,和在操作系统课中学到的三种基本状态运用到实际中,运行、阻塞、就绪机制的配合,让系统真正实现管理机制,防止一直占用进程,提高系统的利用率。参考文献[1]斯坦福大学教学课程,pintos操作系统project详解
此文档下载收益归作者所有