Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Акуленок_часть1.doc
Скачиваний:
35
Добавлен:
13.11.2019
Размер:
1.43 Mб
Скачать

3.8.3. Семафоры

Механизм семафоров, реализованный в ОС UNIX, является обобщением классического механизма семафоров общего вида, предложенного более 25 лет тому назад известным голландским специалистом профессором Дейкстрой.

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

Семафоры разрешают или запрещают процессу использовать тот или иной ресурс.

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

Семафор в ОС UNIX состоит из следующих элементов:

  • значение семафора;

  • идентификатор процесса, который хронологически последним работал с семафором;

  • число процессов, ожидающих увеличения значения семафора;

  • число процессов, ожидающих нулевого значения семафора.

3.8.4. Совместная память

Интенсивный обмен данными между процессами с использованием рас­смотренных механизмов межпроцессного взаимодействия (каналы, FIFO, очереди сообщений) может вызвать падение производительности системы. Это, в первую очередь, связано с тем, что данные, передаваемые с помо­щью этих объектов, копируются из буфера передающего процесса в буфер ядра и затем в буфер принимающего процесса. Механизм разделяемой па­мяти позволяет избавиться от накладных расходов передачи данных через ядро, предоставляя двум или более процессам возможность непосредст­венного получения доступа к одной области памяти для обмена данными. Безусловно, процессы должны предварительно "договориться" о правилах использования разделяемой памяти. Например, пока один из процессов производит запись данных в разделяемую память, другие процессы долж­ны воздержаться от работы с ней. К счастью, задача кооперативного ис­пользования разделяемой памяти, заключающаяся в синхронизации вы­полнения процессов, легко решается с помощью семафоров.

Примерный сценарий работы с разделяемой памятью выглядит следую­щим образом:

  1. Сервер получает доступ к разделяемой памяти, используя семафор.

  2. Сервер производит запись данных в разделяемую память.

  3. После завершения записи сервер освобождает разделяемую память с помощью семафора.

  4. Клиент получает доступ к разделяемой памяти, запирая ресурс с по­мощью семафора.

  5. Клиент производит чтение данных из разделяемой памяти и освобож­дает ее, используя семафор.

Сегменты разделяемой памяти (shared memory segments) – это средства, обеспечивающие возможность наличия общей памяти между процессами. Иными словами совместная память – это метод, в котором несколько процессов могут получать доступ к одному и тому же фрагменту физической памяти. Примером совместной может служить маленький файл базы данных, когда несколько программ доступа к базам данных могут использовать один и тот же файл, и если один процесс меняет порцию данных, эта информация автоматически обновляется для всех других процессов, использующих тот же файл.