Благодаря проблемам с читателями-писателями, давайте поговорим о другой проблеме синхронизации: производителей-потребителей.
Производители-потребительские проблемы Обзор проблемы
В отличие от читателя и писателей, производителей и потребителей не конкурируют над ресурсами. Вместо этого они полагаются друг на друга, чтобы сбалансировать некоторые общие ресурсы. Например, производители могут создавать сообщения, которые добавляются в очередь, и потребители несут ответственность за обработку этих сообщений.
Более формально производители и потребители разделяют очередь. Когда очередь содержит элементы, один и только один потребитель должен претендовать на первый элемент для обработки. В частности, мы не хотим, чтобы несколько потребителей обрабатывали один и тот же предмет. Точно так же, пока очередь не заполнена, производители могут добавлять элементы в очередь.
Также в отличие от проблем с читателями-писателями, проблема производителей-потребителей на самом деле не имеет никаких перестановок. Поскольку для ресурсов нет никаких конкурентов, нет необходимости давать приоритет к любым процессам. В результате нам нужно только пройти через одно решение для каждого механизма синхронизации. В будущем мы пройдем несколько сложных производителей-потребителей (то есть многоразовые ресурсы и т. Д.).
В этой статье мы посмотрим на два решения проблем потребителей производителей: один с семафорами и одним с мониторами. Как всегда, примеры заимствованы из лекционных лекций штата Огайо Университета CSE 6431:
- OSU CSE 6431 Синхронизация процесса Часть 2 (Семафоры)
- ОСУ CSE 6431 Синхронизация процесса Часть 3 (Семафоры)
- OSU CSE 6431 Синхронизация процесса Часть 4 (Мониторы)
Конечно, весь анализ строго мой.
Производители-потребители проблемных решений
В этом разделе мы реализуем пару решений для проблем потребителей производителей. В частности, мы будем смотреть на семафорное решение и контрастировать его с решением монитора. Еще раз, я буду использовать псевдокод, который имитирует 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”