Что такое исчерпание ресурсов?

5 ответов

Я бы не сказал, что нехватка ресурсов - это частный случай блокировки. Обычно:

  • В режиме livelock ни один поток не продвигается, но он продолжает выполняться. (В тупике они даже не выполняются)

  • При голодании некоторые потоки ДЕЙСТВИТЕЛЬНО работают, а некоторые потоки не выполняются.

Хорошее объяснение: http: //docs.oracle.com/javase/tutorial/essential/concurrency/starvelive.html. Но я понимаю, что выбор терминологии может быть разным.

Когда дело доходит до голода, я слышал следующее определение:

Предположим, можно указать бесконечный путь выполнения (чередование) в соответствии с предположениями (семантика семафоров, ОС поведение планировщика ...) таким образом, что поток T приостанавливается в ожидании некоторого ресурса и никогда не возобновляется, даже если это было возможно бесконечно много раз. Тогда Т. называют голодным.

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

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

Классические проблемы, в которых голодание хорошо известно:

  • Проблема читателей-писателей. Можно синхронизировать потоки так, чтобы Ваш код синхронизации позволяет первому потоку входить в критический раздел один раз в час. Это голод? Оба потока могут развиваться, но первый выполняет свою работу мучительно медленно.

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

    Классические проблемы, в которых голодание хорошо известно:

    • Проблема читателей-писателей. Можно синхронизировать потоки так, чтобы Ваш код синхронизации позволяет первому потоку входить в критический раздел один раз в час. Это голод? Оба потока могут развиваться, но первый выполняет свою работу мучительно медленно.

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

      Классические проблемы, в которых голодание хорошо известно:

      • Проблема читателей-писателей. Можно синхронизировать потоки так, чтобы

        Классические проблемы, где голодание хорошо известно:

        • Проблема читателей-писателей. Можно синхронизировать потоки так, чтобы

          Классические проблемы, где голодание хорошо известно:

          Для получения более подробной информации я всем сердцем рекомендую "Маленькую книгу семафоров" (бесплатно): http://www.greenteapress.com/semaphores/ .

          Вы спрашиваете, вызваны ли все случаи голода по причине ждем какого-то ресурса. Я бы сказал - да.

          Поток можно приостановить:

          (1) при некотором блокирующем системном вызове - ожидание / получение мьютекса, семафора, условной переменной; write (), poll () и т. д.

          (2) в некоторых неблокирующих операциях, таких как выполнение вычислений.

          Истощение в (1) означает нехватку ресурсов (мьютексов, буфера и т.д.).

          Истощение в ( 2) голодает по CPU - можете расценивать это как ресурс. Если это произойдет, проблема связана с планировщиком.

          HTH

31
ответ дан 26 November 2019 в 23:25
поделиться

Представьте, что вы стоите в очереди, чтобы купить еду в ресторане, где беременные женщины имеют приоритет. И там постоянно прибывает куча беременных.

Скоро ты будешь голодать. ;)

А теперь представьте, что вы - процесс с низким приоритетом, а беременные женщины - с более высоким приоритетом. =)

63
ответ дан 26 November 2019 в 23:25
поделиться

Еще одна область, в которой обычно возникает голод или «неопределенная блокировка», - это когда речь идет об алгоритмах приоритетного планирования. Алгоритм приоритетного планирования имеет возможность оставить некоторый процесс с низким приоритетом в ожидании на неопределенное время. Постоянный поток процессов с более высоким приоритетом может помешать запуску процесса с низким приоритетом.

В случае планировщиков приоритетов решение «устаревает». Старение - это метод постепенного повышения приоритета процессов, которые долгое время ждут в системе.

12
ответ дан 26 November 2019 в 23:25
поделиться

Голод - это просто когда процесс или служба не обслуживаются, даже если в системе нет тупика.

Это пример, который я только что придумал для пояснения.

Представьте себе алгоритм, который контролирует доступ компьютеров к глобальной сети или что-то подобное. Этот алгоритм может иметь политику, которая гласит: «Предоставлять приоритетный доступ тем компьютерам, которые будут использовать меньшую полосу пропускания», что будет выглядеть как правильная политика, но что происходит тогда, когда один компьютер хочет получить доступ к сети для загрузки по ftp, которая отправит куда-то несколько ГБ. Только с этой политикой этот компьютер будет голодать, поскольку алгоритм никогда не выберет этот компьютер, поскольку всегда будут другие компьютеры, запрашивающие меньшее использование полосы пропускания.

Это называется голодом.

7
ответ дан 26 November 2019 в 23:25
поделиться

Work также является своего рода ресурсом. Когда распределение работы в настройке производитель-потребитель не является справедливым (или идеальным), некоторые потоки могут не получить достаточно рабочих элементов, чтобы держать их все время занятыми.

1
ответ дан 26 November 2019 в 23:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: