Лабораторная 2.
Синхронизация работы параллельных задач
(с помощью файловых блокировок)

Процесс может быть заблокирован в ожидании сигналов с внешних устройств или специальных объектов ОС, в ожидании освобождения используемых в данный момент файлов или других видов ресурсов. Таким образом выполняется синхронизация работы параллельно выполняющихся процессов, а также обеспечивается корректность доступа к таким видам ресурсов, которые не допускают своего одновременного использования различными процессами.

Доступ к файлам полностью контролируется операционной системой. Файлы имеют различные режимы доступа, причем в некоторых из этих режимов одновременный доступ к файлу запрещен. Например (в общем случае), если файл открыт одним процессом для записи, то попытка второго процесса открыть его для записи приводит к ошибке. Данный факт можно использовать для эмуляции блокировок. Соответствующий файл назовем файлом блокировки. Блокировка в указанном случае не будет полной, т.к. в действительности процесс, пытающийся получить доступ к заблокированному файлу, не приостановливается, он продолжает свое выполнение, сгенерировав ошибку ввода-вывода. Обеспечить эмуляцию блокировки можно, организовав цикл, в котором производятся попытки открыть файл блокировки до тех пор, пока данное действие не закончится удачно.

Задание

  1. Для выбора механизма блокировок разработать программу, которая определяет, какие типы файлов и в каких режимах открытия файла блокирует операционная система при повторной попытке открытия. На основе результатов исследования разработать процедуры:
    procedure GetMutex(filename:string); - процедура, обеспечивающая эксклюзивный захват файла блокировок. Выход из процедуры - при удачном захвате. Если захват неудачен, процедура повторяет попытки захвата до успеха.
    procedure ReleaseMutex(filename:string); - процедура, освобождающаяя захваченный ранее файл блокировок.
  2. Используя разработанный механизм блокировок, решить следующую задачу:
    Дан текстовый файл, содержащий целое число N. Разработать программу, ожидающую запуск N-1 аналогичных программ после своего запуска. По достижении требуемого количества запущенных копий, программа завершает свою работу. Иными словами, одновременно может быть запущено до N программ, образующих очередь, причем, если очередь заполнена, первая в очереди программа немедленно завершает свою работу, когда в конце очереди появляется новая программа.

    Дополнительные задания:

    • Запуск программ не должен требовать предварительных манипуляций с ОС, файлами и т.д.
    • Завершение работы программы в очереди сторонными средствами (напр. - принудительное завершение) не должно влиять на механизм работы всей системы. То есть, если из середины очереди была удалена программа, следует считать, что очередь просто сократилась на один элемент со смещением всех элементов начала очереди.

    Тестовые решения:
    Решение (без дополнительных заданий) для ОС Linux
    Решение (без дополнительных заданий) для ОС Windows