предотвратить поток Linux от прерывания по планировщику - PullRequest
14 голосов
/ 08 апреля 2010

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

Ответы [ 5 ]

10 голосов
/ 08 апреля 2010

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

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

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

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

2 голосов
/ 08 апреля 2010

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

Переключатели контекста дешевы. Вы говорите

Я бы потратил впустую циклы процессора с переключателями контекста.

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

1 голос
/ 08 апреля 2010

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

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

1 голос
/ 08 апреля 2010

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

1 голос
/ 08 апреля 2010

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

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

...