- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
priority donate 三种实现方法
Priority-Donation 的三种方法作者:西安电子科技大学 王永刚 QQ:357543420要考虑的情况:定义以下优先级 H2H1L在struct thread中加入Bool Donated; //是否接受过捐献Struct list LockList; //占有的锁Int OldPri; //原来的优先级在struct lock中加入Struct list_elem elem; //用于插入链表Int priority; //因为这个锁捐献的最高优先级Struct lock BlockReason;//多个不同优先级的线程申请同一个锁,在锁中只保存最高优先级 情况一:单一捐献 设X线程优等级L,申请”锁 A”,申请时,在 “锁A” 中保存 ”X线程” 的struct thread *指针到 ”锁 A” 的holder的变量中。也就是记录了占有锁A的线程; 锁没被任何线程占,则为NULL). 得到锁A, X线程处于 ready状态把A锁加入X线程的 LockList中; A-priority=x-priority;List_insert_ordered(x-LockList,A-elem);“线程Y”开始运行,优先级为H1,申请”锁A”发现 锁A 被 X线程 占有,且 H1L, 所以 捐献优先级:如果X没接受过捐献,保存X原来的优先级;否则把X的优先级改为H1If(H1A-priority) A-priority=H1;If(H1X-priority){If(!Donated) { Donated=true; X-OldPri=x-priority;}X-priority=H1;}保存 锁A 到X线程中List_remove(A-elem);List_insert_ordered(x-LockList,A-elem);X线程释放 锁A 在X的LockList找到锁A, List_remove(A-elem);If(!list_empty(X-LockList)) X-priority= list_entry(list_front(X-LockList)),struct lock,elem)-priority;Else X-priority=X-OldPri;情况二:多重捐献在上边的基础上“线程Z”开始运行,优先级为H2,申请”锁A”发现 锁A 被 X线程 占有, 捐献优先级:①如果X没接受过捐献,保存X原来的优先级;否则把X的优先级改为H1If(H1A-priority) A-priority=H1;If(H1X-priority){If(!Donated) { Donated=true; X-OldPri=x-priority;}X-priority=H1;}保存 锁A 到X线程中List_remove(A-elem);List_insert_ordered(x-LockList,A-elem);X线程释放 锁A 在X的LockList找到锁A, List_remove(A-elem);If(!list_empty(X-LockList)) X-priority= list_entry(list_front(X-LockList)),struct lock,elem)-priority;Else X-priority=X-OldPri;情况二的复杂情形:①设X线程优等级L,申请”锁 A”,申请时,在 “锁A” 中保存 ”X线程” 的struct thread *指针到 ”锁 A” 的holder的变量中。也就是记录了占有锁A的线程; 锁没被任何线程占,则为NULL). 得到锁A。 同样,X线程又申请到了锁B. X线程处于 ready状态② “线程Y”开始运行,优先级为H1,申请”锁A”“线程Z”开始运行,优先级为H2,申请”锁B” 照情况一处理X线程可能先释放锁A,也可能先释放锁B. 把LockList中的锁A remove掉把LockList中队首锁的priority给X线程如果队空,则把OldPri给X线程.情况三、递归 嵌套捐献X占有锁A; Y占有锁B,又申请锁A, 把自己的优先级捐给X后被阻塞; Z又申请锁B,把自己的优先级捐给Y,发现Y被阻塞,又把优先级捐给X, 然后被阻塞。X 占有sema AY占有 锁B,申请 sema AZ申请锁B,
文档评论(0)