Как запретить запуск на определенных CPU-ядрах всех потоков любого приложения, кроме указанного мной потока?

Как запретить запуск на определенных CPU-ядрах для всех потоков любого приложения, кроме указанного мною потока (в Win/nix)?

Чтобы привязать потоки или процессы к конкретным ядрам ЦП, мы можем использовать функции OS-API: sched_setaffinity() в POSIX и SetProcessAffinityMask(), SetThreadAffinityMask() в WINAPI.

Но если мы хотим, чтобы на этих ядрах не запускались никакие другие потоки многих сторонних приложений, которые в данный момент работают в операционной системе, то как это сделать?

ОБНОВЛЕНИЕ: Нужна система реального времени - необходимо, чтобы в указанных мною потоках никогда не происходило переключения контекста или временной приостановки.

Возможные решения:

  • Используйте ОС реального времени, например QNX
  • Помимо привязки к ядрам процессора, установить приоритет реального времени
  • Используйте XEN-виртуализацию для распределения процессорных ядер между операционными системами.

Ошибка страницы легко устраняется с помощью закрепленной памяти: (POSIX) mlock() или (WINAPI) VirtualLock().


person Alex    schedule 22.08.2013    source источник
comment
Просто не пытайтесь. Давай, я укушу - какую проблему XY ты действительно пытаешься решить?   -  person Martin James    schedule 22.08.2013
comment
Я почти уверен, что в Windows или Linux нет механизмов для этого - процессор, который ничего не делает, будет справедливой игрой для планирования других потоков. Если вы хотите изолировать конкретную рабочую нагрузку, может быть лучше использовать настройку виртуальной машины и использовать ее возможности для разделения использования ЦП и памяти между виртуальными машинами.   -  person Mats Petersson    schedule 22.08.2013
comment
@Martin James Нужна система реального времени - необходимо, чтобы в указанных мною потоках никогда не происходило переключение контекста или временная приостановка.   -  person Alex    schedule 22.08.2013
comment
@Mats Petersson Но хост-ОС может использовать все ядра, и я не могу получить систему реального времени.   -  person Alex    schedule 22.08.2013
comment
Я не думаю, что ОС общего назначения могут делать то, для чего предназначены операционные системы реального времени.   -  person Mark B    schedule 22.08.2013
comment
@Alex: Это зависит от того, какую хост-ОС вы используете и как она настраивается. Я лучше всего знаком с Xen, и он позволяет вам определить определенный набор ЦП для одной ОС и определенный набор для другой ОС, а Dom0 (основная ОС) обрабатывается так же, как и любой другой домен (ОС), поэтому вы можете выбрать только процессор (ядро) 1 для хоста, остальные используются для других нагрузок.   -  person Mats Petersson    schedule 22.08.2013


Ответы (1)


Если вы настроите свой процесс и потоки на приоритет реального времени, они вытеснят все остальное. Используйте SetPriorityClass для установите приоритет процесса и SetThreadPriority для потоков, например:

SetPriorityClass(HProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(HThread, THREAD_PRIORITY_TIME_CRITICAL);
person noelicus    schedule 22.08.2013
comment
Спасибо! Мне нужно просто установить маску сходства, чтобы привязать поток к ядру ЦП и установить приоритет в реальном времени - и это решит мою проблему? - person Alex; 22.08.2013
comment
Попробуйте и дайте нам знать, как у вас дела. По-прежнему разрешено контекстное переключение ваших потоков и т. д., но маловероятно, что Windows решит сделать это с этими настройками в режиме реального времени (потому что программы редко их используют). Если бы появилась другая программа с теми же настройками, вы в конечном итоге разделили бы с ними ЦП. - person noelicus; 22.08.2013
comment
Драйверы... ошибки страницы... ОП спит. - person Martin James; 23.08.2013
comment
@Martin James Ошибка страницы легко решается с помощью закрепленной памяти: (POSIX) mlock () или (WINAPI) VirtualLock () Что вы имеете в виду, драйверы могут прерывать потоки выполнения, связанные с ядрами ЦП и с приоритетом в реальном времени? - person Alex; 23.08.2013
comment
Это правильное решение. Как отмечает Рэймонд Чен, что, если бы другая программа сделала то же самое? является актуальным вопросом. С этим ответом результатом будет то, что они делят ядро ​​между собой, если они выбирают одно и то же ядро. В противном случае они получат собственное ядро. Это правильный результат. - person MSalters; 23.08.2013
comment
@Alex: прерывания отправляются на ядро, и драйвер должен их обрабатывать. Прерывания, как следует из названия, прерывают обработку приложения. - person MSalters; 23.08.2013
comment
@MSalters Прерывание чего? Прерывание сетевого интерфейса? Все эти прерывания можно запускать на любом случайно выбранном CPU-ядре? Или только на ядре с нулевым номером, приоритетном для ОС? - person Alex; 23.08.2013
comment
@Alex: Нет, прерывания в контексте ОС/драйверов — это сообщения, отправляемые внешним оборудованием на ЦП, которые затем немедленно обрабатываются, даже если на ЦП запущено приложение. Например. если приходит сетевой пакет, сетевая карта прерывает процессор. В большинстве современных систем эти прерывания распределяются по ядрам. Представьте себе тяжелый веб-сервер - он не может обрабатывать все прерывания только с ядром 0. Это распределение обычно выполняется аппаратно, поскольку оно очень критично для производительности. - person MSalters; 23.08.2013
comment
@MSalters А могу ли я через API-ОС (POSIX/WINAPI) управлять этим распределением IRQ между процессорными ядрами? Допустим, запретить прерывания от внешнего оборудования на некоторых процессорных ядрах или разрешить только для конкретного оборудования. - person Alex; 23.08.2013
comment
Нет. Используйте для этого ОС реального времени. Кстати, POSIX не решает проблем на уровне драйверов. - person MSalters; 23.08.2013
comment
@MSalters Здесь сказано: аппаратные прерывания обслуживаются одним ядром в Linux..., прерывания не распределяются между ядрами stackoverflow.com/questions/18408363/ - person Alex; 23.08.2013
comment
@Alex: Ну, это неправильно. Большая история. Проверьте /proc/irq/<N>/smp_affinity в своей системе, чтобы увидеть, как ваш Linux/x86 распределяет прерывания. Это совсем не ново, 2.6.24 или около того. - person MSalters; 26.08.2013