путаница с определениями семафоров

0

Что такое процесс семафора? В контексте проблемы производителя/потребителя, является ли метод производителя/метод Consumer? Или это P(), если мы находимся в P(), а значение меньше 0?

      P() {
                value = value –1;
                If value < 0
                add the calling process to this semaphores list;
                block this process
          }

ПРИМЕР Если пользователь запускает сначала, прежде чем Producer произведет свой первый элемент

Потребитель уменьшит полное значение → full = -1, а затем, поскольку значение меньше 1, оно добавит вызывающий процесс в этот список семафоров. Но я не уверен, какой процесс. И что это значит блокировать этот процесс? Означает ли это, что весь метод для потребителя остановлен, и метод производителя работает?

код:

#define N 100
typedef int semaphore;
Semaphore fullBuffer = 0; // Initially, no item in buffer
Semaphore empty = N; // Initially, num empty buffer
Semaphore mutex = 1;      // No thread updating the buffer

void producer(void) {
  int item;
  while(TRUE){
      item = produce_item();
      down(&empty);
      down(&mutex);
      insert_item(item);
      up(&mutex);
      up(&full);
      }
    }

void consumer(void) {
 int item;
 while(TRUE){
      down(&full);
      down(&mutex);
      item = remove_item();
      up(&mutex);
      up(&empty);
      consume_item(item);
      }
}
Теги:
semaphore
operating-system
synchronization
producer-consumer

1 ответ

3
Лучший ответ

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

Блокирование процесса здесь означает, что процесс, который вызывает P и decrememnts значение на что-либо отрицательное, остановит свое собственное выполнение, когда достигнет команды "блокировать этот процесс".

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

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

  • 0
    Таким образом, потребитель будет «останавливаться», как только будет достигнут оператор блока, и тогда производитель будет работать?
  • 0
    Только если «полный» семафор уже равен нулю или если «продюсер» уже уменьшил «мьютекс» до нуля. И производитель, возможно, уже работает, но он не может быть заблокирован, потому что, если «потребитель» заблокирован, то он блокируется, потому что он ждет, пока «производитель» увеличит семафоры, что позволит ему снова работать. И «производитель», и «потребитель» могут работать одновременно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню