




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
西安电子科技大学操作系统课程设计验4R报告实验名称: Priority-Scheduling--Task2班 级: 姓 名: 学 号:一、实验内容解决优先级反转的问题,在高优先级和低优先级之间竞争锁的问题。二、分析及设计使用多重优先级捐赠,解决优先级反转的问题。1、一个线程获得锁,如果获得这个锁的线程比自己低就提高它的优先级,如果这个锁也是被锁着,那就递归捐赠优先级,在线程释放掉锁之后,恢复未捐赠的优先级。2、在释放掉锁的时候,若优先级改变可以发生抢占。3、将信号量的等待队列实现为优先队列。4、将conditio^T等待队列实现为优先队列。5、一个线程被多个线程捐赠,保持当前优先级为捐赠优先级中最大值。6、在对一个线程设置优先级时,如果处于被捐赠状态,标riginal_priority进行设置,如果设置的优先级大于当前的优先级,改变当前的优先级,否则在捐赠完成时恢复original_priority。7、在释放锁对一个锁优先级有改变的时候应考虑其余被捐赠优先级和当前优先级。三、详细实现1、修改thread数据结构(thread.h)intbase_priority;产Basepriority.*/structlistlocks;/*Locksthatthethreadisholding.Vstructlock'lock_waiting:/*Thelockthatthethreadiswaitingfor.*/2、在lock结构体中添加成员(synch.h)rLock.Vstructlockstructthread'holder;/*Threadholdinglock(fordebugging).Vstructsemaphoresemaphore;产Binarysemaphorecontrollingaccess.*/structlist_elemelem;/*Listelementforprioritydonation.*/intmax_priority;/*Maxpriorityamongthethreadsacquiringthelock.*/3、修改lock_acquire函数(synch.c)if(lock->holder!=NULL&&!thread_mlfqs)current_thread->lock_waiting=lock;I=lock;while{I&¤tjhreadapriority>l->rrax_priority)l->max_priDrity=currentthread-apriority:threaddonatepriority(l->holder);I=l->holder->lock_waiting;sema_down{&lock->semaphore);oldlevel=intrdisable();currentjhread=thread_current();if(!thread_mlfqs)currentthread->lock_waiting=NULL;lock->rriax_priority=currentjhreadapriority:thread_hold_the_lock(lock);lock->holder=currentthread;intr_set_level(oldjevel);4、thread_hold_the_lock()函数的实现voidthread_hold_the_lock(structlocklock)enumintrleveloldjevel=intrdisable();listinsertordered(&threadcurrent()->locks,&locK->elem,cmp.;NULL);if(lock->max_priority>thread_current()->priority)threadcurrent()->priority=lock->rrax_pnority:thread_yield():)5、thread_donate_priority()函数的实现voidthread_donate_priority(structthread巧enumintrleveloldlevel=intrdisable();thread_update_priority(t):if(t->status==THREAD_READY)listremove(&t->elem);list_insert_ordered(&ready_list1 cmpdNULL):intrsetlevel(oldlevel);6、锁队列排序函数lock_cmp_priority实现boolIock_cmpj3riority(conststructlist_elem*a,conststructlist_elemvoid*auxUNUSED)returnlist_entry(a,structHock,elem)->maxjorionty>list_entry(b,structlock,elem)->maxjoriority:7、在lock_release函数加入以下语句if(Ithreadmlfqs)thread_rerrove_lock(lock);8、thread_remove_lock实现voidthread_remove_lock(structlock#lock)enumintrleveloldlevel=intrdisable();listremove(&lock->elem):thread_update_priority(threadcurrent()):intrsetlevel(oldlevel);9、thread_update_priority函数实现处理当前线程的优先级voidthreadupdatejoriority(structthread*t)enumintrjeveloldjevel=intr_disable();intmax_priority=t->basejDriority;intlockjoriority;if(!list_empty(&t->locks))listsort(&t->locks,lockcmpjDriority,NULL);lockjoriority=listentry(listfront(&t->locks),structlock,elem)->maxjDriority;if(lockjDriority>maxjDriority)maxjDriority=lockjDriority;t->priority=maxjDriority;intrsetlevel(oldlevel);10、在init_thread中加入初始化t->basepriority=priority;listjnit(&t->locks);t->lock_waiting=NULL;11、修改thread_set_prioritythreadsetpriority(intnewpriority)i(if{threadrrilfqs)return;enumintrleveloldlevel=intrdisable();structthread*current_thread=threadcurrent();intoldpriority=current_thread->priority;current_thread->base_priority=newpriority;if(listempty(¤t_thread->locks)||newpriority>oldpriority)current_thread->priority=newpriorityjthread_yield();I12、把condition的队列改成优先级队列,修改cond_signal函数if(!list_empty(&cond->walters))।(listsort(&cond->walters,condsemacmppriority,NULLj;semajjp(&list_entry(list_pop_front(&cond->walters),structsemaphoreelem,elem)->semaphore);13、比较函数的实现cond_sema_cmp_priority(conststructlist_elem*a,conststructlist_elem*b.void*auxUNUSED)丈 — —structsemaphoreelem*sa=list_entry(a,structsemaphoreelem,elem):structsemaphore_elem*sb=list_entry(b,structsemaphore_elem,elem);returnlist_entry(list_front(&sa->semaphore.waiters),structthread,elem)->priority>list_entry(list_front(&sb->semaphore.waiters),structthread.elem)->priority:14、把信号量的等待队列实现为优先级队列,修改sema_up|sema_up(structsemaphore•sema)enumintrjeveloldjevel;ASSERT(sema!=NULL);oldlevel=intrdisable();rf(!list_empty(&sema->waiters))listsort(&sema->waiters,cmp,NULL);threadunblock(listentry(list_pop_front(&sema->waiters),structthread,elem));sema->value++;threadyield();intrsetlevel(oldlevel);15、修改sema_downsema_down(structsemaphore'sema)enumintr_leveloldjevel;ASSERT(sema!=NULLi;ASSERT(!intr_context()):oldjevel=intr_disable();while(sema->value==0)listjnsert_ordered(Ssema^waiters,&thread_current()->elem,cmp,NULL);thread_block();&ema->valueintr_set_level(oldjevel);四、实验结果实现结果如图,priority全部完成passtests/threads/alarm-negativepasstests/threads/priority-changepasstests/threads/priority-donate-onepasstests/threads/priority-donate-multiplepasstests/threads/priority-donate-multiple2passtests/threads/priority-donate-nestpasstests/threads/priority-donate-semapasstests/threads/priority-donate-lowerpasstests/threads/priority-fifopasstests/threads/priorit
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 脚本写作合同范本
- 租赁合同范本与协议
- 跨区域人才交流与合作合同书
- 玉米出售合同范本
- 进销发票合同范本
- 基础拆改合同范本
- 和老板合作合同范本
- 受托支付合同范例个人
- 乳化沥青合同范例
- 三星工作室租房合同范例
- 港口散装液体危险化学品港口经营人的装卸管理人员从业资格考试
- 分子诊断技术在感染性疾病中的应用
- 中国全部城市名及拼音
- 各国安规认证大全带图标讲解
- DB32/T 4478-2023 化工废盐处理过程污染控制技术规范
- 奇门遁甲入门教程(不收费)课件
- 飞机科普知识公开课一等奖市赛课获奖课件
- 施工现场重大危险源辨识及监控措施
- 矿大毕业设计-固定式带式输送机设计
- 卵巢癌诊治指南
- 【超星尔雅学习通】《海洋与人类文明(浙江海洋大学)》章节测试题及答案
评论
0/150
提交评论