Синхронизация параллельно выполняемых задач
Общая память
Общая память - это физическая память, присвоенная общему пулу памяти и доступная для нескольких логических разделов. Общий пул памяти - это определенный набор блоков физической памяти, управляемых как единый пул памяти гипервизором. Логические разделы, настроенные для использования общей памяти (далее - разделы с общей памятью), используют память из этого пула совместно с другими разделами с общей памятью.
Например, вы создаете общий пул памяти с 16 ГБ физической памяти. Затем создаете три логических раздела, настраиваете их для использования общей памяти и активируете разделы с общей памятью. Каждый раздел с общей памятью может использовать эти 16 ГБ общего пула памяти.
Гипервизор определяет объем памяти, выделенный из общего пула памяти каждому разделу с общей памятью, в зависимости от конфигурации памяти и нагрузки каждого раздела с общей памятью. При выделении физической памяти разделам с общей памятью гипервизор гарантирует, что каждый раздел с общей памятью в любой определенный момент может иметь доступ только к памяти, выделенной этому разделу с общей памятью. Раздел с общей памятью не может обращаться к физической памяти, выделенной другому разделу с общей памятью.
Объем памяти, присвоенной разделам с общей памятью, может быть больше объема памяти общего пула памяти. Например, можно присвоить 12 ГБ разделу с общей памятью 1, 8 ГБ - разделу с общей памятью 2 и 4 ГБ - разделу с общей памятью 3. В сумме разделы с общей памятью используют 24 ГБ памяти, но в общем пуле памяти имеется только 16 ГБ памяти. В этом случае считается, что конфигурация памяти завышена.
Завышенная конфигурация памяти допускается, поскольку гипервизор выполняет виртуализацию и управляет всей памятью, предоставленной разделам с общей памятью, следующим образом:
Если разделы с общей памятью не достаточно активно используют свои страницы памяти, гипервизор выделяет эти неиспользуемые страницы тем разделам с общей памятью, которым память необходима. Если суммарный объем физической памяти, используемой в данный момент разделами с общей памятью, не превышает объема памяти общего пула памяти, то конфигурация памяти является логически завышенной. При логически завышенной конфигурации памяти в общем пуле памяти достаточно физической памяти для использования всеми разделами с общей памятью одновременно. Гипервизору не требуется сохранять данные во вспомогательной памяти.
Если разделу с общей памятью требуется больше памяти, чем может предложить гипервизор за счет выделения неиспользуемых участков общего пула памяти, то гипервизор сохраняет часть памяти, принадлежащей разделу с общей памятью, в общем пуле памяти, а остальную память, принадлежащую разделу с общей памятью, сохраняет во вспомогательной памяти. Если суммарный объем физической памяти, используемой в данный момент разделами с общей памятью, превышает объем памяти общего пула памяти, то конфигурация памяти является физически завышенной. При физически завышенной конфигурации памяти в общем пуле памяти недостаточно физической памяти для использования всеми разделами с общей памятью одновременно. Соответствующий остаток гипервизор сохраняет во вспомогательной памяти. При попытке операционной системы обратиться к данным гипервизору может потребоваться извлечь данные из вспомогательной памяти, чтобы операционной системе удалось получить к ним доступ.
Поскольку память, присвоенная разделу с общей памятью, не всегда находится в общем пуле памяти, такая память является логической памятью. Логическая память - это адресное пространство, присвоенное логическому разделу, воспринимаемое операционной системой как основная память. Для раздела с общей памятью подмножество логической памяти обеспечивается основной физической памятью (или физической памятью общего пула памяти), а содержимое остальной логической памяти сохраняется во вспомогательной памяти.
Логический раздел VIOS (сервер виртуального ввода-вывода) предоставляет доступ к вспомогательной памяти (или устройствам пространства подкачки), необходимой для разделов с общей памятью при завышенной конфигурации памяти. Устройство пространства подкачки - это физическое или логическое устройство, используемое отдельным VIOS (сервер виртуального ввода-вывода) для предоставления пространства подкачки разделу с общей памятью. Пространство подкачки - это область энергонезависимой памяти, используемой для хранения тех ресурсов логической памяти разделов с общей памятью, которые не сохранены в общем пуле памяти. Если при попытке операционной системы, запущенной в разделе с общей памятью, обратиться к данным, данные расположены в устройстве пространства подкачки, присвоенном этому разделу с общей памятью, то гипервизор отправляет запрос VIOS (сервер виртуального ввода-вывода) на получение данных и запись их в общий пул памяти, чтобы операционной системе удалось получить к ним доступ.
При использовании систем, управляемых с помощью HMC (Консоль аппаратного обеспечения), общему пулу памяти можно одновременно присвоить до двух логических разделов VIOS (сервер виртуального ввода-вывода) (именуемых далее разделы VIOS с подкачкой). Если два раздела VIOS с подкачкой присвоены общему пулу памяти, то можно настроить устройства пространства подкачки таким образом, чтобы оба раздела VIOS с подкачкой имели доступ к одним и тем же устройствам пространства подкачки. Когда один раздел VIOS с подкачкой становится недоступным, гипервизор отправляет запрос другому разделу VIOS с подкачкой на получение данных из устройства пространства подкачки.
Невозможно настроить разделы VIOS с подкачкой для использования общей памяти. Разделы VIOS с подкачкой не используют память общего пула памяти. Можно присвоить разделы VIOS с подкачкой общему пулу памяти, чтобы они могли предоставить доступ к устройствам пространства подкачки для разделов с общей памятью, присвоенных общему пулу памяти.
На основе нагрузки, запрашиваемой разделами с общей памятью, гипервизор управляет завышенными конфигурациями памяти, непрерывно выполняя следующие задачи:
Выделение ресурсов физической памяти из общего пула памяти разделам с общей памятью в соответствии с необходимостью.
Запрос разделу VIOS с подкачкой на чтение и запись данных между общим пулом памяти и устройствами пространства подкачки в соответствии с необходимостью
Возможность нескольких логических разделов использовать общую память называется технологией Совместное использование PowerVMActiveMemory. Технология Совместное использование PowerVMActiveMemory доступна через PowerVMEnterpriseEdition, для которого необходимо получить и ввести код активации PowerVMEditions.
Параллельный и исключающий доступ к памяти
Алгоритмы параллельного и исключающего чтения можно скомбинировать и получить следующие типы объединенных алгоритмов, которые можно использовать для организации доступа к данным:
• исключающее чтение и исключающая запись (exclusivereadandocclusive
«Write EREW);
• параллельное чтение и исключающая запись (concurreni л-adandexclusive «rite - CREW);
• исключающее чтение и параллельная запись (occlusivenradandconcurrent «rile — ERCW);
• параллельное чтение и параллельная запись (concurrentreadandconcurrentwrite — CRCW).
Эти алгоритмы можно рассматривать как стратегии доступа, реализуемые задачами, которые совместно используют данные (рис. 5.-1). Алгоритм EREW подразумевает последовательный доступ к разделяемой памяти, т.е. к общей памяти в любой момент времени может получить доступ только одна задача. Примером стратегии доступа EREW может служить вариант реализации модели потоков "производителе потребитель", рассмотренный в главе 4. Доступ к очереди, содержащей имена файлов. может быть ограничен исключающей записью “изготовителя" и исключающим чтением «потребителя». В любой момент времени доступ к очереди может быть разрешен только дли одной задачи. Стратегия CREW позволяет множественный доступ для чтения общей памяти и исключающий доступ для записи в нее данных. Это означает отсутствие ограничений на количество задач, которые могут одновременно читать разделяемую память, но записывать в нее данные может только одна задача. 11рн этом параллельное чтение может происходить одновременно с записью данных в общую память. При использовании этой стратегии доступа все читающие задачи могут прочитать различные значения, поскольку во время чтения значения из общей памяти записывающая задача может его модифицировать. Стратегия доступа ERCW — это прямая противоположность стратегии CREW. При использовании стратегии ERCW разрешены параллельные записи в общую память, но лишь одна задача может читать ее в любой момент времени. Стратегия доступа CRCW позволяет множеству задач выполнять параллельное чтение и запись.
Для этих четырех типов алгоритмов требуются различные уровни и типы синхронизации. Их диапазон довольно широк: от стратегии доступа, реализация которой требует минимальной синхронизации, до стратегии доступа, реализация которой требует максимальной синхронизации. Наша задача— реализовать эти стратегии, поддерживая целостность данных и удовлетворительную производительность системы. EREW — самая простая для реализации стратегия, поскольку она предполагает, по сути, только последовательную обработку. Па первый взгляд самой простой может показаться стратегия CRCW*, но она таит в себе массу трудностей. А ведь это только кажется, что если к памяти можно получить доступ без ограничений, то в ней и речь идет о какой бы то ни было стратегии. Вес как раз наоборот: CRCW — самая трудная для реализации стратегия, которая требует максимальной синхронизации.
Разделяемая память
Разделяемая память является самым быстрым средством обмена данными между процессами.
В других средствах межпроцессового взаимодействия (IPC) обмен информацией между процессами проходит через ядро, что приводит к переключению контекста между процессом и ядром, т.е. к потерям производительности.
Техника разделяемой памяти позволяет осуществлять обмен информацией через общий для процессов сегмент памяти без использования системных вызовов ядра. Сегмент разделяемой памяти подключается в свободную часть виртуального адресного пространства процесса. Таким образом, два разных процесса могут иметь разные адреса одной и той же ячейки подключенной разделяемой памяти.
Краткое описание работы
После создания разделяемого сегмента памяти любой из пользовательских процессов может подсоединить его к своему собственному виртуальному пространству и работать с ним, как с обычным сегментом памяти. Недостатком такого обмена информацией является отсутствие каких бы то ни было средств синхронизации, однако для преодоления этого недостатка можно использовать технику семафоров.
Программная реализация
В программном обеспечении разделяемой памятью называют:
Метод межпроцессного взаимодействия (IPC), то есть способ обмена данными между программами, работающими одновременно. Один процесс создаёт область в оперативной памяти, которая может быть доступна для других процессов.
Метод экономии памяти, путём прямого обращения к тем исходным данным, которые при обычном подходе являются отдельными копиями исходных данных, вместо отображения виртуальной памяти или описанного метода . Такой подход обычно используется для разделяемых библиотек и для XIP.
Поскольку оба процесса могут получить доступ к общей области памяти как к обычной памяти, это очень быстрый способ связи (в отличие от других механизмов IPC, таких как именованные каналы, UNIX-сокеты или CORBA). С другой стороны, такой способ менее гибкий, например, обменивающиеся процессы должны быть запущены на одной машине (из перечисленных методов IPC только сетевые сокеты, не путать с сокетами домена UNIX, могут вести обмен данными через сеть), и необходимо быть внимательным, чтобы избежать проблем при использовании разделяемой памяти на разных ядрах процессора и аппаратной архитектуре без когерентного кэша.
Обмен данными через разделяемую память используется, например, для передачи изображений между приложением и X-сервером на Unix системах, или внутри объекта IStream возвращаемого CoMarshalInterThreadInterfaceInStream в библиотеке COM под Windows.
Динамические библиотеки, как правило, загружаются в память один раз и отображены на несколько процессов, и только страницы, которые специфичны для отдельного процесса (поскольку отличаются некоторые идентификаторы) дублируются, как правило, с помощью механизма, известного как копирование-при-записи, который при попытке записи в разделяемую память незаметно для вызывающего запись процесса копирует страницы памяти, а затем записывает данные в эту копию.
Разделяемая память POSIX
POSIX позволяет связать с объектом разделяемой памяти файловый дескриптор, что является более унифицированным механизмом, чем механизм UNIX System V. Для работы с памятью могут быть использованы следующие функции языка C:
shm_open — создание или подключение объекта разделяемой памяти POSIX по его имени[6];
shm_unlink — удаление объекта разделяемой памяти по его имени (при этом сегмент разделяемой памяти будет существовать, пока не будет отключен от всех процессов)[11];
ftruncate — задаёт или изменяет размер разделяемой памяти (или отображённого в память файла)[12];
mmap — подключает существующий или создаёт анонимный сегмент разделяемой памяти к адресному пространству процесса
Общая память
Общая память - это физическая память, присвоенная общему пулу памяти и доступная для нескольких логических разделов. Общий пул памяти - это определенный набор блоков физической памяти, управляемых как единый пул памяти гипервизором. Логические разделы, настроенные для использования общей памяти (далее - разделы с общей памятью), используют память из этого пула совместно с другими разделами с общей памятью.
Например, вы создаете общий пул памяти с 16 ГБ физической памяти. Затем создаете три логических раздела, настраиваете их для использования общей памяти и активируете разделы с общей памятью. Каждый раздел с общей памятью может использовать эти 16 ГБ общего пула памяти.
Гипервизор определяет объем памяти, выделенный из общего пула памяти каждому разделу с общей памятью, в зависимости от конфигурации памяти и нагрузки каждого раздела с общей памятью. При выделении физической памяти разделам с общей памятью гипервизор гарантирует, что каждый раздел с общей памятью в любой определенный момент может иметь доступ только к памяти, выделенной этому разделу с общей памятью. Раздел с общей памятью не может обращаться к физической памяти, выделенной другому разделу с общей памятью.
Объем памяти, присвоенной разделам с общей памятью, может быть больше объема памяти общего пула памяти. Например, можно присвоить 12 ГБ разделу с общей памятью 1, 8 ГБ - разделу с общей памятью 2 и 4 ГБ - разделу с общей памятью 3. В сумме разделы с общей памятью используют 24 ГБ памяти, но в общем пуле памяти имеется только 16 ГБ памяти. В этом случае считается, что конфигурация памяти завышена.
Завышенная конфигурация памяти допускается, поскольку гипервизор выполняет виртуализацию и управляет всей памятью, предоставленной разделам с общей памятью, следующим образом:
Если разделы с общей памятью не достаточно активно используют свои страницы памяти, гипервизор выделяет эти неиспользуемые страницы тем разделам с общей памятью, которым память необходима. Если суммарный объем физической памяти, используемой в данный момент разделами с общей памятью, не превышает объема памяти общего пула памяти, то конфигурация памяти является логически завышенной. При логически завышенной конфигурации памяти в общем пуле памяти достаточно физической памяти для использования всеми разделами с общей памятью одновременно. Гипервизору не требуется сохранять данные во вспомогательной памяти.
Если разделу с общей памятью требуется больше памяти, чем может предложить гипервизор за счет выделения неиспользуемых участков общего пула памяти, то гипервизор сохраняет часть памяти, принадлежащей разделу с общей памятью, в общем пуле памяти, а остальную память, принадлежащую разделу с общей памятью, сохраняет во вспомогательной памяти. Если суммарный объем физической памяти, используемой в данный момент разделами с общей памятью, превышает объем памяти общего пула памяти, то конфигурация памяти является физически завышенной. При физически завышенной конфигурации памяти в общем пуле памяти недостаточно физической памяти для использования всеми разделами с общей памятью одновременно. Соответствующий остаток гипервизор сохраняет во вспомогательной памяти. При попытке операционной системы обратиться к данным гипервизору может потребоваться извлечь данные из вспомогательной памяти, чтобы операционной системе удалось получить к ним доступ.
Поскольку память, присвоенная разделу с общей памятью, не всегда находится в общем пуле памяти, такая память является логической памятью. Логическая память - это адресное пространство, присвоенное логическому разделу, воспринимаемое операционной системой как основная память. Для раздела с общей памятью подмножество логической памяти обеспечивается основной физической памятью (или физической памятью общего пула памяти), а содержимое остальной логической памяти сохраняется во вспомогательной памяти.
Логический раздел VIOS (сервер виртуального ввода-вывода) предоставляет доступ к вспомогательной памяти (или устройствам пространства подкачки), необходимой для разделов с общей памятью при завышенной конфигурации памяти. Устройство пространства подкачки - это физическое или логическое устройство, используемое отдельным VIOS (сервер виртуального ввода-вывода) для предоставления пространства подкачки разделу с общей памятью. Пространство подкачки - это область энергонезависимой памяти, используемой для хранения тех ресурсов логической памяти разделов с общей памятью, которые не сохранены в общем пуле памяти. Если при попытке операционной системы, запущенной в разделе с общей памятью, обратиться к данным, данные расположены в устройстве пространства подкачки, присвоенном этому разделу с общей памятью, то гипервизор отправляет запрос VIOS (сервер виртуального ввода-вывода) на получение данных и запись их в общий пул памяти, чтобы операционной системе удалось получить к ним доступ.
При использовании систем, управляемых с помощью HMC (Консоль аппаратного обеспечения), общему пулу памяти можно одновременно присвоить до двух логических разделов VIOS (сервер виртуального ввода-вывода) (именуемых далее разделы VIOS с подкачкой). Если два раздела VIOS с подкачкой присвоены общему пулу памяти, то можно настроить устройства пространства подкачки таким образом, чтобы оба раздела VIOS с подкачкой имели доступ к одним и тем же устройствам пространства подкачки. Когда один раздел VIOS с подкачкой становится недоступным, гипервизор отправляет запрос другому разделу VIOS с подкачкой на получение данных из устройства пространства подкачки.
Невозможно настроить разделы VIOS с подкачкой для использования общей памяти. Разделы VIOS с подкачкой не используют память общего пула памяти. Можно присвоить разделы VIOS с подкачкой общему пулу памяти, чтобы они могли предоставить доступ к устройствам пространства подкачки для разделов с общей памятью, присвоенных общему пулу памяти.
На основе нагрузки, запрашиваемой разделами с общей памятью, гипервизор управляет завышенными конфигурациями памяти, непрерывно выполняя следующие задачи:
Выделение ресурсов физической памяти из общего пула памяти разделам с общей памятью в соответствии с необходимостью.
Запрос разделу VIOS с подкачкой на чтение и запись данных между общим пулом памяти и устройствами пространства подкачки в соответствии с необходимостью
Возможность нескольких логических разделов использовать общую память называется технологией Совместное использование PowerVMActiveMemory. Технология Совместное использование PowerVMActiveMemory доступна через PowerVMEnterpriseEdition, для которого необходимо получить и ввести код активации PowerVMEditions.
Параллельный и исключающий доступ к памяти
Алгоритмы параллельного и исключающего чтения можно скомбинировать и получить следующие типы объединенных алгоритмов, которые можно использовать для организации доступа к данным:
• исключающее чтение и исключающая запись (exclusivereadandocclusive
«Write EREW);
• параллельное чтение и исключающая запись (concurreni л-adandexclusive «rite - CREW);
• исключающее чтение и параллельная запись (occlusivenradandconcurrent «rile — ERCW);
• параллельное чтение и параллельная запись (concurrentreadandconcurrentwrite — CRCW).
Эти алгоритмы можно рассматривать как стратегии доступа, реализуемые задачами, которые совместно используют данные (рис. 5.-1). Алгоритм EREW подразумевает последовательный доступ к разделяемой памяти, т.е. к общей памяти в любой момент времени может получить доступ только одна задача. Примером стратегии доступа EREW может служить вариант реализации модели потоков "производителе потребитель", рассмотренный в главе 4. Доступ к очереди, содержащей имена файлов. может быть ограничен исключающей записью “изготовителя" и исключающим чтением «потребителя». В любой момент времени доступ к очереди может быть разрешен только дли одной задачи. Стратегия CREW позволяет множественный доступ для чтения общей памяти и исключающий доступ для записи в нее данных. Это означает отсутствие ограничений на количество задач, которые могут одновременно читать разделяемую память, но записывать в нее данные может только одна задача. 11рн этом параллельное чтение может происходить одновременно с записью данных в общую память. При использовании этой стратегии доступа все читающие задачи могут прочитать различные значения, поскольку во время чтения значения из общей памяти записывающая задача может его модифицировать. Стратегия доступа ERCW — это прямая противоположность стратегии CREW. При использовании стратегии ERCW разрешены параллельные записи в общую память, но лишь одна задача может читать ее в любой момент времени. Стратегия доступа CRCW позволяет множеству задач выполнять параллельное чтение и запись.
Для этих четырех типов алгоритмов требуются различные уровни и типы синхронизации. Их диапазон довольно широк: от стратегии доступа, реализация которой требует минимальной синхронизации, до стратегии доступа, реализация которой требует максимальной синхронизации. Наша задача— реализовать эти стратегии, поддерживая целостность данных и удовлетворительную производительность системы. EREW — самая простая для реализации стратегия, поскольку она предполагает, по сути, только последовательную обработку. Па первый взгляд самой простой может показаться стратегия CRCW*, но она таит в себе массу трудностей. А ведь это только кажется, что если к памяти можно получить доступ без ограничений, то в ней и речь идет о какой бы то ни было стратегии. Вес как раз наоборот: CRCW — самая трудная для реализации стратегия, которая требует максимальной синхронизации.
Синхронизация параллельно выполняемых задач
Разделяемая память
Разделяемая память является самым быстрым средством обмена данными между процессами.
В других средствах межпроцессового взаимодействия (IPC) обмен информацией между процессами проходит через ядро, что приводит к переключению контекста между процессом и ядром, т.е. к потерям производительности.
Техника разделяемой памяти позволяет осуществлять обмен информацией через общий для процессов сегмент памяти без использования системных вызовов ядра. Сегмент разделяемой памяти подключается в свободную часть виртуального адресного пространства процесса. Таким образом, два разных процесса могут иметь разные адреса одной и той же ячейки подключенной разделяемой памяти.
Краткое описание работы
После создания разделяемого сегмента памяти любой из пользовательских процессов может подсоединить его к своему собственному виртуальному пространству и работать с ним, как с обычным сегментом памяти. Недостатком такого обмена информацией является отсутствие каких бы то ни было средств синхронизации, однако для преодоления этого недостатка можно использовать технику семафоров.