欢迎来到天天文库
浏览记录
ID:35331077
大小:63.93 KB
页数:6页
时间:2019-03-23
《操作系统实验报告,时钟原语》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、一、实验名称时钟原语的改进二、实验目的1.理解并学握Pintos的安装和使用;2.初步掌握Pintos内核线程构造及同步机理;3.具有对Pintos内核代码进行修改和调试的能力。三、实验内容及要求重新实现devices/timer.c中的timcr_sleep()函数。该函数现有的实现虽然是正确的,但所采用的是“忙等”技术,通过不停地循环调用thread_yield()并查询是否已经达到等待时间。新的实现耍求采用线程同步机制来替换这样的忙等技术。voidtimersleep(int64tticks)
2、的需求说明如下:将调用此函数的线程挂起至少ticks所指定的若干个时钟周期。当这段时间过去后,将该线程激活并放入就绪队列。此函数可用于实现实时功能,如按照规定的时间间隔发送报文等。Pintos系统时钟屮断频率的缺省值为100,我们不建议修改此值,因为不适当的设置会造成很多意想不到的错误。要求达到的指标:通过Pintos所提供的所有相关测试。四、算法设计思想(字体标为红色的为改动的代码)(一)忙等待VS.唤醒机制的实现:/*介绍实现中新声明的或者改变了的主要结构体、全局或局部变量,简短说明其设置的H的
3、?*/1.在thread,h文件中,我们在structthread结构体中添加一个新的成员变量ticks_blocked用來记录thread被阻塞了多久:struetthread{/*Ownedbythread,c.*/tid_ttid;/*线程标识符*/enumthread_statusstatus;/*线程状态*/charname[16];/*Name(fordebuggingpurposes).*/uint8_t*stack;/*Savedstackpointer.*/intpriority;
4、/*优先级*/structlist_elemelem;#ifdefUSERPROGuint32t*pagedir;ttendifunsignedmagic;};structlistelemallelem;/*Listelementforallthreadslist.*/intticks_blockod;/*存储记录该进程已经被block多久了*//*Sharedbetweenthread.candsynch.c.*//*Listelement・*//*Ownedbyuserprog/process,
5、c.*//*Pagedirectory.*//*Ownedbythread,c.*//*Detectsstackoverflow.*/1.打开thread,c,并修改threadcreate函数,添加变量ticksblocked,使得ticks_blocked初始化为0。注意添加的位置,需要在线程t创建出來之后,threadunblock之前intr_set_level(old_level);/*Initializeaddedvars*/t->ticksblocked=0;2.改动timer,c中的
6、timersleep函数Voidtimer_sleep(int64_tticks)/*让此线程等待ticks单位时长,然后再执行。参数是需要等待的时间长度*/{/*int64_tstart=timer_ticks();//记录开始时的系统时间ASSERT(intr_get_level()==INTR_ON);//断言检测,中断应为开while(timer_elapsed(start)=ticks时就返回。否则将持续占用cputhroad_yield();*/If(ti
7、cks<=0){Return;//检査用户程序中的等待时间是否有错;)enumintrleveloldlevel=intrdisable();//保存原先的中断状态(thrcad_block函数调用需要中断关闭)!structthread*curThread=threadcurrent();curThread->ticks_blocked=ticks;//线程应该阻塞(睡眠)的时间间隔thread_block();//阻塞进程intr_set_level(old_level);//恢复原先的中断状态
8、}3.thread_block函数的执行:thread_block(void)ASSERT(!intr_context());〃检查调的函数符不符合条件,不能从原文中调ASSERT(intr_get_level()==INTR_OFF);//检查屮断状态必须为关屮断thread_current()->status=THREAD_BLOCKED;〃线程阻塞态schedule();〃调度程序schedule()}1.修改timer,c屮的timer_interrupt函数
此文档下载收益归作者所有