Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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




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

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

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

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

 

1212121212121212121212121212121212121212121212121212121212121.

 

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

 

111111111122222222221111111111222222222211111111112222222222.

 

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

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

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

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

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

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

{

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

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

{

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

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

{

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

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

}

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

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

}

}

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

{

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

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

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

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

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

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

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

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

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

}

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

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

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

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

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

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

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

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

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



ВЗАИМОДЕЙСТВИЕ ПРОЦЕССОВ ЧЕРЕЗ РАЗДЕЛЯЕМУЮ ПАМЯТЬ

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

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

Участок разделяемой памяти создается следующим вызовом:

int shm_open(const char *name, int oflag, mode_t mode),

где name – имя участка разделяемой памяти; oflag – флаги, определяющие тип создаваемого участка разделяемой памяти; mode – права доступа к участку разделяемой памяти.

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

int ftruncate(int fd, off_t length),

где fd - дескриптор разделяемой памяти, полученный как результат вызова функции shm_open(); length – требуемый размер разделяемой памяти.

Отображение разделяемой памяти на локальный адрес создается вызовом:

void *mmap(void *addr,

size_t length,

int prot,

int flags,

int fd,

off_t offset),

где addr - начальный адрес отображения; length - размер отображения; prot – параметр, определяющий права чтения/записи отображения; flags – параметр, определяющий правила видимости отображения процессами; fd - дескриптор разделяемой памяти; offset – смещение на участке разделяемой памяти относительно начального адреса.

Удаление отображения разделяемой памяти на локальный адрес производится вызовом:

int munmap(void *addr, size_t length),

где addr – локальный адрес отображения; length - размер отображения.

Закрытие участка разделяемой памяти производится вызовом:

int close(int fd),

где fd - дескриптор разделяемой памяти.

Удаление участка разделяемой памяти производится вызовом:

int shm_unlink(const char *name),

где name – имя участка разделяемой памяти.

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

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

 

Шаблон программы 1 представлен ниже:

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

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

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

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

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

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

{

объявить переменную;

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

{

присвоить переменной случайное значение;

вывести значение переменной на экран;

скопировать значение переменной в локальный адрес;

освободить семафор записи;

ждать семафора чтения;

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

}

}

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

{

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

создать (или открыть, если существует) разделяемую память;

обрезать разделяемую память до требуемого размера;

отобразить разделяемую память на локальный адрес;

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

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

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

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

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

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

закрыть семафор чтения;

удалить семафор чтения;

закрыть семафор записи;

удалить семафор записи;

закрыть отображение разделяемой памяти на локальный адрес;

удалить разделяемую память;

}

 

Шаблон программы 2 представлен ниже:

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

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

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

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

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

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

{

объявить переменную;

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

{

ждать семафора записи;

скопировать данные из локального адреса в переменную;

вывести значение переменной на экран;

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

}

}

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

{

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

создать (или открыть, если существует) разделяемую память;

изменить размер разделяемой памяти на требуемый;

отобразить разделяемую память на локальный адрес;

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

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

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

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

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

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

закрыть семафор чтения;

удалить семафор чтения;

закрыть семафор записи;

удалить семафор записи;

закрыть отображение разделяемой памяти на локальный адрес;

удалить разделяемую память;

}

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

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

2. Какими достоинствами, и какими недостатками обладает способ взаимодействия процессов через разделяемую память?

3. На основе какого параметра функции открытия разделяемой памяти один и тот же участок становится доступным из разных процессов?

4. Каким образом участок глобальной разделяемой памяти, описываемой идентификатором, становится доступным в адресном пространстве программы?

5. С какой целью в предлагаемых шаблонах программ используется пара семафоров – семафор записи и семафор чтения?

6. Сразу при создании участок разделяемой памяти получает нулевую длину. Каким образом впоследствии обеспечивается возможность записи данных в этот участок?

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 594.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...