Процесс может быть заблокирован в ожидании сигналов с внешних устройств или специальных объектов ОС (семафоров, мьютексов и т.п.), в ожидании освобождения используемых в данный момент файлов или других видов ресурсов. Таким образом выполняется синхронизация работы параллельно выполняющихся процессов, а также обеспечивается корректность доступа к таким видам ресурсов, которые не допускают своего одновременного использования различными процессами. В данной лабораторной работе предлагается разработать эмуляцию объекта синхронизации ОС на основе файловых блокировок и применить его для решения основной задачи.
Доступ к файлам полностью контролируется операционной системой. Файлы имеют различные режимы доступа, причем в некоторых из этих режимов одновременный доступ к файлу запрещен. Например (в общем случае), если файл открыт одним процессом для записи, то попытка второго процесса открыть его для записи приводит к ошибке. Данный факт можно использовать для эмуляции блокировок. Соответствующий файл назовем файлом блокировки или файлом мьютекса. Блокировка в указанном случае не будет полной, т.к. в действительности процесс, пытающийся получить доступ к заблокированному файлу, не приостановливается, он продолжает свое выполнение, сгенерировав ошибку ввода-вывода. Обеспечить эмуляцию блокировки можно, организовав цикл, в котором производятся попытки открыть (создать) файл блокировки до тех пор, пока данное действие не закончится удачно.
При использовании Windows и FreePascal для выбора механизма блокировок разработать программу, которая определяет,
какие типы файлов и в каких режимах открытия файла
блокирует операционная система при повторной попытке открытия. На основе результатов
исследования разработать процедуры:
procedure GetMutex(filename:string); - процедура, обеспечивающая эксклюзивный
захват файла мьютекса. Выход из процедуры - при удачном захвате. Если захват
неудачен, процедура повторяет попытки захвата до успеха.
procedure ReleaseMutex(filename:string); - процедура, освобождающаяя
захваченный ранее файл мьютекса.
При использовании Linux и FreePascal стандартные процедуры открытия/создания файлов не блокируют файл.
Для создания процедур GetMutex
и ReleaseMutex можно воспользоваться
функциями fpOpen, fpClose, fpUnlink из модуля baseunix:
Вызов fpOpen('имя файла',O_Creat or O_Excl, S_IRWXU) создает файл и возвращает его числовой файловый дескриптор.
Если такой файл уже существует, то будет возвращено значение -1.
Вызов fpClose(файловый_дескриптор) закрывает файл.
Вызов fpUnlink('имя файла') удаляет файл.
Более подробно о режимах открытия и механизмах блокировок файлов можно узнать с помощью команды man 2 open
Дополнительные задания:
Тестовые решения:
Реализация getMutex, releaseMutex и тестовая программа для ОС Linux
Решение (без дополнительных заданий) для ОС Windows