2013-10-11 3 views
17

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

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

ответ

20

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

+0

is is означает, что когда пользовательский поток использовал этот системный вызов блокировки, он будет ждать (этот поток заблокирован), а другой пользовательский поток может отображать в поток ядра, который был сопоставлен предыдущим? – sam

+0

Я понятия не имею, какой курс вы принимаете или что он пытается вам сказать, но я бы так подумал. Многопотоковая многопоточная модель связывает несколько пользовательских потоков с одним потоком ядра. Если этот поток ядра находится в системном вызове блокировки, то все связанные с ним потоки пользователей также должны ждать.Это неверно для модели «один-к-одному», поскольку все потоки пользователей имеют свой собственный поток ядра, поэтому, если один поток ядра заблокирован, другой может сделать что-то еще. –

+0

У меня есть почти такой же вопрос. если это модель «много-к-одному», и если пользовательский поток хочет сделать системный вызов блокировки. Останутся ли все остальные потоки? (могут ли только потоки ядра вызывать системный вызов?) – user5954246

12

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

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

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

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

+0

Какова связь неблокирующей системы звонки и операции с разделенной фазой? Второй - это просто небольшое подмножество первого? Есть ли какие-либо другие операции, связанные с неблокирующими системными вызовами? Или это одно и то же? заблагорассудится! – Novemberland

3

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

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

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

Смежные вопросы