Синхронизация и взаимодействие процессов
Доступ процессов (задач) к различным ресурсам (особенно разделяемым) в многозадачных системах требует синхронизации действий этих процессов (задач). Способы осуществления взаимодействия подразделяют на:
безопасное взаимодействие, когда обмен данными осуществляется посредством "объектов" взаимодействия, предоставляемых системой; при этом целостность информации и неделимость операций с нею (т.е. отсутствие нежелательного переключения задач) неявно обеспечиваются системой; примерами таких "объектов" взаимодействия являются семафоры, сигналы и почтовые ящики;
небезопасное взаимодействие, когда обмен данными осуществляется посредством разделяемых ресурсов (например, общих переменных), не зависимых от системных объектов взаимодействия; при этом целостность информации и неделимость явно обеспечивается самим приложением (в подавляющем большинстве случаев – посредством того или иного системного объекта синхронизации и взаимодействия).
Если процессы независимы (не имеют совместно используемых ресурсов), то синхронизация их работы не требуется. Если же процессы используют разделяемый ресурс, то их деятельность необходимо синхронизировать.
При синхронизации задач необходимо бороться с 3-мя проблемами:
1. "блокировка" ("lockout"):
• процесс (задача) ожидает ресурс, который никогда не освободится,
2. "тупик" ("deadlock"):
• два процесса (задачи) владеют каждый по ресурсу и ожидают освобождения ресурса, которым владеет другой процесс (задача),
3. "застой" ("starvation"):
• процесс (задача) монополизировал процессор.
Поскольку для любого типа взаимодействия требуются системные объекты синхронизации, то все имеющиеся ОСРВ предоставляют приложениям некоторый набор таких объектов. Ниже мы рассмотрим самые распространенные из них.
Разделяемая память
Определение. Разделяемая память – это область памяти, к которой имеют доступ несколько процессов. Взаимодействие через разделяемую память является базовым механизмом взаимодействия процессов, к которому сводятся все остальные. Оно, с одной стороны, является самым быстрым видом взаимодействия, поскольку процессы напрямую (т.е. без участия ОСРВ) передают данные друг другу. С другой стороны, оно является небезопасным, и для обеспечения правильности передачи информации используются те или иные объекты синхронизации.
В системах с виртуальной памятью рекомендуется использовать следующий подход к логической организации разделяемой памяти. Разделяемая память логически представляется как файл, отображенный на память (т.е. файл, рассматриваемый как массив байтов в памяти). При этом разделяемая память полностью находится в пользовательском адресном пространстве, и отсутствуют дополнительные задержки при доступе к ней.
В системах с виртуальной памятью над разделяемой памятью определены следующие элементарные операции.
создать (или открыть) разделяемую память, при этом разделяемая память появляется в процессе как объект, но доступ к ее содержимому еще невозможен;
подсоединить разделяемую память к адресному пространству процесса, при этом происходит отображение разделяемой памяти на виртуальное адресное пространство процесса; после этой операции разделяемая память доступна для использования;
отсоединить разделяемую память от адресного пространства процесса, после этой операции доступ к содержимому разделяемой памяти невозможен;
удалить (или закрыть) разделяемую память, реально разделяемая память будет удалена, когда с ней закончит работать последний из процессов.
В системах без виртуальной памяти эти операции тривиальны.
Использование виртуальной памяти является настолько удобным средством разделения задач и обеспечения им непрерывного адресного пространства, налагающегося с фиксированного адреса, что оно используется во многих системах.
Однако, наличие виртуальной памяти противоречит основным принципам ОСРВ.
