Введение

Проблема распределения ресурсов в информатике
В информатике проблема "гремящего стада" возникает, когда большое количество процессов или потоков, ожидающих наступления события, пробуждаются при его наступлении, но только один процесс способен обработать это событие. Когда процессы просыпаются, каждый из них пытается обработать событие, но только один преуспевает. Все процессы начинают конкурировать за ресурсы, что может привести к зависанию компьютера, пока "стадо" не успокоится.

Смягчение

Ядро Linux сериализует ответы на запросы к одному файловому дескриптору, поэтому пробуждается только одна нить или процесс. Для epoll в версии 4.5 ядра Linux был добавлен флаг EPOLLEXCLUSIVE. Таким образом, несколько наборов epoll (разные потоки или разные процессы) могут ожидать один и тот же ресурс, и будет пробужден только один набор. Для определенных рабочих нагрузок этот флаг может значительно сократить время обработки. Аналогично, в Microsoft Windows порты завершения ввода-вывода могут смягчить проблему "громоздкого стада", поскольку их можно сконфигурировать таким образом, чтобы при возникновении события пробуждалась только одна из нитей, ожидающих порт завершения. В системах, использующих механизм отката (например, экспоненциальный откат), клиенты будут повторять неудачные вызовы, ожидая определенное время между последовательными попытками. Чтобы избежать проблемы "громоздкого стада", намеренно добавляется джиттер для нарушения синхронизации между клиентами, что позволяет избежать коллизий. В этом подходе случайность вносится в интервалы ожидания между повторными попытками, чтобы клиенты больше не были синхронизированы.