СИНХРОНИЗАЦИЯ ПРОЦЕССОВ С ПОМОЩЬЮ ИМЕНОВАННЫХ СЕМАФОРОВ



Цель работы -знакомство студентов со средством синхронизации процессов - именованными семафорами и с системными вызовами, обеспечивающими создание, закрытие и удаление именованных семафоров, а также захват и освобождение именованных семафоров.

Общие сведения

Именованные семафоры позволяют организовать синхронизацию процессов в операционной системе. За счет того, что при создании и открытии именованного семафора, ему передается «имя» - цепочка символов, два процесса получают возможность получить указатель на один и тот же семафор. Т.е. в отличие от мьютексов и неименованных семафоров, именованные семафоры могут координировать доступ к критическому ресурсу не только на уровне нескольких потоков одной программы, но и а на уровне нескольких, выполняющихся программ - процессов.

В системе этот семафор реализуется в виде специального файла, время жизни которого не ограничено временем жизни процесса, его создавшего.

Существует несколько видов программных интерфейсов для создания именованных семафоров. В данном случае рассматривается программный интерфейс POSIX.

Именованный семафор создается следующим вызовом:

sem_t *sem_open(const char *name,

int oflag,

mode_t mode,

unsigned int value),

где name – имя семафора; oflag – флаг, управляющий операцией создания семафора, при создании семафора необходимо указать флаг O_CREAT; mode

– права доступа к семафору, могут быть установлены, например, в 0644; value – начальное состояние семафора.

Именованный семафор закрывается следующим вызовом:

int sem_close(sem_t *sem).

При входе в критический участок необходимо вызвать функцию:

int sem_wait(sem_t *sem).

При выходе из критического участка необходимо вызвать функцию:

int sem_post(sem_t *sem).


Именованный семафор удаляется следующим вызовом:

int sem_unlink(const char *name).

Указания к выполнению работы

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

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

Обе программы должны создать (или открыть, если создан) один и тот же именованный семафор, должны создать (или открыть, если создан) один и тот же файл, но записывать в файл разные символы.

Необходимо убедиться, что в случае отсутствия именованного семафора процессы выводят символы в файл в произвольном порядке, например:

 

1212121212121212121212121212121212121212121212121212121212121.

 

В случае использования именованного семафора процессы выводят символы в файл в определенном порядке, например:

 

111111111122222222221111111111222222222211111111112222222222.

 

Шаблон одной из программ представлен ниже. Вторая программа отличается от первой выводом в файл другого символа.

Использовать функции входа в критический участок с блокировкой и без блокировки.

объявить флаг завершения потока;

объявить идентификатор именованного семафора;

объявить дескриптор файла;

Функция потока()

{

объявить переменную типа символ и присвоить ей значение ‘1’;

Пока (флаг завершения потока не установлен)

{

захватить именованный семафор;

В цикле несколько раз выполнять

{

выводить символ в файл;

задержать на время;

}

освободить именованный семафор;

задержать на время;

}

}

Основная программа()

{

создать (или открыть, если существует) именованный семафор;

создать (или открыть, если существует) файл;

создать поток из функции потока;

ждать нажатия клавиши;

установить флаг завершения потока;

ждать завершения потока;

закрыть файл;

закрыть именованный семафор;

удалить именованный семафор;

}

Вопросы для самопроверки

1. Какие программные интерфейсы для именованных семафоров существуют?

2. В чем отличие именованных семафоров от неименованных семафоров?

3. Дайте сравнительную характеристику программных интерфейсов семафоров.

4. Как реализовать определенную очередность записи данных в файл с помощью именованного семафора (например, первый процесс всегда первым начинает запись файл)?

5. Опишите действия, которые выполняются над именованным семафором при вызове операций sem_wait() и sem_post().

6. Какими операциями с именованным семафором можно осуществить

проверку занятости ресурса без блокирования процесса?

7. Какими операциями с именованным семафором можно осуществить проверку занятости ресурса с определенной периодичностью?


Дата добавления: 2018-04-05; просмотров: 1159; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!