29 lines
3.0 KiB
Markdown
29 lines
3.0 KiB
Markdown
|
---
|
|||
|
aliases:
|
|||
|
- блокирующие операции
|
|||
|
- блокирующая операция
|
|||
|
- блокирующий вызов
|
|||
|
- блокирующий ввод-вывод
|
|||
|
- блокирующего
|
|||
|
tags:
|
|||
|
- зрелость/🌱
|
|||
|
date:
|
|||
|
- - 2024-01-28
|
|||
|
zero-link:
|
|||
|
- "[[00 Архитектура ПО]]"
|
|||
|
parents:
|
|||
|
linked:
|
|||
|
- "[[Бэкенд большую часть времени ждет]]"
|
|||
|
---
|
|||
|
Блокирующий вызов блокирует [поток](Поток%20процесса%20ОС.md) до того момента, как будут-получены данные. Во время блокировки [процесс](Процесс%20ОС.md) не потребляет процессорное время, но потребляет память. Например, для выполнения запроса к БД из пула потоков берётся поток, далее он ожидает, пока БД выполнит запрос и вернёт результат.
|
|||
|
|
|||
|
Это одна из основных проблем императивного программирования. ==Если вычисление результата займёт 5 минут, то поток всё это время будет недоступен для других операций.== Это может привести к снижению производительности сервиса, особенно если многие потоки будут блокироваться в ожидании завершения долго выполняющихся запросов к базе данных. В какой-то момент у вас просто могут закончиться потоки в пуле, и обработка новых запросов просто остановится.
|
|||
|
|
|||
|
![](Pasted%20image%2020240319200211.png)
|
|||
|
|
|||
|
## Почему простаивание потока — это проблема?
|
|||
|
Каждый поток нуждается в памяти для хранения своего стека вызовов и других связанных с ним структур данных. ==Когда поток простаивает, он продолжает потреблять ресурсы для поддержания своего состояния.==
|
|||
|
|
|||
|
Кроме того, процессорное время, которое выделяется неработающим потокам, могло бы быть использовано для других задач. Если большое количество потоков простаивает, это может привести к увеличению загрузки процессора и снижению производительности, так как операционная система будет тратить больше времени на переключение между потоками.
|
|||
|
## Заметки
|
|||
|
- Чтение с диска в linux может быть только блокирующим.
|