
本帖最后由 与非朋 于 2015-1-5 23:11 编辑 6 D7 O3 H! ^4 t) a+ R5 y 最近在看马忠梅老师的cortex微控制器教程和robert love的linux内核设计与实现有点小心得,特与论坛朋友们分享,我现在在学习linux,看到自旋锁那里时,love写到自旋锁可以用在中断程序中,(但不能用信号量,信号量会睡眠),在中断中使用自旋锁的时候一定要禁止本地中断,否则中断(肯定是高级中断)可能会打断正在持有自旋锁的中断程序,可能会视图争用这个已经被持有的锁。因为是自旋锁,所以这个(高级)中断程序会在等锁可用时自旋等待,(他在等待一个被自己打断的中断函数去解这个锁,那他自然等不到,robert 管这叫双重死锁----------------------------------------与非朋注)。 ) m- K7 S" P [" Z: K& }1 z& P 今天在看cortex 微控制器教程中,说了一个类似的东西,马老师是这样说的,(亲手码字)在实时系统中,使用基于优先级的抢占式调度算法时,要特别注意对优先级反向问题进行处理。优先级反向问题体现的是高优先级等待低优先级任务占有的系统资源的反常情况。如果低优先级在运行时又被其它任务抢占,那系统运行情况会更加糟糕。 她举了个例子 / n+ _% j6 C+ z9 Q' f3 @ 任务 1: 优先级高,要使用资源S,使用完后程序结束7 ?, u% T# y7 Q. X7 C 任务 2: 优先级中,不使用共享资源S9 c6 E- {% H3 V0 {9 @5 | 任务 3:优先级低,要使用资源S,使用完后程序结束% w+ P3 c" V4 y% t2 W8 h 8 O# l% z. x3 S7 t, E% m 3个优先级任务的优先级顺序:1》2》3 三个任务的就叙顺序为:任务3首先进入 就绪状态。在任务3运行过程中,任务1和任务2都进入就绪状态。其中任务1比任务2先进入就绪状态。5 L3 T- L6 R Z3 @% d( K 接下来发生的事马老师管它叫优先级翻转 # u6 d- A& D* S- @1 L. Z 任务3首先进入就绪状态,接着内核调度后开始运行。在执行过程中使用了护持访问的共享资源S,并得到了他的互斥信号量。这是任务1优先级高于任务3的优先级,因而抢占了任务3的CPU控制权,开始执行。任务1在执行过程中也要使用共享资源S。由于任务3还没有完成对共享资源S的使用就被抢占,他还没来得及释放S的互斥信号量,因此任务1得不到S的若使用权,不得不挂起自己,(任务1挂起了自己 所以3有机会继续运行)等待共享S的信号量释放,所以任务3得以继续运行。此事就出现了优先级反转的问题。如果在任务3运行时,任务2又抢占了任务3的CPU控制权,情况进一步恶化。任务1这个高优先级的任务得不到运行,影响了系统的实时性能。: R7 m; Z+ p+ N/ U 9 X [& ?) K D- e. T ' `6 d) C K# H* } 我的理解: 其实这两种情况本质上还是一样的,都是因为高优先级的任务等待自己打断的低优先级设的锁,但是因为低优先级被打断,所以永远不会解锁,在linux中就会死锁,在实时系统中就回耽误高优先级的运行,严重影响系统的实时性。 我在看linux内核设计与实现这本书时,读到这里还不大明白,当我看到实时系统优先级翻转时,便豁然开朗,一时兴起,与论坛朋友们共享 |