Подтвердить что ты не робот

Предотвращать прерывание потока linux от планировщика

Как вы сообщаете планировщику потоков в Linux, чтобы не прерывать поток по какой-либо причине? Я программирую в пользовательском режиме. Просто ли блокировка мьютекса выполняет это? Я хочу, чтобы другие потоки в моем процессе не планировались при выполнении определенной функции. Они будут блокироваться, и я буду тратить циклы процессора с помощью контекстных переключателей. Я хочу, чтобы любой поток, выполняющий функцию, мог завершить выполнение без прерывания, даже если превышен лимит времени.

4b9b3361

Ответ 1

Как вы сообщаете планировщику потоков в Linux, чтобы не прерывать поток по какой-либо причине?

Не может быть сделано, вам нужна система реального времени. Закрытие вещей, которые вы получите с linux, - это установить политику планирования в планировщик реального времени, например. SCHED_FIFO, а также установить атрибут PTHREAD_EXPLICIT_SCHED. См. здесь, даже сейчас, хотя, например, Обработчики irq и другие другие материалы прервут ваш поток и запустится.

Однако, если вы только заботитесь о том, чтобы потоки в вашем собственном процессе не могли ничего сделать, тогда да, если они блокируются мьютексом, ваши текущие трюки будут достаточными.

Жесткая часть состоит в том, чтобы координировать все другие потоки, чтобы захватить этот мьютекс, когда ваш поток должен выполнить свою задачу.

Ответ 2

Вы должны архитектовать свой sw, чтобы вы не зависели от планировщика, делающего "правильную" вещь с точки зрения вашего приложения. Планировщик сложный. Он будет делать то, что он считает лучшим.

Контекстные коммутаторы дешевы. Вы говорите

Я буду тратить циклы процессора с помощью контекстных переключателей.

но вы не должны смотреть на него таким образом. Используйте многопоточное оборудование для мьютексов и блокированных/ожидающих процессов. Механизм там для вас...

Ответ 3

Вы не можете. Если бы вы могли бы предотвратить, чтобы ваш поток никогда не отпускал запрос и не голодал другие потоки.

Лучшее, что вы можете сделать, это установить приоритет ваших потоков, чтобы планировщик предпочтет его по потокам с более низким приоритетом.

Ответ 4

Почему бы просто не разрешить конкурирующим потокам блокировать, тогда планировщику нечего будет запланировать, кроме вашей живой нити? Зачем усложнять дизайн, угадывая планировщик?

Ответ 5

Посмотрите в режиме реального времени в Linux. Я никогда не делал этого, но если вам действительно нужно, это так близко, как вы можете получить в коде пользовательского приложения.

То, что вы, кажется, боитесь, на самом деле не так уж и велико. Вы не можете остановить ядро ​​от прерывания программ для реальных прерываний или задачи с более высоким приоритетом, которую нужно запустить, но при регулярном планировании ядро ​​использует собственное значение вычисленного приоритета, которое в значительной степени справляется с большей частью того, что вас беспокоит. Если поток A содержит только ресурс X (X может быть блокировкой), и поток B ожидает, пока ресурс X станет доступным, тогда эффективный приоритет будет как минимум выше, чем приоритет B. Он также принимает во внимание, если процесс использует много процессорных ядер или если он проводит много времени, чтобы вычислить приоритет. Разумеется, приятная ценность здесь тоже.