Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Указания к выполнению работы
Поскольку именованные семафоры используются для координации взаимодействия процессов, то для выполнения работы необходимо написать две программы. Необходимо выбрать общий ресурс, например, файл и осуществлять запись данных в него из двух программ. Обе программы должны создать (или открыть, если создан) один и тот же именованный семафор, должны создать (или открыть, если создан) один и тот же файл, но записывать в файл разные символы. Необходимо убедиться, что в случае отсутствия именованного семафора процессы выводят символы в файл в произвольном порядке, например:
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; просмотров: 605. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |