Открыть сервис

Проблема голодания (программирование)

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

Причины возникновения

Голодание возникает из-за несправедливого распределения ресурсов между конкурирующими процессами. Основные причины включают:

Несправедливые алгоритмы планирования

Некоторые алгоритмы планирования задач (scheduling algorithms) могут систематически отдавать предпочтение одним процессам перед другими. Например:

Неправильное использование блокировок

В многопоточных приложениях голодание часто возникает при работе с мьютексами (mutex), семафорами или условными переменными. Например:

Ограниченность ресурсов

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

Отличие от взаимной блокировки (deadlock)

Голодание часто путают с взаимной блокировкой (deadlock), но это разные явления:

ХарактеристикаВзаимная блокировка (deadlock)Голодание (starvation)
Состояние процессаПроцесс заблокирован и не может продолжить выполнениеПроцесс готов к выполнению, но не получает ресурс
ПричинаЦиклическое ожидание ресурсовНесправедливое распределение ресурсов
Возможность разрешенияТребуется внешнее вмешательство (например, завершение процесса)Может разрешиться самостоятельно, если изменится приоритет или освободится ресурс
ПримерДва процесса удерживают по одному ресурсу и ждут друг от другаОдин процесс постоянно получает процессор, другой — никогда

Примеры голодания

В операционных системах

В многопоточных приложениях

В распределённых системах

Методы предотвращения и устранения

Справедливые алгоритмы планирования

Справедливые блокировки

Управление ресурсами

Алгоритмические решения

Критика и ограничения

Хотя голодание считается менее критичной проблемой, чем взаимная блокировка (так как система в целом продолжает работать), оно может привести к серьёзным последствиям в системах реального времени, где время отклика критично. В некоторых случаях голодание может перерасти в deadlock, если «голодающий» процесс удерживает ресурс, необходимый другим процессам.

В современных операционных системах (Linux, Windows, macOS) голодание встречается редко благодаря использованию сложных алгоритмов планирования (например, CFS с виртуальным временем выполнения) и справедливых блокировок. Однако в пользовательских приложениях, особенно с неправильным использованием многопоточности, голодание остаётся распространённой ошибкой программирования.

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →