Главная » Все файлы » Просмотр файлов из архивов » PDF-файлы » sem14 - Средства System V IPC. Семафоры. Разделяемая память. Очереди сообщений.

sem14 - Средства System V IPC. Семафоры. Разделяемая память. Очереди сообщений. (Мини-учебник с ejudge = Чернокнижка), страница 2

PDF-файл sem14 - Средства System V IPC. Семафоры. Разделяемая память. Очереди сообщений. (Мини-учебник с ejudge = Чернокнижка), страница 2 Практика расчётов на ПЭВМ (37200): Книга - 3 семестрsem14 - Средства System V IPC. Семафоры. Разделяемая память. Очереди сообщений. (Мини-учебник с ejudge = Чернокнижка) - PDF, страница 2 (37200) - Студ2019-05-08СтудИзба

Описание файла

Файл "sem14 - Средства System V IPC. Семафоры. Разделяемая память. Очереди сообщений." внутри архива находится в папке "Мини-учебник с ejudge = Чернокнижка". PDF-файл из архива "Мини-учебник с ejudge = Чернокнижка", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Просмотр PDF-файла онлайн

Текст 2 страницы из PDF

Прототип этой функции выглядит следующим образом:#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>intsemctl(int semid, int semnum, int cmd, ...);Аргумент semid определяет идентификатор массива семафоров, над которым следует произвести операцию. Аргумент semnum задаёт номер семафора в массиве, аргумент cmd задаётвыполняемую команду. Здесь функция semctl описана как принимающая переменное количество параметров, хотя она всегда принимает 4 параметра. Последний параметр, назовёмего arg, имеет разные типы в зависимости от того, какая команда над массивом семафоров выполняется.

При описании каждой команды будет точно определено, какой именно типданных требуется.Команда IPC_RMID удаляет массив семафоров. Все другие процессы, которые заблокированы на этом массиве семафоров, разблокируются, а функция semop вернёт этим процессам ошибку с кодом EIDRM. Аргументы semnum и arg игнорируются. Прототип функцииsemctl может условно выглядеть следующим образом:int semctl(int semid, int semnum, int cmd);Команда GETALL возвращает значение всех семафоров в массив arg типаunsigned short. Аргумент semnum игнорируется. Прототип функции semctl вэтом случае может выглядеть следующим образом:int semctl(int semid, int semnum, int cmd,unsigned short *arg);Команда GETVAL возвращает значение семафора с номером semnum в массиве семафоров. Аргумент arg игнорируется. Прототип функции semctl может условно выглядетьследующим образом:int semctl(int semid, int semnum, int cmd);Команда SETALL устанавливает значение всех семафоров.

Массив новых значений семафоров передаётся в параметре arg. Прототип функции semctl может быть записан следующим образом:4int semctl(int semid, int semnum, int cmd,unsigned short *arg);Команда SETVAL устанавливает значение семафора с номером semnum. Новое значение семафора передаётся в аргументе arg. Если новое значение меньше нуля или большеконстанты SEMVMX, определяющей максимальное значение семафора в данной системе (например, для Linux значение SEMVMX равно 32767), функция завершится с ошибкой ERANGE.При успешном завершении функция semctl возвращает значение, большее 0, приошибке возвращается -1, а переменная errno устанавливается в код ошибки.

Возможныекоды ошибок приведены ниже.EACCES Процесс не имеет достаточно полномочий, чтобы выполнить заданную команду.EFAULT Неверный адрес передан в параметре arg (если требуется параметр-адрес).EIDRMМассив семафоров был удалён.EINVAL Неверная команда или идентификатор массива семафоров.EPERMНедостаточно полномочий выполнить команду.ERANGE Запрошено выполнение команды SETALL или SETVAL, а новое значение семафора меньше 0 или больше, чем максимальное значение SEMVMX, зависящее от реализации.1.2.3 Операции с массивом семафоровВсе операции с массивом семафоров: блокировка, разблокировка, ожидание выполняются с помощью функции semop.#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>int semop(int semid, struct sembuf *sops, unsigned nsops);Функция позволяет задавать сразу несколько операций над массивом семафоров semid.Операции должны находится в массиве, адрес которого передаётся в аргументе sops.

