Как ведут себя программы (и потоки ОС, на которых они работают), когда они блокируются операцией, связанной с вводом-выводом? - PullRequest
0 голосов
/ 13 января 2020

Предположим, что программа читает из сети. Каждый раз, когда программа должна ждать (блокируется в ожидании ответа сети), что происходит? Поток ОС, выполняющий программу, блокируется? Или это работает как асинхронная операция c в C# (где поток возвращается в пул потоков, пока поток ввода-вывода операционной системы не уведомит программу о новых данных для обработки, а затем - другой поток из потока пул продолжает обрабатывать данные, полученные из сети)?

Мое основное беспокойство заключается в том, что если Go сохраняет заблокированный поток каждый раз, когда подпрограмма блокируется, если у меня много подпрограмм на сервере, обрабатывающем входящие соединения от очень медленная сеть, у меня может закончиться нехватка ОЗУ, поскольку каждый из этих заблокированных потоков потребляет около 2 МБ ОЗУ. Или, если у пула потоков, созданного Go для запуска goroutines, есть предел, у меня может закончиться нехватка жизнеспособности.

Так как же работают goroutines в операциях, связанных с IO?

1 Ответ

0 голосов
/ 13 января 2020

Если это системный вызов asyn c, он блокирует процедуру и освобождает поток для запуска другой программы, так же, как если бы программа блокировала, например, чтение канала.

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

...