Для блокирующего системного вызова вызывающий абонент не может ничего сделать, пока не вернется системный вызов. Если системный вызов может быть длительным (например, включить IO файла или сетевой ввод-вывод), это может быть плохо (например, представьте, что неудовлетворенный пользователь забивает кнопку «Отмена» в приложении, которое не отвечает, потому что этот поток заблокирован в ожидании пакет из сети, которая не прибывает). Чтобы обойти эту проблему (чтобы сделать полезную работу, пока вы ждете возврата системного вызова блокировки), вы можете использовать потоки - в то время как один поток заблокирован, другой поток/s может продолжать выполнять полезную работу.
Альтернативой является неблокирование системных вызовов. В этом случае системный вызов немедленно возвращается (почти). Для длинных системных вызовов результат системного вызова либо отправляется вызывающему абоненту позже (например, как какое-то событие или сообщение или сигнал), либо позже опрошено вызывающим абонентом. Это позволяет вам иметь один поток, ожидающий завершения множества разных длинных системных вызовов одновременно; и избегает проблем нитей (и блокировки, условий гонки, накладных расходов на переключатели резьбы и т. д.). Тем не менее, это также увеличивает проблему, связанную с получением и обработкой результатов системного вызова.
Можно (практически всегда) написать неблокирующую оболочку вокруг системного вызова блокировки; где обертка запускает поток и возвращает (почти) немедленно, а порожденный поток выполняет системный вызов блокировки и отправляет результаты системного вызова исходному вызывающему абоненту или сохраняет их там, где исходный вызывающий абонент может опросить их.
Также можно (почти всегда) написать блокирующую оболочку вокруг неблокирующего системного вызова; где обертка вызывает системный вызов и ожидает результатов до их возвращения.
is is означает, что когда пользовательский поток использовал этот системный вызов блокировки, он будет ждать (этот поток заблокирован), а другой пользовательский поток может отображать в поток ядра, который был сопоставлен предыдущим? – sam
Я понятия не имею, какой курс вы принимаете или что он пытается вам сказать, но я бы так подумал. Многопотоковая многопоточная модель связывает несколько пользовательских потоков с одним потоком ядра. Если этот поток ядра находится в системном вызове блокировки, то все связанные с ним потоки пользователей также должны ждать.Это неверно для модели «один-к-одному», поскольку все потоки пользователей имеют свой собственный поток ядра, поэтому, если один поток ядра заблокирован, другой может сделать что-то еще. –
У меня есть почти такой же вопрос. если это модель «много-к-одному», и если пользовательский поток хочет сделать системный вызов блокировки. Останутся ли все остальные потоки? (могут ли только потоки ядра вызывать системный вызов?) – user5954246