В аргументе nsops передаётся количество операций в массиве операций. Каждая операция надсемафором задаётся структурой struct sembuf, определённой следующим образом:struct sembuf{short sem_num;short sem_op;short sem_flg;};/* номер семафора (0 - первый) *//* операция над семафором *//* флаги операции */Поле sem_flg может содержать флаг IPC_NOWAIT, указывающий, что эта операция недолжна приводить к блокированию выполнения процесса, а вместо этого функция semopдолжна завершиться с ошибкой с кодом EAGAIN.Операции над семафорами будут выполнены в том и только том случае, когда все операции завершатся успешно.

Операции над семафорами выполняются атомарно, то есть никакой другой процесс не может наблюдать ситуацию, когда часть операций над семафорамиуже завершилась, а часть — нет.Поле sem_num задаёт номер семафора в массиве семафоров (номер отсчитывается, какобычно, от 0), над которым нужно выполнить операцию. Поле sem_op задаёт операцию:5одну из трёх в зависимости от знака значения sem_op.• Если значение sem_op положительно, операция добавляет это значение к значениюсемафора.

Операция не может привести к блокированию процесса. Процесс должениметь права на запись в массив семафоров.• Если значение sem_op равно 0, операция проверяет значение семафора. Если значение семафора равно 0, операция завершается успешно, и проверяется следующаяоперация в массиве операций. Если значение семафора не равно 0, и в поле sem_flgуказан флаг IPC_NOWAIT, вызов semop завершается с ошибкой EAGAIN, и ни одна иззапрошенных операций не выполняется. Если значение семафора не равно 0, и в полеsem_flg не указан флаг IPC_NOWAIT, процесс будет приостановлен до наступленияодного из следующих событий:– Значение семафора станет равно 0.– Массив семафоров будет удалён.

В этом случае semop завершится с ошибкойEIDRM.– Процесс получит сигнал, обработчик которого вернёт управление процессу. Вэтом случае semop завершится с ошибкой EINTR.• Если значение sem_op отрицательно, значение семафора уменьшается на заданнуювеличину. Если текущее значение семафора больше, чем величина -sem_op, значениесемафора уменьшается на -sem_op. Операция завершается успешно, и проверяетсяследующая операция в массиве операций.

Если текущее значение семафора меньше sem_op, и указан флаг IPC_NOWAIT, вызов semop завершается с ошибкой EAGAIN,и ни одна операция из запрошенных не выполнится. Если текущее значение семафора меньше -sem_op, а флаг IPC_NOWAIT не указан, процесс будет заблокирован дотех пор, пока либо значение семафора не станет большим -sem_op, либо массив семафоров не будет удалён (в этом случае semop завершится с ошибкой EIDRM), либопроцесс получит сигнал, который вызовет возврат управления в процесс (в этом случаеsemop завершится с ошибкой EINTR).В случае успешного завершения функция возвращает 0, а при ошибке возвращает -1, ипеременная errno устанавливается в одно из следующих значений.E2BIGАргумент nsops больше максимального значения SEMOPM, зависящего отреализации.EACCES Недостаточно прав выполнить какую-либо из заданных операций.EAGAIN Процесс мог бы быть заблокирован, но указан флаг IPC_NOWAIT.EFAULT Недопустимый адрес sops.EFBIGЗначение sem_num для некоторой операции выходит за диапазон допустимых значений.EIDRMМассив семафоров был удалён.EINTRСон процесса был прерван приходом сигнала.EINVAL Аргументы semid или nsops имеют недопустимое значение.ERANGE Для некоторой операции величина sem_op, добавленная к текущему значению семафора, вызовет выход за границу SEMVMX допустимых значений семафора.62Разделяемая памятьРазделяемая память — это самый быстрый механизм межпроцессного взаимодействия.При использовании разделяемой памяти два или более процессов имеют доступ к одному итому же фрагменту физической памяти, поэтому все изменения, которые один из процессовделает в разделяемой памяти, немедленно становятся доступны другим процессам, и не нужны никакие операции пересылки изменённого значения с помощью файлов, каналов и пр.Практически всегда при использовании разделяемой памяти необходимо использованиекакого-либо другого механизма, который бы обеспечил сериализацию критических секций,то есть строго последовательное выполнение разными процессами критических секций, модифицирующих один и тот же разделяемый ресурс.

