Планирование процессов / потоков в Linux: X-сервер не работает на других ядрах процессора?
Я не могу понять (что я думаю) особую ситуацию с планированием процессов / потоков в Linux. [Env: Ubuntu 12.10, версия ядра 3.5.0-... ]
Тестовое приложение (назовите его sched_pthread) будет иметь в общей сложности три потока: "основной" + два других; 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' в течение приблизительно 2 с, затем он должен быть вытеснен t2 (как он пробуждается после 2 с), и мы должны видеть, что '2' появляется на терминале в течение приблизительно 2 с, после который просыпается t3 (4 часа спал); теперь он должен выгружать всех остальных и выдавать "3" на дисплей; после того, как он умирает, мы должны видеть "2" до тех пор, пока не умрет p2, а затем "м" до тех пор, пока main () не умрет.
Итак, все работает: когда я тестирую его в режиме консоли (без X-сервера). Конечно, я забочусь, чтобы запустить его как:
sudo taskset 02 ./sched_pthrd 8
так что в действительности он работает только на 1 ядре процессора.
Когда я запускаю то же самое в графическом режиме (с X), после начальных m по main(), возникает длительная пауза (несколько секунд), во время которой на экране ничего не появляется; затем внезапно мы получаем 2 и 3, и м хлопали по экрану!Это можно объяснить: X-сервер (Xorg) был вытеснен потоками SCHED_FIFO и, следовательно, не мог "рисовать" пиксели на экране.
Тем не менее - вот наконец-то и возникает вопрос: почему процесс Xorg не был запланирован / перенесен на какое-то другое ядро (чтобы он мог продолжить обновление экрана параллельно с потоками RT)? taskset проверяет, что маска сродства процессора Xorg имеет значение 'f' (1111b) (у меня на ноутбуке 4 ядра).
Есть идеи??
Вот исходный код: https://dl.dropboxusercontent.com/u/9301413/code_shared/so_sched_pthrd.c-или- http://goo.gl/PLHBrC
ТИА! -Kaiwan.