Рубрики
Без рубрики

Решения для производителей-потребителей проблемы

Благодаря проблемам с читателями-писателями, давайте поговорим о другой проблеме синхронизации: PR … с меткой с компьютером, Python, архитектурой, параллелизмом.

Благодаря проблемам с читателями-писателями, давайте поговорим о другой проблеме синхронизации: производителей-потребителей.

Производители-потребительские проблемы Обзор проблемы

В отличие от читателя и писателей, производителей и потребителей не конкурируют над ресурсами. Вместо этого они полагаются друг на друга, чтобы сбалансировать некоторые общие ресурсы. Например, производители могут создавать сообщения, которые добавляются в очередь, и потребители несут ответственность за обработку этих сообщений.

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

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

В этой статье мы посмотрим на два решения проблем потребителей производителей: один с семафорами и одним с мониторами. Как всегда, примеры заимствованы из лекционных лекций штата Огайо Университета CSE 6431:

Конечно, весь анализ строго мой.

Производители-потребители проблемных решений

В этом разделе мы реализуем пару решений для проблем потребителей производителей. В частности, мы будем смотреть на семафорное решение и контрастировать его с решением монитора. Еще раз, я буду использовать псевдокод, который имитирует Python.

Семафоры

Для реализации этого решения нам понадобятся три семафоры: Mutex , prod_mutex , conss_mutex Отказ Другими словами, нам понадобится бинарный семафор, чтобы глобально защитить очередь и горсть общих переменных. Кроме того, нам понадобится пара подсчета семафоров для обеспечения взаимного исключения между наборами тех же процессов. Кстати, дополнительные мьютеки полезны для связи между потребителями и производителями.

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

procedure producer(): 
  P(mutex) 
  if count = SIZE: 
    V(mutex) 
    P(prod_mutex) 
    P(mutex) 
  else: 
    P(prod_mutex) 
  count++ 
  # Add item to queue 
  V(cons_mutex) 
  V(mutex)

procedure consumer(): 
  P(mutex) 
  if count = 0: 
    V(mutex) 
    P(cons_mutex) 
    P(mutex) 
  else: 
    P(cons_mutex) 
  count-- 
  # Remove item from queue 
  V(prod_mutex) 
  V(mutex)

Как видно, только один процесс может когда-либо работать одновременно, кроме как в специальных условиях, описанных ниже. В случае производителя он собирается проверить, есть ли комната в очереди. Если есть, это будет пытаться приобрести prod_mutex Создайте товар и увеличение Считать Отказ В противном случае он собирается выпустить Mutex И подождите, пока нет комнаты в очереди. Когда все сказано и сделано, производитель позволяет любым ожидающим потребителям знать, что в очереди есть хотя бы один элемент.

Между тем, потребитель собирается проверить, есть ли что-нибудь в очереди. Если есть, он пытается приобрести conss_mutex Потребляйте предмет и уменьшение Считать Отказ В противном случае он собирается выпустить Mutex И ждать, пока в очереди что-то не будет. Когда все сказано и сделано, потребитель позволяет любым ожидающим производителям знать, что в очереди есть хотя бы одно свободное пространство.

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

Вот сценарий, я воображаю. Скажем, общая очередь полна, а новый продюсер (P1) приходит вместе. В этот момент P1 неизбежно найдет себя застрял на prod_mutex очередь. В тот момент появляется новый потребитель (C1). Около на полпути через свою работу появится другой производитель (P2). Как C1 заканчивается, это руки от prod_mutex до P1, а также сдавая Mutex к P2. Мы сейчас заблокированы.

Как оказывается, решение, которое я предусматриваю только для одного потребителя и одного производителя.

Мониторы

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

procedure producer(): 
  if count = SIZE: 
    can_produce.wait 
  count++ 
  # Add item to queue 
  can_consume.signal

procedure consumer(): 
  if count = 0: 
    can_consume.wait 
  count-- 
  # Remove item from queue 
  can_produce.signal

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

Точно так же, когда потребитель приходит, он проверит, есть ли что-нибудь потреблять. Если нет, это будет ждать. В противном случае он потребляет элемент из очереди и сигнализирует производителю, чтобы она знала, что есть место.

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

Хотите узнать больше?

На данный момент это все, что я должен сказать о проблеме производителей-потребителей. Естественно, я хотел бы перейти к изучению некоторых других концепций, таких как межпроцессная связь, которая находится рядом.

Тем временем, если вам понравилась эта статья, дайте ему долю! Кроме того, я был бы признателен, если вы начали Поддерживая меня на Пальтаоне или хотя бы прыгнул на мой список рассылки Отказ

Если дополнение, у меня есть много статей, я думаю, вы можете в том числе:

  • Решения проблемы читателей-писателей
  • Понимание синхронизации процесса
  • Будь осторожен При копировании смежных типов данных

Во всяком случае, спасибо снова за вашу поддержку! Возвращайся скорее.

Пост Решения для производителей-потребителей проблемы появился первым на Renegade Coder Отказ

Оригинал: “https://dev.to/renegadecoder94/solutions-to-the-producers-consumers-problem-252c”