digital-garden/_inbox/Не блокирующийся ввод-вывод.md

33 lines
4.0 KiB
Markdown
Raw Normal View History

2024-06-13 21:01:37 +03:00
---
aliases:
- неблокирующийся ввод-вывод
tags:
- зрелость/🌱
date:
- - 2024-05-20
zero-link:
2024-09-01 20:44:54 +03:00
- "[[../garden/ru/meta/zero/00 Разработка]]"
2024-06-13 21:01:37 +03:00
parents:
- "[[Ввод-вывод]]"
2024-09-01 20:44:54 +03:00
linked:
2024-06-13 21:01:37 +03:00
---
В отличие от [блокирующего](Блокирующие%20вызовы.md) ввода-вывода, вместо того, чтобы заблокироваться, любая операция завершается немедленно. Если данные не готовы, возвращается специальный код ошибки, по которому понятно, что следует попробовать вызов позднее. При таком варианте мы можем из одного потока выполнять несколько сетевых операций одновременно. Но, т.к. неизвестно, готов ли сокет к вводу-выводу, пришлось бы обращаться к каждому сокету по очереди с соответствующими запросами и, по сути, крутиться в вечном цикле, что неэффективно. Необходим механизм опроса готовности, в который мы могли бы запустить все сокеты, а он бы сообщал нам, которые из них готовы к вводу-выводу. С готовыми мы провели бы все нужные операции, после чего могли бы заблокироваться, ожидая сокетов, снова готовых к вводу-выводу. Таких механизмов опроса готовности несколько, они отличаются производительностью, деталями, но обычно он находится "под капотом" и нам не виден.
Как сделать неблокирующийся ввод-вывод? Мы соединяем опрос готовности и операции ввода-вывода с теми и только теми сокетами, которые сегодня готовы. Опрос готовности у нас блокируется до тех пор, пока не появятся какие-то данные хотя бы в одном сокете.
Второй вопрос по поводу того, что расположено "под капотом" это вопрос многозадачности. Как мы можем обеспечить одновременную обработку нескольких запросов (мы договорились, что нам это необходимо)?
Есть 3 базовых варианта:
- Выделить отдельный [процесс ОС](Процесс%20ОС.md) на обработку каждого запроса.
- Если запрос упадет, то это не повлияет на остальные процессы
- Между процессами нет ничего общего. Общение между процессами не тривиально.
- Так работает PostgresSQL
- [Поток процесса ОС](Поток%20процесса%20ОС.md). В рамках одного процесса порождается несколько потоков.
- О потоках знает ОС, она умеет разбрасывать их между процессорами.
- Нити легче чем процессы. Можем породить больше нитей, чем процессов.
- Отсутствует изоляция:
- падает одна нить, падает весь процесс.
- общая память и необходимость синхронизации
- [Кооперативная многозадачность](Кооперативная%20многозадачность.md).
- [Callback](Callback.md)
- [Green thread](Green%20thread.md)