免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2523 | 回复: 4
打印 上一主题 下一主题

[进程管理] 调度和抢占的疑惑 [复制链接]

论坛徽章:
2
天蝎座
日期:2014-07-23 21:17:122015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-17 19:31 |只看该作者 |倒序浏览
最近有几个疑惑请大家分析下 :)

1 内核抢占和实时调度的区别是什么。
2 支持内核抢占下,disable_preempt和自旋是否等效呢。
3 若共享资源被低优先级线程占用了,能不能保证高优先级线程执行呢。
4 内核抢占的标志是。系统调用能否被中断。

论坛徽章:
0
2 [报告]
发表于 2014-05-18 00:41 |只看该作者
本帖最后由 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.  内核抢占的标志是。系统调用能否被中断?

      看不懂这个问题... 系统调用可以被中断。

论坛徽章:
2
天蝎座
日期:2014-07-23 21:17:122015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2014-05-18 13:26 来自手机 |只看该作者
感谢大牛的回复。
第一个问题中,按你的说法实时线程就非实时调度吧,因为内核抢占肯定是比FIFO晚的。
抢占点如何指定的呢,没有被disable_preempt保护的都是可抢占点??

第四个问题想问的是,只有支持内核抢占,系统调用才能被中断?

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
4 [报告]
发表于 2014-05-18 14:02 |只看该作者
回复 3# polejo


感谢大牛的回复。
第一个问题中,按你的说法实时线程就非实时调度吧,因为内核抢占肯定是比FIFO晚的。



你的实时调度指的是FIFO进程呀。
那我给你说吧,这跟内核抢占(PREEMPT)是完全两回事,以后在这来容易引起人歧义的中文处理上,一定要附上英文。

PREEMPT是指在2.6内核的一些抢占里,也支持调度。(2.4内核一旦进程调用进入内核态,就会一直等到内核相应的流程处理完成,在返回原进程前才进行一次调度的判断,在内核处理流程里就算花了一个小时内核也不调度,除内核函数主动切换。)。
FIFO进程只是一种调度策略,一单FIFO进程就绪,调度器就会优先调度FIFO进程运行,FIFO进程本身也有优先级,高优先级的FIFO先调度。另外FIFO的意思还代表相同优先级的FIFO是先进先出(先就绪先运行)的,前一个任务没有主动退出,后面的相同优先级的任务是不会得到调度的。如果你想相同优先级的进程能均衡一下CPU,就才用RR调度。

第四个问题想问的是,只有支持内核抢占,系统调用才能被中断?
上面其实也说的,如果这个系统调用调用一些会引起睡眠的函数,如锁,或主动调用schedule函数,那就算没有打开内核抢占也会发生调度(也不是说原系统调用中断了)。因此,应该说,只有支持内核抢占,才支持内核被动切换(系统调用被动中断)。


   

论坛徽章:
0
5 [报告]
发表于 2014-06-04 16:43 |只看该作者
本帖最后由 wzw200 于 2014-06-04 17:00 编辑

你把那里面的系统调用和中断,什么的都想乱了,不是那样---
比如:进程从 A-------B 执行的过程中,时钟中断,或其它中断来了,在中断处理函数里面是不能调度的,因为中断上下文里面没有进程的信息--如果调用了schedule(),将来是切不回来这个中断的进程的,

那么你可以GOOGLE一下内核调度的时机,也就是中断处理完成之后,返回来的时候,这个时候,就在进程上下文了,说白了,调度就安全了可以发生调度,这部分用汇编代码写的,他会检查自己的 needed_schedule 标志和 preemtpt抢占标志,如果置位了,就调用schedule(),看好了,不是抢占,是自己设置自己的位,把CPU让出去的,抢占说成中文让好多人理解错了,是自己设置自己的FLAG告诉内核,现在我运行在安全代码中,你可以调度,

那不安全代码是什么的,比如A-----B的过程中,刚好在一个临界区,如果在临界区里面中断了进程,中断返回的时候,就不应该发现调度了,这样可能会死锁,怎么办呢,你一般会在临界区加锁吧,加锁的那个函数会内置调用 disable_preempt函数,说明不可以抢占,其实也就是你中断返回来的时候,不要调度,因为我还在临界区里面,这样中断返回的时候,检查自己的 needed_schedule 标志和 preemtpt抢占标志,发现不能调度(抢占)这样又回到了原来的时候

不知道你看明白了没有,我在说点我的个人观点你可以把我们加锁的临界区看成是一个原子操作,中断打断他执行了,必须中断返的时候还到这个临界区执行,调度其它进程会死锁,有的临界区加锁带禁止中断的,说白了就是不让发现调度和中断--这样可能死锁,就连时间片分时的那个时钟中断处理函数也不是在里面调度的,更新完进程时候片之后,在时钟中断返回的时候,。。。。检查能不能调度

其实就是我们写的小函数
static int IsEnter=0;
int fun()
{
   if(isEnter==0)isEnter=1;
   else return 0;
  .................
  isEnter=1;
}

调度程序会看这个变量,在临界区,就不调度,



至于你说的,在系统调用的时候发现了中断,这个情况是有的,它一般返回给调用都一个特别的错叫EINT,查 网络 ACCEPT EINTR,就看到了这个情况,在调用ACCEPT的过种中刚好发生了中断怎么办,,,,这样就。。。。。
http://blog.chinaunix.net/uid-25885064-id-3071372.html
http://blog.csdn.net/yygydjkthh/article/details/7284302


http://www.cnblogs.com/hustcat/archive/2009/08/31/1557507.html
自旋也是加锁临界区,他里面也会调用disable_preempt函数


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP