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

Что подразумевается под "блокировкой системного вызова"?

В чем смысл "блокировки системного вызова"?

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

4b9b3361

Ответ 1

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

Ответ 2

Для блокирующего системного вызова вызывающий абонент не может ничего сделать, пока системный вызов не вернется. Если системный вызов может быть длительным (например, включить IO файла или сетевой ввод-вывод), это может быть плохо (например, представьте, что неудовлетворенный пользователь забивает кнопку "Отмена" в приложении, которое не отвечает, потому что этот поток заблокирован в ожидании пакет из сети, которая не прибывает). Чтобы обойти эту проблему (чтобы сделать полезную работу, пока вы ждете возврата системного вызова блокировки), вы можете использовать потоки - в то время как один поток заблокирован, другой поток /s может продолжать делать полезную работу.

Альтернативой является неблокирование системных вызовов. В этом случае системный вызов немедленно возвращается (почти). Для длинных системных вызовов результат системного вызова либо отправляется вызывающему абоненту позже (например, как какое-то событие или сообщение или сигнал), либо позже опрошено вызывающим абонентом. Это позволяет вам иметь один поток, ожидающий завершения множества разных длинных системных вызовов одновременно; и избегает проблем нитей (и блокировки, условий гонки, накладных расходов на переключатели резьбы и т.д.). Тем не менее, это также увеличивает проблему, связанную с получением и обработкой результатов системного вызова.

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

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

Ответ 3

Я бы предложил прочитать этот очень короткий текст: http://files.mkgnu.net/files/upstare/UPSTARE_RELEASE_0-12-8/manual/html-multi/x755.html В частности, вы можете прочитать, почему блокирование системных вызовов может быть проблемой с потоками, а не только с параллельными процессами:

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

Надеюсь, что это поможет.