sem14 - Средства System V IPC. Семафоры. Разделяемая память. Очереди сообщений. (1114926)
Текст из файла
1СемафорыСемафоры — одно из старейших средств разделения доступа к критическим ресурсампараллельно работающих процессов. Дейкстра определил две операции над семафорами:P(s) и V (s). Операция P блокирует семафор, операция V — деблокирует семафор. Болееточно, операции P и V определены следующим образом:Операция P(s) проверяет, что семафор s открыт. Если семафор открыт, операция закрывает семафор и завершается. Операция проверки и открытия является атомарной, то естьни один другой процесс не может наблюдать ситуации, когда семафор проверен, но ещё незакрыт.
Если на момент проверки семафор уже закрыт, операция P приостановит процессдо тех пор, пока некоторый другой процесс не откроет семафор. После того, как некоторыйпроцесс открыл семафор, система выбирает из множества процессов, ожидающих открытиясемафора, какой-то один и разблокирует его.Операция V (s) разблокирует семафор. Эта операция никогда не приостанавливает выполнение процесса.Обычно сам по себе семафор s — это переменная некоторого целого типа. Значению 0может соответствовать открытый семафор, а значению 1 — закрытый семафор.
Если семафор может принимать только два значения, такой семафор называется бинарным.Фрагмент программы, использующей бинарный семафор, может выглядеть следующимобразом:semaphore s;/* программа */P(s);/* критическая секция */V(s);Расширением бинарного семафора является считающий семафор. У считающего семафора значение 0 соответствует закрытому семафору, а значения, большие 0, открытомусемафору. Операции P и V тогда принимают не один, а два параметра.Операция P(s, i) атомарно уменьшает значение семафора s на i. Если на момент проверкизначение семафора уже было меньше i, процесс приостанавливается до тех пор, пока значение семафора не станет больше или равно i.Операция V (s, i) увеличивает значение семафора s на i.
Операция всегда выполняется безблокировки процесса. У семафора может быть некоторое максимальное значение, котороеопределяется типом данных, отведённым для хранения значения семафора.В случае считающих семафоров может потребоваться начальная инициализация семафора значением, отличным от нуля, так как в случае считающих семафоров 0 означает закрытый ресурс, а в начале программы ресурс, скорее всего, должен быть открыт. Считающийсемафор можно использовать тогда, когда разделяемый ресурс имеет ограниченную ёмкость,и мы хотим блокировать процесс, когда ёмкость ресурса временно исчерпана.Поскольку операция P должна быть атомарна, кроме того, эта операция включает приостановку работы процесса и пробуждение процесса, эта операция может быть корректно реализована только в ядре операционной системы.
Поэтому ядро должно предоставлятьнекоторые системные вызовы для работы с семафорами.11.1 Семафоры в System VРазвитые средства межпроцессной коммуникации, включающие именованные каналы,очереди сообщений, семафоры и разделяемую память появились в Unix System V. Примерно в то же время в Unix BSD появились сокеты и файлы, отображаемые в память. До этогоединственными средствами межпроцессного взаимодействия были файлы, анонимные каналы и сигналы. Позднее все эти средства межпроцессного взаимодействия были реализованыв обеих разновидностях UNIX. Семафоры, разделяемая память и очереди сообщений частообъединяются в понятие «средства межпроцессного взаимодействия UNIX System V».
Далее в этом документе мы будем иногда на них ссылаться как на SysV IPC.Понимание семафоров в System V ещё более расширено по сравнению с оригинальнымопределением. Позволяется задавать массивы семафоров, в котором каждый отдельный семафор может рассматриваться или как бинарный, или как считающий. Более того, позволяется задавать несколько операций с семафорами одного массива семафоров за один вызов.В этом случае система гарантирует атомарность выполнения всех операций, то есть либовсе операции выполнились, либо ни одна из указанных операций не выполнилась, а процесспереведён в состояние ожидания.
Никакой другой процесс не может наблюдать ситуацию,когда часть операций выполнилась, а часть ожидает своего выполнения.Семафоры хранятся в адресном пространстве ядра. Но, в отличие, например, от файловых дескрипторов, время жизни массивов семафоров не ограничено временем работы создавшего его процесса.
То есть, массив семафоров не уничтожается, когда завершает работу последний процесс, использующий данный массив семафоров. Для уничтожения массива необходимо использовать явную команду уничтожения. Поэтому процесс, работающий смассивом семафоров, должен аккуратно обрабатывать завершение работы процесса. Впрочем, эта проблема не свойственна только средствам межпроцессного взаимодействия SystemV, но и временным файлам, файлам замков и именованным каналам.Каждый массив семафоров должен иметь имя, уникальное в системе, чтобы разные никак не связанные друг с другом процессы могли использовать данный массив семафоров.Для объектов SysV IPC именем является некоторое целое положительное число, причём пространства имён для массивов семафоров, сегментов разделяемой памяти и очередей сообщений различны, то есть одно и то же число может обозначать и массив семафоров, и очередьсообщений, и сегмент разделяемой памяти. Это число имеет тип key_t, и мы будем ссылаться на него как на ключ массива семафоров.Чтобы процесс мог работать с массивом семафоров, он должен «получить» массив семафоров, то есть преобразовать ключ массива семафоров в идентификатор массива семафоров, действительный для данного процесса (аналог файлового дескриптора).
При этом могутуказываться дополнительные флаги, например, флаг создания массива семафоров и правадоступа к нему. Затем процесс может выполнять операции с массивом семафоров, используя идентификатор массива семафоров, полученный ранее.1.2 Функции работы с массивами семафоровКак было сказано ранее, ключ семафора — это некоторое положительное целое число.Чтобы «облегчить» программисту задачу выбора этого числа, предусмотрена специальнаяфункция ftok.#include <sys/types.h>#include <sys/ipc.h>key_t ftok(char *pathname, char proj);2Функция применима к любым средствам межпроцессного взаимодействия SysV IPC: массивам семафоров, очередям сообщений, сегментам разделяемой памяти. Эта функция генерирует ключ объекта SysV IPC по имени существующего файла pathname. Аргумент proj— это некоторый идентификатор проекта.
В описании функции не специфицируется, что этодолжно быть за число, соответственно, это значение может быть произвольным. При генерации ключа используется номер устройства и номер индексного дескриптора файла, поэтомуфайл не должен удаляться и создаваться заново в промежутке между обращениями к ftok,иначе будут получены разные ключи. Используется только часть бит номера индексного дескриптора и номера устройства, поэтому вполне возможна (хотя и маловероятна) коллизиягенерируемых ключей, когда двум разным файлам соответствует один и тот же ключ объекта.1.2.1 Получение массива семафоров#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>int semget(key_t key, int nsems, int semflg);Функция semget позволяет связать с массивом семафоров с ключом key идентификатор семафора.
Этот идентификатор должен использоваться при всех обращения к функциямработы с этим массивом семафоров. Параметр nsems задаёт количество семафоров в массиве семафоров. Он может быть равен 0, если процесс не пытается создать новый массивсемафоров. Параметр semflg определяет флаги создания массива семафоров и права доступа к создаваемому массиву семафоров.IPC_CREAT Если этот флаг установлен, массив семафоров будет создан.IPC_EXCLЕсли установлен этот флаг, и установлен флаг IPC_EXCL, выполнение завершится с ошибкой, если массив семафоров с таким ключом уже существует.9 младших бит параметра semflg определяют права доступа к создаваемому массивусемафоров. Назначение бит прав доступа точно такое же, как у бит прав доступа к файлу,но бит x, естественно, игнорируется.
Например, права 0600 обозначают доступ на чтение изапись только для создателя семафора.Функция инициализирует значение семафоров нулями. Если необходима инициализация массива семафоров какими-либо другими значениями, нужно использовать функциюsemctl. Чтобы избежать при этом race condition, необходимо в массиве семафоров завестиещё один семафор, который примет значение 1, когда все семафоры будут корректно проинициализированы. Один процесс создаёт и инициализирует семафоры, а другие процессыдолжны пытаться создавать массив с флагом IPC_EXCL, и если создание не удалось из-затого, что массив семафоров был уже создан, приостановить своё выполнение до тех пор, покаупомянутый выше семафор завершения инициализации не примет значение 1.Если функция завершилась успешно, возвращается идентификатор массива семафоров.При ошибке возвращается -1, а переменная errno устанавливается в код ошибки.
Возможные коды ошибок приведены ниже.3EACCES Для заданного ключа массив семафоров уже существует, но процесс не имеетправ доступа к нему.EEXIST Массив семафоров существует, а параметр semflg содержит флагиIPC_CREAT и IPC_EXCL.EIDRMЗаданный массив семафоров помечен на удаление.ENOENT Массив семафоров с заданным ключом не существует, а флаг IPC_CREAT небыл указан.ENOMEM Недостаточно памяти ядра для создания семафора.ENOSPC Превышено максимальное количество семафоров или массивов семафоров всистеме.1.2.2 Управление массивом семафоровПод управлением массивом семафоров понимается выполнение разных дополнительныхопераций, например, инициализация массива семафоров, или удаление массива семафоров.Все эти операции выполняются с помощью функции semctl.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.