4

В синхронной/блокирующей модели вычислений мы обычно говорим, что поток выполнения будет ждать (будет заблокирован), пока он ждет завершения задачи ввода-вывода.Ли поток, ожидающий IO, также блокирует ядро?

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

+0

@ Ryan, ye Я предположил, что может быть множество тезисов, написанных на эту тему, но я только после общего понимания того, что возможно и обычно может произойти. – JamieP

+0

Мне не нужна квалификация только для общего руководства;) – JamieP

+0

Извините, я неправильно понял. –

ответ

12

Ядро ЦП обычно не предназначено ни одному конкретному потоку выполнения. Ядро постоянно переключает процессы, выполняемые в CPU и из него. Процесс, выполняемый в настоящее время процессором, находится в состоянии «running». Список процессов, ожидающих своей очереди, находится в «готовом» состоянии. Ядро переключает их быстро и быстро. Современные функции процессора (несколько ядер, одновременная многопоточность и т. Д.) Пытаются увеличить количество потоков выполнения, которые могут быть физически выполнены одновременно.

Если процесс заблокирован I/O, ядро ​​просто отложит его (поставьте его в состояние ожидания) и даже не подумайте дать ему время в CPU. Когда ввод-вывод завершен, ядро ​​перемещает заблокированный процесс из состояния ожидания в состояние готовности, чтобы он мог иметь свой ход («запуск») в CPU.

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

+0

@RyanVincent: процесс пользовательского пространства может использовать память напрямую, без необходимости системного вызова. [Ожидание процесса при пропуске кэша все еще связывает ядро ​​процессора] (http://stackoverflow.com/questions/19980070/which-one-will-workloadusage-of-the-cpu-core-if-there-is- а-стойкий-кэш-ми). То же самое происходит, если использовать спин-блокировку с ожиданным циклом для синхронизации потоков. При ожидании чего-либо еще, ядро ​​получит уведомление. Он пробудит поток (-ы), ожидающий этот блок диска или сетевой пакет. –

+0

Кроме того, задачи с низким приоритетом в Linux всегда получают некоторый процессор. Минимальное значение prio не «только в том случае, если CPU в противном случае простаивает», чтобы избежать взаимоблокировок, если процесс низкого prio удерживается на ресурсе или что-то в этом роде.Очевидно, что поддержка истинного приоритета в режиме ожидания сделает планировщик более сложным, потому что он должен будет проверить, когда было бы безопасно полностью голодать. Таким образом, это немного замедлит планирование даже тогда, когда оно не будет использоваться, поэтому Linux не включает его. Поэтому каждый процесс, который не ждет чего-то, получит несколько тайм-листов. –

+0

@PeterCordes, спасибо за объяснение - это помогает. –

0

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

Вам нужно будет явно зарезервировать центральный процессор для определенного потока (сродства) для 1 потока для блокировки всего ЦП. Если быть более точным, увидеть это question:

Вы могли бы назвать SetProcessAffinityMask на каждом процессе, но ваши с маской, которая исключает только ядро, которое будет «принадлежать» к процессу, и использовать его на процесс, чтобы установить он запускается только на этом ядре (или, что еще лучше, SetThreadAffinityMask только на поток, который выполняет критическую для времени задачу).

+0

Affinity - это противоположность: он отмечает поток, поскольку он имеет право работать только на ограниченном наборе процессоров. Он * не останавливает другие задачи от использования этого CPU. Недавно появился вопрос о том, как зарезервировать ядро ​​для процесса, но я не могу его найти. –

+0

Вы можете использовать сродство, чтобы исключить запуск других процессов в ядре, где работает поток. – DevShark