Средства синхронизации и взаимодействия процессов.
Процесс (задача) – программа, находящаяся в режиме выполнения.
Процессам часто нужно взаимодействовать друг с другом, например, один процесс может передавать данные другому процессу, или несколько процессов могут обрабатывать данные из общего файла.
Способы взаимодействия процессов:
1) Разделяемая память;
2) Каналы – псевдофайл, в который один процесс пишет, другой из него читает. Каналы могут быть реализованы как в пределах одного компьютера, так и по сети при помощи сокетов;
3) Сокеты – механизм, поддерживаемый ОС, предоставляющий возможность взаимодействия между процессами как в пределах одного компьютера, так и между двумя компьютерами по сети;
4) Механизм вызовов удаленных процедур (RPC), обеспечивающий передачу управления удаленному процессу.
Во всех этих случаях возникает проблема синхронизации процессов, которая может решаться приостановкой и активизацией процессов, организацией очередей, блокированием и освобождением ресурсов.
Пренебрежение вопросами синхронизации процессов, выполняющихся в режиме мультипрограммирования, может привести к их неправильной работе или даже к краху системы (в результате одновременной работы с ресурсами).
Важным понятием синхронизации процессов является понятие "критическая секция" программы. Критическая секция - это часть программы, в которой осуществляется доступ к разделяемым данным. Чтобы исключить эффект гонок по отношению к некоторому ресурсу, необходимо обеспечить, чтобы в каждый момент в критической секции, связанной с этим ресурсом, находился максимум один процесс. Этот прием называют взаимным исключением.
Критические секции могут быть реализованы с использованием блокирующих переменных. Для синхронизации процессов в операционных системах применяются следующие механизмы:
1) Критические секции (critical section) – механизм, частный случай мьютексов в системах Windows. Представляет собой системную переменную, к которой получает непосредственный доступ только операционная система. Потоки же устанавливают эту переменную с помощью вызовов функций enter() и leave(). Если переменная занята одним потоком, никакой другой поток не может исполнить код, огражденный вызовами функций enter и leave. Критическая секция обеспечивает синхронизацию потоков только в пределах одного процесса.
2) Семафор – объект, позволяющий войти в заданный участок кода не более чем n потокам. Над семафором можно производить 3 операции: инициализацию некоторым значением, инкремент (Up) и декремент (Down). Прежде чем заблокировать процесс, Down проверяет семафор, если он равен нулю, то он блокирует процесс, если нет, то процесс снова становится активным, и уменьшает семафор на единицу. Up увеличит значение семафора на 1 или разблокирует процесс находящийся в ожидании. Down и Up выполняются как элементарное действие, т.е. процесс не может быть блокирован во время выполнения этих операций.
3) Мьютекс – одноместный семафор, один из вариантов семафорных механизмов для организации взаимного исключения. Они реализованы во многих ОС, их основное назначение — организация взаимного исключения для потоков из одного или из разных процессов. Мьютексы могут находиться в одном из двух состояний — отмеченном или неотмеченном (открыт и закрыт соответственно). Когда какой-либо поток, принадлежащий любому процессу, становится владельцем объекта мьютекса, последний переводится в неотмеченное состояние. Когда поток освобождает мьютекс, его состояние становится отмеченным. Ожидающие освобождения мьютекса процессы выстраиваются в очередь.
4) Механизм событий – более общий механизм для синхронизации. В разных операционных системах аппарат событий реализуется по-своему, но в любом случае используются системные функции аналогичного назначения, которые условно назовем WAIT(x) и POST(x), где x - идентификатор некоторого события. Если ресурс занят, то процесс не выполняет циклический опрос, а вызывает системную функцию WAIT(D), здесь D обозначает событие, заключающееся в освобождении ресурса D. Функция WAIT(D) переводит активный процесс в состояние ОЖИДАНИЕ и делает отметку в его дескрипторе о том, что процесс ожидает события D. Процесс, который в это время использует ресурс D, после выхода из критической секции выполняет системную функцию POST(D), в результате чего операционная система просматривает очередь ожидающих процессов и переводит процесс, ожидающий события D, в состояние ГОТОВНОСТЬ.
4.4. Файловая система.
Файловая система - это часть операционной системы, назначение которой состоит в том, чтобы обеспечить пользователю удобный интерфейс при работе с данными, хранящимися на диске, и обеспечить совместное использование файлов несколькими пользователями и процессами.
В широком смысле понятие "файловая система" включает:
§ совокупность всех файлов на диске,
§ наборы структур данных, используемых для управления файлами, такие, например, как каталоги файлов, дескрипторы файлов, таблицы распределения свободного и занятого пространства на диске,
§ комплекс системных программных средств, реализующих управление файлами, в частности: создание, уничтожение, чтение, запись, именование, поиск и другие операции над файлами.
Файлы идентифицируются именами. Пользователи дают файлам символьные имена, при этом учитываются ограничения ОС как на используемые символы, так и на длину имени. Обычно разные файлы могут иметь одинаковые символьные имена. В этом случае файл однозначно идентифицируется так называемым составным именем, представляющем собой последовательность символьных имен каталогов. В некоторых системах одному и тому же файлу не может быть дано несколько разных имен, а в других такое ограничение отсутствует. В последнем случае операционная система присваивает файлу дополнительно уникальное имя, так, чтобы можно было установить взаимно-однозначное соответствие между файлом и его уникальным именем. Уникальное имя представляет собой числовой идентификатор и используется программами операционной системы. Примером такого уникального имени файла является номер индексного дескриптора в системе UNIX (i-node).
Файлы бывают разных типов: обычные файлы, специальные файлы, файлы-каталоги.
Обычные файлы в свою очередь подразделяются на текстовые и двоичные. Текстовые файлы состоят из строк символов, представленных в ASCII-коде. Двоичные файлы не используют ASCII-коды, они часто имеют сложную внутреннюю структуру, например, объектный код программы или архивный файл. Все операционные системы должны уметь распознавать хотя бы один тип файлов - их собственные исполняемые файлы.
Специальные файлы - это файлы, ассоциированные с устройствами ввода-вывода, которые позволяют пользователю выполнять операции ввода-вывода, используя обычные команды записи в файл или чтения из файла. Эти команды обрабатываются вначале программами файловой системы, а затем на некотором этапе выполнения запроса преобразуются ОС в команды управления соответствующим устройством.
Каталог - это, с одной стороны, группа файлов, объединенных пользователем исходя из некоторых соображений (например, файлы, содержащие программы игр, или файлы, составляющие один программный пакет), а с другой стороны - это файл, содержащий системную информацию о группе файлов, его составляющих. В каталоге содержится список файлов, входящих в него, и устанавливается соответствие между файлами и их характеристиками (атрибутами).
Иерархия каталогов может быть деревом или сетью. Каталоги образуют дерево, если файлу разрешено входить только в один каталог, и сеть - если файл может входить сразу в несколько каталогов. В MS-DOS каталоги образуют древовидную структуру, а в UNIX'е - сетевую.
Физическая организация файла описывает правила расположения файла на устройстве внешней памяти, в частности на диске. Файл состоит из физических записей - блоков. Блок - наименьшая единица данных, которой внешнее устройство обменивается с оперативной памятью.
Варианты размещения файлов на диске:
1) Непрерывное размещение – простейший вариант физической организации, при котором файлу предоставляется последовательность блоков диска, образующий единый сплошной участок дисковой памяти.
2) В виде связанного списка блоков. При таком способе в начале каждого блока содержится указатель на следующий блок. В отличие от предыдущего способа, каждый блок может быть присоединен в цепочку какого-либо файла, следовательно фрагментация отсутствует. Файл может изменяться во время своего существования, наращивая число блоков. Недостатком является сложность реализации доступа к произвольно заданному месту файла.
3) Использование связанного списка индексов, который хранится в специальной таблице дисковой памяти (FAT в Windows). Если некоторый блок распределен некоторому файлу, то индекс этого блока содержит номер следующего блока данного файла.
4) Перечисление номеров блоков, занимаемым файлом.
Для того, чтобы определить для каждого пользователя список операций, которые он может производить с данным файлом, файловая система обеспечивает механизм прав доступа. В некоторых системах пользователи могут быть разделены на отдельные категории. Для всех пользователей одной категории определяются единые права доступа. Например, в системе UNIX все пользователи подразделяются на три категории: владельца файла, членов его группы и всех остальных.