Почему select (2) называется синхронным мультиплексированием?

На данный момент меня немного смущает select (2), о котором говорится в резюме:

select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - синхронное мультиплексирование ввода / вывода

Насколько мне известно, многие библиотеки и программы, такие как libuv и nodejs, используют select / epoll / kqueue / iocp для своего цикла событий, который используется для их соответствующей функции async / await (и асинхронного ввода-вывода?).

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


person Julius    schedule 31.07.2019    source источник


Ответы (2)


У вас там ошибка синтаксического анализа. Это не синхронное мультиплексирование, а мультиплексирование синхронного ввода-вывода: select используется для мультиплексирования вызовов синхронного ввода-вывода. read, write и тому подобное называются синхронным вводом-выводом, потому что они либо будут блокироваться до завершения передачи, либо не выполнять передачу (например, неблокирующие неготовые сокеты).

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

Nodejs и libuv - разные звери. Несмотря на то, что ввод-вывод в C, возможно, является мультиплексированным и синхронным, он будет казаться асинхронным для им - нет блокировки синхронных вызовов чтения, потому что все это происходит прозрачно на стороне C / библиотеки.

person Antti Haapala    schedule 31.07.2019
comment
Спасибо! Это действительно решило мою путаницу. Как же выбрать работу внутри компании? Я предполагаю, что он должен либо опросить статус файловых дескрипторов, либо получить асинхронное уведомление, чтобы разблокировать? - person Julius; 31.07.2019
comment
@Julius - это магия ядра, но, скорее всего, она там будет асинхронной. - person Antti Haapala; 31.07.2019

Итак, что именно означает синхронное мультиплексирование?

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

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

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

Могу ли я добиться асинхронного ввода-вывода с помощью select?

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

person John Bollinger    schedule 31.07.2019