Наиболее естественно для этой цели использовать рассмотренные выше семафоры.Сегментом разделяемой памяти мы назовём блок разделяемой памяти, полученный заодну операцию shmget.Данные, хранимые в некотором сегменте разделяемой памяти, не должны содержать указателей на объекты, находящиеся вне этого сегмента разделяемой памяти, поскольку такойуказатель имеет смысл только в адресном пространстве одного процесса. Более того, данные, хранимые в некотором сегменте разделяемой памяти, не должны содержать указателейна объекты, хранящиеся даже в этом же сегменте разделяемой памяти. Один и тот же сегмент разделяемой памяти может отображаться у разных процессов на разные виртуальныеадреса, и не всегда возможно сделать, чтобы разные процессы отображали сегмент разделяемой памяти на одни и те же виртуальные адреса.Сегмент разделяемой памяти идентифицируется, как и другие объекты SysV IPC, с помощью ключа — положительного целого числа.

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

После этого процесс может работать с сегментомразделяемой памяти как с обычной памятью процесса. Процесс может отсоединить сегментразделяемой памяти с помощью вызова shmdt. Отсоединение сегмента разделяемой памяти, и даже завершение работы всех процессов, использовавших данный сегмент разделяемойпамяти, не означает его уничтожения системой. Ненужный сегмент должен быть явно уничтожен с помощью вызова функции shmctl.2.1 Функции работы с разделяемой памятью2.1.1 Получение разделяемой памяти#include <sys/ipc.h>#include <sys/shm.h>int shmget(key_t key, int size, int shmflg);Функция shmget преобразовывает ключ сегмента разделяемой памяти key в идентификатор сегмента разделяемой памяти.

Если в параметре shmflg указан флаг IPC_CREAT,создаётся новый сегмент размера size с правами доступа, определёнными в 9 младших битах параметра shmflg. Если дополнительно был указан флаг IPC_EXCL, и сегмент с задан7ным ключом уже существует, функция shmget завершается с ошибкой EEXIST.

Если флагIPC_CREAT не указан, значение параметра size может быть равно 0.Системные вызовы создания/уничтожения процессов влияют на сегмент разделяемойпамяти следующим образом:• При вызове fork сыновний процесс наследует подключённые сегменты разделяемойпамяти отцовского процесса.• При вызове exec все подключённые сегменты разделяемой памяти отключаются, ноне уничтожаются.• При вызове exit все подключённые сегменты разделяемой памяти отключаются, ноне уничтожаются.В случае успешного завершения функция возвращает идентификатор сегмента разделяемой памяти (положительное число), а в случае неудачи возвращается -1, и переменнаяerrno устанавливается в код ошибки. Возможные коды ошибок приведены ниже.EINVAL Недопустимый параметр size.EEXIST Комбинация флагов IPC_CREAT и IPC_EXCL указана в аргументе shmflg,но сегмент с заданным ключом уже существует.EIDRMСегмент помечен на удаление.ENOSPC Превышен лимит системы на количество сегментов разделяемой памяти либона их суммарный размер.ENOENT Сегмент с заданным ключом не существует, а флаг IPC_CREAT не был указан.EACCES Процесс не имеет достаточно прав доступа к сегменту.ENOMEM Недостаточно памяти для выделения сегмента.2.1.2 Удаление сегмента разделяемой памятиУдалить сегмент разделяемой памяти можно с помощью общей функции управления сегментом разделяемой памяти.#include <sys/ipc.h>#include <sys/shm.h>int shmctl(int shmid, int cmd, struct shmid_ds *buf);Аргумент shmid — идентификатор сегмента разделяемой памяти, полученный с помощью shmget.

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5288
Авторов
на СтудИзбе
417
Средний доход
с одного платного файла
Обучение Подробнее