2023年山东大学计算机学院操作系统实验报告.docx
《2023年山东大学计算机学院操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《2023年山东大学计算机学院操作系统实验报告.docx(46页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、操作系统课程设计报告000000000000学院:计算机科学与技术学院 专业:计算机科学与技术 班级:20* *级*班姓名:* * * * * * 规定线程被唤醒后立即执行它,只是在它等待了指定期间后将它。放入等待队列 中。不要通过产生任何附加的线程来实现wai t Unt i 1函数,你仅需要修改 waitUntil函数和时间中断解决程序。w a it U ntil函数并不仅限于一个线程使用 在任意时间,任意多的线程可以调用它来阻塞自己。3 .方案于Al a r m类有关的是machin e.Tim e r类.它在大约每500个时钟滴 答使调用回调函数(由T i mer.se11 nterr
2、uptHand 1 er函数设立).因此 A 1 arm类的构造函数中一方面要设立该回调函数Ala r m.timerln t errup t ().为了实现w a itUnti 1,需要在Al a r m类中实现一个内部类Waiter,保 存等待的线程及其唤醒时间在调用waitU ntil (x)函数时,一方面得到关于该 线程的信息:(线程:当前线程,唤醒时间:当前时间+ x),然后构造新的 Waite r对象,并调用s leep操作使当前线程挂起.在时钟回调函数中(大约 每5 0 0个时钟间隔调用一次)则依次检查队列中的每个对象。假如唤醒时间 大于当前时间,则将该对象移出队列并执行wa k
3、 e操作将相应线程唤醒。4 .实现代码class Wa i ter(Wai t er( 1 ong wa keTime,KThread threa d)(0thi s.wak e Tim e = wa k eT i me;0 thi s . t hread=thread;)p r i v a te 1 ong wa k eTime;private KTh r ead th r ead;)pub 1 i c void waitUntil(long x)(boolea n intSta t us = Mach i ne.i nter r u pt() . d i sable();4 o ng wa
4、ke T i me = Ma c h i ne.time r ().g etTime() + x;Waiter wa iter = new Waite r (wakeTime,KThread.cu r r entT hread();owa itli s t .a dd(w a iter);System.out.p r in t ln(KTh r ead.cu r ren t Th read() .getName() 。线程休眠,时间为:+ 1/13为沿6上面6().9 t Time() + ”,应当在 。+ wakeT ime+“醒来.”);oKThread. s 1 eep();M a ch
5、ine . inte r r u p t () .r e sto r e(in t Sta tus);)pu bli c vo i d t imerlnterrup t ()Wa i ter wai ter;fo r (in t i = 0;iwaitlist . size () ; i+ +)wa i ter=wai 11 i s t .remov e ();df ( wa i t e r. wakeTime= Ma c hi n e . timer().ge t Time()(System . out.pri n tin(唤醒线程:+w a iter.th r e a d.g e tNam
6、e() + ,时间为:+ M a c h i ne.timer().g etTimeO);。wa ite r . t h r ead. r ead y (); /线程进入就绪状态e Isewai t lis t . add(waiter);)oKT hread. c u rrentTh r ead(). y i eld();)p ri v ate Li n k e dList waitl i st;Ta s kl.4用条件变量,不使用信号量,实现同步发送接受消息,s p ea k , I i sten1.规定使用条件变量来实现一个字长信息的发送和接受同步。使用void spea k(i n t
7、 word)和 i n t list e n()函数来实现通讯(Commun i c ator)类的 通讯操作。speak函数具有原子性,在相同地Communica t or类中档待listen 函数被调用,然后将此字发生给listen函数。一旦传送完毕,两个函数都返回(1 isten函数返回此字I.分析对一个Commun i ca t or类的对象cz线程A先调用c.spea k er(x )发送 一个字后被挂起,直到另一线程B调用c .listen ()收到这个字x后,A和B 同时返回.类似地,线程B先调用c. 1 i st e n (x)后被挂起,直到另一线程B 调用c . s pea
8、ke r (x)发送一个字后,A和B同时返回.同时需要注旨在一 个C omm u nica t or上有多个s pake r和lis t ener的情形.此时的spea k e r和1 is t ene r只能是一对一的,即一个speaker只能将数据发送到一个I i s t ene r,一个listen e r也只能接受来自一个s p ekaer的数据,其余的 speakers和liste n e r s都需要等待.2 .方案每个Communi ca t or有一个锁(保证操作的原子性)和与该锁联系的两 个条件变量用于保证spea k e r I i s t en e r间的同步.在spe
9、a k函数中, 一方面检查若已有一个s pea k er在等待(s peaknum 0)或无lis ten e r 等待,则挂起.否则设立变量,准备数据并唤醒一个listener.在listen函数中, 增长一个listen e r后,一方面唤醒s peaker,然后将自己挂起以等待sp eake r准备好数据再将自己唤醒.这个问题其实是一个缓冲区长度为0的生产者/消费者问题.3 .实现代码p u blic Comm uni cator ()(loc k = n e w Lock();con = new Condition (lock);)publi c void spea k (int wo
10、rd)(loc k.acquireQ;if(spe a k n u m 01| 1 isten num=0)(spea k num + +;oc 0n. s leep ();)if ( 1 istennum0)(。c on.wakeAl 1();d i s ten num = 0;)this.word=wo r d ;Sys t em.o u t.pri n 11 n ( KT h read.curren t T h r ead().g e tN a me()+线程说+this.wo r d);1 o c k.re 1 ease();)p u b 1 i c int li s ten()(lo
11、ck.acquire();while(listennum0| | speaknum =O)(dis t en n um + +;con.sleep ();listen num -;)if(speaknum0)(o c on.wake ();spea knum-;)KTh r ead. c urrentTh r ead ().y i e ld();Sy s tern .o ut.println(KTh r ead.cu r rentTh r ead().g etName()+ ” 线程听到+this.w。r d);list ennum = O;1 ock . re 1 e ase();retu
12、r n this . word ;)p rivat e Lock loc k;private Cond it ion con;pri vate int word;pr i vate static int speaknum;pri vate s tati c int I i sten n um ;T a skl.5完毕P ri。r i t y S cheduler实现优先级调度.规定通过完毕P r io ritySchedu 1 er类在Nacho s中实现优先级调度(pr i or i ty sched uling)o优先级调度是实时系统中的关键构建模块。1 .分析在Nachos中,所有的调度
13、程序都继承抽象类S c heduler.系统已经提供 了一个简朴的轮转调度器Round RobinScheduler,它对所有线程不区分优 先级而采用简朴的FIFO队列进行调度.我们实现的优先级调度类PrioritySched u 1 er 也Z嵌承自 S c heduler. 优先级调度的传统算法如下:每个线程拥有一个优先级(在Nachos中,优先 级是一个0到7之间的整数,默认为1).在线程调度时,调度程序选择一个拥 有最高优先级的处在就绪状态的线程运营.这种算法的问题是也许出现饥 饿现象:设想有一个低优先级的线程处在临界区中运营而高优先级的线程在 临界区外等待.由于前者优先级较低,它也许
14、不会被调度器选中从而高优先级 的线程也不得不浪费时间等待.为解决上述优先级反转问题,需要实现一种让出优先级的机制 (Priority Donation):提高拥有锁的低优先级线程的优先级以使它迅速完 毕临界区,不使其它较高优先级的线程等待太久.提高后的优先级称为有效优 先级,它可以不断变化.实际调度时就是以有效优先级为评判标准的.2 .方案SThread State类中增长两个表即Li n kedLi s t类,存放的对象是P r i orityQu e ue,即优先级队列对象。一个表用来记录该线程所占用资源的优先 队列r esou r cesIHave,另一个表用来记录该线程所想占有的资源的
15、优先队列 resou r ceIWant0 resourc e sIHa ve作为发生优先级反转时,捐献优先级 计算有效优先级的来源依据,res。urc elWant用来为线程声明得到资源做准 备。wait ForAccess()将需要等待获得资源的线程加入一个等待队列等待调度。g e tEffectiveP r iority ()计算有效优先级时,遍历等待队列中所用线程的 有效优先级,找出最大的优先级即可。3 .实现代码p u bli c void wa i t For A cce s s ( Priori t yQueu e w a i tQueue )wa i tQue u e.wait
16、Que ue.ad d (thi s .threa d);if (IwaitQueu e.t r ansferPriority)waitQ u e u e.l o ckHol d er. e f f ectiveP r io r i ty = e x piredEff ect i vePrio r i ty ;)publi c void acq u i re (Prio r i tyQueu e waitQ ueue)(waitQueue.waitQueue. r emove (t his . t h read);wai t Queue . Ioc kHo 1 der = this;wa i
17、t Queue.lo c kHolder. effec t ivePriority = exp i redE f f ectiveP r iori t y ;wa i tQu e u e . 1 oc k Holder.wa iters = wa i t Queu e;)pu b 1 ic in t g et E f f e ct i vePr i o r i t y()(if (ef f ecti v ePri o r ity != expiredEffectivePriority)。 return effe c tivePrio r i t y;e f feet i v e P ri o
18、r ity = p riority;if (wa i te r s = = null)retu r n effe ctivePrio r ity;fo r (It e rato r i = waiters.wa i tQ u eue.ite r a t o r (); i. h a s N ext();)(Threa d S t ate ts = g e tThre a dState (KT h re a d ) i.next ();i f (ts.pr iorityeffective Prior ity)(effec t i veP r ior i t y = t s.pr i ority;
19、)r e turn ef f ect i v e Prio r ity;)protec tedinteffecti vePriority = expired E f f ect i veP r io r i t y;p r otected static f i na 1 int e x piredE f f ec t ive Prior ity =- 1;目录实验平台4一 Projectl线程系统4Taskl.l 实现 KThread.join()41 . 要求42 .分析43 .方案44 .实现代码4Taskl.2利用中断提供原子性,直接实现条件变量61 . 要求62 .分析63 .方案74
20、 .实现代码7Taskl.3 实现 waitUntil91 . 要求92 .分析93 . 方案104 .实现代码10Taskl.4用条件变量,不使用信号量,实现同步发送接收消息,speak , listen121 . 要求122 .分析133 . 方案134 .实现代码14Taskl.5完成Priorityscheduler实现优先级调度161 . 要求162 .分析163 . 方案174 .实现代码17323232三Project2多道程序设计protected P riori t yQu eue wait e r s = null;1.实1.2.求析案现 .322.3.4.isk:3233
21、代码36411.2.实2.3.(求析案现 .41423.4.42代码43isk;511.2.3.实一求折案现5151514.代码S3publ i c KThrea d n extT h re a d ()(L i b.a s sert Tru e (Ma c hine.in t er r upt ( ) .disabled();oif (pi c kNextTh r ea d() = n u II)。 return null;oKThread t hre a d = p i ckNextTh r ead ().t h re a d ;getThreadS t ate(thre a d) . a
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 山东大学 计算机 学院 操作系统 实验 报告
限制150内