
Асинхронность NIO и Kotlin — а есть ли связь?
st_merzlyakov 3 минуты назад Асинхронность NIO и Kotlin — а есть ли связь? Простой 7 мин 0 Kotlin * Java * Linux * Программирование * FAQ Из песочницы Для того, что бы ответить на этот вопрос, придется немного...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
В сфере искусственного интеллекта произошло заметное событие. st_merzlyakov 3 минуты назад Асинхронность NIO и Kotlin — а есть ли связь? Простой 7 мин 0 Kotlin * Java * Linux * Программирование * FAQ Из песочницы Для того, что бы ответить на этот вопрос, придется немного погрузиться на уровень операционной системы и на аппаратный уровень. Не претендуя на абсолютную точность в деталях, надеюсь, что смогу донести общее представление.
NIO под капотомПроцесс в операционной системеВ операционной системе каждый процесс имеет собственную память, ресурсы, атрибуты (мандат) доступа и набор потоков выполнения, созданных в рамках данного процесса. Все потоки работают с общей памятью, но имеют собственный стек вызова и контекст выполнения. По умолчанию, размер стека потока составляет 8 МБ.
Технические детали
Теперь взглянем на статусную модель потока в операционной системе: Статусная модель потока При выполнении IO‑вызова поток переходит из состояния исполнения (RUNNING) в состояние ожидания (WAITNG). Когда данные получены — поток переходит в состояние READY и может быть снова поставлен на исполнение планировщиком операционной системы. Вспомним характерное время выполнения типовых операций: ОперацияХарактерное времявыполнить типичную инструкцию на процессоре1/1 000 000 000 секунды = 1 наносекундаизвлечение данных из кэш‑памяти L10,5 наносекундынеправильное предсказание ветви5 наносекундизвлечение данных из кэш‑памяти второго уровня7 наносекундблокировка / разблокировка мьютекса25 наносекундизвлечение из основной памяти100 наносекундотправить 2КБ по сети со скоростью 1 Гбит/с20 000 наносекундчтение 1 МБ с SSD300 000 наносекундпереключение потока выполнения1000 — 10 000 наносекундИз таблицы видно, что характерное время выполнения I/O‑операций (работа с сетью или дисками) в 1000–10000 раз медленее, чем выполение операций на CPU.
Причем время переключения CPU c одного потока выполенения на другой сравнимо с временем выполнения I/O‑операций. При реализации клиент‑серверных приложений на блокирующих I/O‑фреймоврках, как правило, устанавливают число потоков в районе 200–400. Большее количество потоков приводит к просадкам в производительности из‑за расходов на переключение контекста.
Малое же количество рабочих потоков приведет к тому, что потоки рано или поздно упрутся в выполнение I/O‑операций, и обслуживание новых клиентов прекратится или замедлится, хотя сам CPU будет недозагружен. Возник вопрос — а можно ли сделать так, что бы процесс не блокировался при вызове I/O‑операции, а просто её инициировал и продолжал работу, время от времени проверяя, не готовы ли данные.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





