препятствуйте тому, чтобы поток Linux был прерван планировщиком

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

14
задан johnnycrash 7 April 2010 в 20:36
поделиться

5 ответов

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

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

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

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

10
ответ дан 1 December 2019 в 14:11
поделиться

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

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

, что я буду тратить циклы процессора на переключение контекста.

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

2
ответ дан 1 December 2019 в 14:11
поделиться

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

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

1
ответ дан 1 December 2019 в 14:11
поделиться

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

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

1
ответ дан 1 December 2019 в 14:11
поделиться

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

1
ответ дан 1 December 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: