digital-garden/dev/architecture/Блокирующий вызов.md

43 lines
4.8 KiB
Markdown
Raw Normal View History

2024-09-12 20:20:21 +03:00
---
aliases:
- блокирующие операции
- блокирующая операция
- блокирующий вызов
- блокирующий ввод-вывод
- блокирующего
- блокирующей операции
2024-10-09 09:23:45 +03:00
- блокирующих операций
2024-09-12 20:20:21 +03:00
tags:
- maturity/🌱
2024-10-03 09:09:46 +03:00
date: 2024-01-28
2024-09-12 20:20:21 +03:00
zero-link:
- "[[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]"
parents:
linked:
- "[[Блокирующий вызов]]"
2024-09-12 20:20:21 +03:00
---
Блокирующий вызов блокирует [поток](../fundamental/Поток%20процесса%20ОС.md) до того момента, как будут-получены данные. Во время блокировки [процесс](../fundamental/Процесс%20ОС.md) не потребляет процессорное время, но потребляет память. Например, для выполнения запроса к БД из пула потоков берётся поток, далее он ожидает, пока БД выполнит запрос и вернёт результат.
Это одна из основных проблем императивного программирования. ==Если вычисление результата займёт 5 минут, то поток всё это время будет недоступен для других операций.== Это может привести к снижению производительности сервиса, особенно если многие потоки будут блокироваться в ожидании завершения долго выполняющихся запросов к базе данных. В какой-то момент у вас просто могут закончиться потоки в пуле, и обработка новых запросов просто остановится.
![](../../meta/files/images/Pasted%20image%2020240319200211.png)
## Почему простаивание потока — это проблема?
Каждый поток нуждается в памяти для хранения своего стека вызовов и других связанных с ним структур данных. ==Когда поток простаивает, он продолжает потреблять ресурсы для поддержания своего состояния.==
2024-09-12 20:20:21 +03:00
Кроме того, процессорное время, которое выделяется неработающим потокам, могло бы быть использовано для других задач. Если большое количество потоков простаивает, это может привести к увеличению загрузки процессора и снижению производительности, так как операционная система будет тратить больше времени на [[../fundamental/Переключение контекста|переключение между потоками]].
![](../../meta/files/images/Pasted%20image%2020240413205842.png)
Если посмотреть на соотношение скорости [[../fundamental/Центральный процессор|процессора]] и возможности сетевых соединений, то отличия на пару порядков. Например, на этом слайде сжатие 1 Кб данных занимает 3 мкс, в то время как round trip в одну сторону даже внутри одного дата-центра это уже 0,5 мс. Любое сетевое взаимодействие, которое нужно бэкенду (например, отправка запроса в БД), потребует, как минимум 2х round trip-ов и по сравнению с тем процессорным временем, которое он тратит на обработку данных, это совершенно незначительно. Большую часть времени обработки запроса [бэкенд](Бэкенд.md) ничего не делает, просто ждет.
2024-09-12 20:20:21 +03:00
## Заметки
- Чтение с диска в linux может быть только блокирующим.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]
**Родитель**::
**Источник**::
**Автор**::
**Создана**:: [[2024-01-28]]
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->