- 论坛徽章:
- 0
|
本帖最后由 l4rmbr 于 2014-05-18 00:59 编辑
polejo 发表于 2014-05-17 19:31 ![]()
最近有几个疑惑请大家分析下 :)
1 内核抢占和实时调度的区别是什么。
1. 内核抢占和实时调度的区别是什么?
“内核抢占”和“实时调度”不是同一类可以比较的事物。我猜你是不是想问“内核抢占(PREEMPT)”和“实时抢占(PREEMPT_RT)”的区别。
如果是的话。
1.1 支持度。内核抢占是2.6 mainline 内核开始支持的,强制调试更高优先级的进程来运行。而实时抢占到现在(v3.15)还仍然是一个out-of-tree 的补丁,并未合并进入mainline,
且有可能将来都不会合并。
1.2 激进度。 实时抢占比内核抢占更激进。内核抢占只是在一些进程上下文中插入抢占点(比如,系统调用执行完返回用户空间,完成中断处理返回,进程阻塞,进程自动调用调度
程序,等),而实时调度则在内核抢占的基础上, 进而包括临界区(如自旋锁获取期间),中断处理程序执行期间,等节点也加入了抢占点。
如果不是的话。
内核抢占是实时调度的基础。没有抢占,谈不上实时调度。
2. 支持内核抢占下,disable_preempt和自旋是否等效?
看情况。
只讨论mainline kernel。
2.1 在Uni Processor情况下, disable_preemtpt 和 spin_lock是等效的。因为在单处理器上没有处理器上的其他竞争者。但可能被抢占,抢占的进程可能会修改临界区资源,所
以此时自旋的实现只是简单地关闭了抢占。 (如果考虑上中断的情况,那也不同了,不过你只说自旋,所以这里不考虑中断的情况)
2.2 在SMP情况下, disable_preemtpt 和 spin_lock不是等效的。如果你只是简单地关闭了抢占,你依然不能保证别的处理器上的进程不会并发地修改临界区资源,
所以必须实现锁机制。
3. 若共享资源被低优先级线程占用了,能不能保证高优先级线程执行?
可以。在可抢占的内核里,这种情况是经典的“优先级反转”问题,举例:最低优先级的A获得一个锁, 然后被中优先级的B抢占了,B执行。此时有个高优先级的C要获得A持有的锁,
那么它就被阻塞了。因为B抢占了A, A没法执行,它获得的锁就没法释放。 此时出现高优先级的C在等中优先级的B执行的情况。这种现象叫做“优先级反转”。 解决方法有两种,一是关闭抢占。
二就是优先级继承,即C把A的优先级临时提升到C一样高,这样A就可以把B抢占回来,以释放锁。
4. 内核抢占的标志是。系统调用能否被中断?
看不懂这个问题... 系统调用可以被中断。 |
|