СИНХРОНИЗАЦИЯ ПРОЦЕССОВ С ПОМОЩЬЮ ИМЕНОВАННЫХ СЕМАФОРОВ
Цель работы -знакомство студентов со средством синхронизации процессов - именованными семафорами и с системными вызовами, обеспечивающими создание, закрытие и удаление именованных семафоров, а также захват и освобождение именованных семафоров.
Общие сведения
Именованные семафоры позволяют организовать синхронизацию процессов в операционной системе. За счет того, что при создании и открытии именованного семафора, ему передается «имя» - цепочка символов, два процесса получают возможность получить указатель на один и тот же семафор. Т.е. в отличие от мьютексов и неименованных семафоров, именованные семафоры могут координировать доступ к критическому ресурсу не только на уровне нескольких потоков одной программы, но и а на уровне нескольких, выполняющихся программ - процессов.
В системе этот семафор реализуется в виде специального файла, время жизни которого не ограничено временем жизни процесса, его создавшего.
Существует несколько видов программных интерфейсов для создания именованных семафоров. В данном случае рассматривается программный интерфейс 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!