Межпроцессная синхронизация с мьютексом и семафором - PullRequest
0 голосов
/ 23 марта 2012

Я занимаюсь самообучением операционных систем. Таненбаум в своей книге «Современные операционные системы» приводит пример, в котором он объясняет, как три семафора (один из которых является мьютексом) координируют пару процессов производитель-потребитель. У меня есть небольшие проблемы с пониманием этого. Может кто-нибудь объяснить, пожалуйста, как это достигается. Любая помощь будет оценена. Спасибо.

    #define N 1 00
    typedef int semaphore;
    semaphore mutex = 1 ;
    semaphore empty = N;
    semaphore full = 0;
    void producer(void)
    {

    int item;
    while (TRUE) {
    item = produce_item( );
    down( &empty);
    down( &mutex);
    inserUtem(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);

}

1 Ответ

0 голосов
/ 23 марта 2012

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

Один семафор (полный) инициализируется нулем и считаетсяколичество элементов в очереди.

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

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

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

Это материал Computer Science 101 - абсолютно классическая очередь блокировки производителя-потребителя.

...