无法理解(我认为)是Linux上进程/线程调度的特殊情况。 [环境:Ubuntu 12.10,内核版本3.5.0 -...]
'test'应用程序(称之为sched_pthread)将共有三个主题 - 'main'+另外两个主题; main()将生成两个新线程:
主题1 [main()]: 运行为SCHED_NORMAL(或SCHED_OTHER)。它: 创建两个线程(下面的线程2和线程3);他们会自动继承 调度策略和主要优先级。 在循环中将字符“m”打印到终端。 终止。
主题2 [t2]: 睡2秒。 将其调度策略更改为SCHED_FIFO,将其设置为实时优先级 在命令行上传递的值。 在循环中将字符“2”打印到终端。 终止。
主题3 [t3]: 将其调度策略更改为SCHED_FIFO,将其设置为实时优先级 在命令行加上10传递的值。 睡4秒。 在循环中将字符“3”打印到终端。 终止。
我们以root身份运行它。 根据调度策略,我们应该首先看到main()print'm'大约2s,然后它应该 被t2抢占(因为它在2s后醒来)我们应该看到'2'出现在终端上大约2s,之后t3醒来(它已经睡了4s);它现在应该抢占其他所有人&向显示器发出'3';在它死后,我们应该看到'2'直到p2死亡,然后'直到main()死亡。
好吧,这很有效:当我在控制台模式下测试它时(没有X服务器)。 当然,我小心翼翼地把它当作:
sudo taskset 02 ./sched_pthrd 8
所以它实际上只在1个处理器核心上运行。
当我在图形模式下运行相同的东西(使用X)时,在初始'm's by main()之后,有一个长时间的暂停(几秒钟),在此期间屏幕上没有任何内容;然后我们突然得到了2和3并且m被打到了屏幕上! 这可以解释:X服务器(Xorg)被SCHED_FIFO线程抢占,因此无法在屏幕上“绘制”像素。
然而 - 这是最后的问题 - :为什么Xorg进程没有被调度/迁移到其他核心(以便它可以继续与RT线程并行更新屏幕)? taskset验证Xorg的cpu亲和掩码是'f'(1111b)(我的笔记本电脑上有4个核心)。
任何想法??
这是源代码: https://dl.dropboxusercontent.com/u/9301413/code_shared/so_sched_pthrd.c -要么- http://goo.gl/PLHBrC
TIA! -Kaiwan。