Chinaunix首页 | 论坛 | 博客
  • 博客访问: 303589
  • 博文数量: 35
  • 博客积分: 836
  • 博客等级: 准尉
  • 技术积分: 678
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-07 20:11
文章分类

全部博文(35)

文章存档

2013年(1)

2012年(24)

2011年(10)

分类: LINUX

2012-02-15 22:52:34

上一篇博客写了优先级反转,结果到最后由于语言组织不下去了,还没介绍怎么搞定的就匆匆结束了博客。回来的路上越想越觉得不对劲,这篇准备继续介绍下优先级反转的问题。

为了说明有限级反转的问题,对其搞个模型出来吧。

定义任务命名格式为:T1,T2,T3...

定义mutex的命名格式为:L1,L2,L3...

T1->L1:这种符号表示任务T1想要获得mutex L1
L1->T1:这种符号表示mutex L1被任务T1所占有

在系统的正式运转过程中,一个任务只能阻塞到一个mutex上,但是一个任务却能够同时占有多个mutex,一个mutex能够有多个任务阻塞,但是只能有一个任务获得


  1. L1-+
  2.       |
  3.       +->T1->L3
  4.       |
  5. L2-+
上图关系表示任务T1已经占有L1,L2两个mutex,而又要获得L3 mutex。

如果只考虑上篇博客中的例子,那么处理优先级反转问题还是比较简单的。但实际系统中的运行情况可能一场复杂。如图所示,可能出现下列的情况

  1. T1->L1->T2->L2->T3->L3-+
  2.                                              |
  3.                                              + - >T4->L4->T5(执行中)
  4.                                              |
  5.                 T6->L6->T7->L7-+
上述只是一个复杂情况的示例,可能实际运行中情况还会更复杂。在任务与互斥锁形成的请求链表中,最后形成的应该是个树形结构,其原因就是任务能有多个入口一个出口,而互斥锁同样会有多个任务请求,而仅有一个任务能够获得互斥锁。

对于上述这种结构的要实现优先级反转机制的一种方法就是:
1)当有新任务请求互斥锁被阻塞时,由此任务一直向树的跟节点遍历,修改路径上所有任务的优先级。
2)在路径遇到比自己优先级低的任务,更新任务优先级,并且修改优先级后的任务在所阻塞的mutex的优先级队列上重新执行入队操作。因为阻塞在此mutex上还会有其他的任务,此时由于继承了新的任务优先级,所以此时需要重新排队。
3)当遇到与自己优先级一样的任务时退出遍历程序。

当树的根节点执行之后释放相应mutex时,则从此mutex中选择一个高优先级的任务获得此muex。


上述大致将rtmutex进行优先级反转算法的大致思路描述了一遍,自已也曾想过能不能使用更加高效的方式完成此功能,无奈自己功力有限啊,啊,啊...

rtmutex除了优先级反转这里比较复杂外,其他中规中距,不难理解。如果有机会或者时间,再完善其后续内容。


阅读(3218) | 评论(0) | 转发(0) |
0

上一篇:linux rtmutex分析

下一篇:LPC-trie

给主人留下些什么吧!~~