Введение
Операционные системы используют менеджеры блокировок для организации и сериализации доступа к ресурсам. Распределенный менеджер блокировок (DLM) работает на каждой машине в кластере, имея идентичную копию общекластерной базы данных блокировок. Таким образом, DLM предоставляет программным приложениям, распределенным по кластеру на нескольких машинах, средства для синхронизации их доступа к общим ресурсам. DLM использовались в качестве основы для нескольких успешных кластерных файловых систем, в которых машины в кластере могут использовать хранилище друг друга через единую файловую систему, что дает значительные преимущества в производительности и доступности. Основное повышение производительности достигается за счет решения проблемы когерентности кэша диска между участвующими компьютерами. DLM используется не только для блокировки файлов, но и для координации всего доступа к диску. VMScluster, первая система кластеризации, получившая широкое распространение, использовала OpenVMS DLM именно таким образом.
Получение блокировки
Процесс может получить блокировку ресурса, поместив запрос на блокировку в очередь. Это аналогично технике QIO, используемой для выполнения операций ввода-вывода. Запрос блокировки в очереди может быть выполнен синхронно, в этом случае процесс ожидает, пока блокировка не будет предоставлена, или асинхронно, в этом случае генерируется AST (асинхронное событие трассировки) после получения блокировки. Также возможно установить блокирующий AST, который активируется, когда процесс получает блокировку, препятствующую доступу к ресурсу другим процессам. Исходный процесс затем может предпринять действия, чтобы разрешить доступ другим процессам (например, понизив приоритет или освободив блокировку).
Блок с запертой стоимостью
Каждому ресурсу сопоставлен блок значения блокировки. Его может прочитать любой процесс, получивший блокировку этого ресурса (за исключением нулевой блокировки), а обновлять его может процесс, получивший защищенную блокировку на обновление или эксклюзивную блокировку. Этот блок может использоваться для хранения любой информации о ресурсе, которую выберет разработчик приложения. Типичное применение – хранение номера версии ресурса. Каждый раз, когда соответствующая сущность (например, запись в базе данных) обновляется, владелец блокировки увеличивает значение блока блокировки. Когда другой процесс хочет прочитать ресурс, он получает соответствующую блокировку и сравнивает текущее значение блока блокировки со значением, которое было при последнем получении блокировки этого ресурса. Если значения совпадают, процесс понимает, что соответствующая сущность не изменялась с момента последнего чтения, и повторное чтение не требуется. Таким образом, этот метод можно использовать для реализации различных типов кэша в базе данных или аналогичном приложении.
Обнаружение тупика
Когда один или несколько процессов получили блокировки ресурсов, может возникнуть ситуация, в которой каждый процесс препятствует другому получить блокировку, и ни один из них не может продолжить работу. Это называется взаимоблокировкой (E. W. Dijkstra первоначально называл это «смертельными объятиями»). Простой пример: процесс 1 получил эксклюзивную блокировку ресурса А, а процесс 2 – эксклюзивную блокировку ресурса В. Если процесс 1 затем попытается заблокировать ресурс В, он должен будет ждать, пока процесс 2 его не освободит. Но если процесс 2 попытается заблокировать ресурс А, оба процесса будут бесконечно ждать друг друга. Система OpenVMS DLM периодически проверяет наличие ситуаций взаимоблокировки. В приведенном выше примере второй запрос на постановку в очередь блокировки одного из процессов вернет статус взаимоблокировки. Тогда этот процесс должен будет предпринять действия для разрешения взаимоблокировки – в данном случае, освободив первую полученную блокировку.
Кластеризация Linux
И Red Hat, и Oracle разработали программное обеспечение для кластеризации Linux. OCFS2, файловая система Oracle Cluster File System, была добавлена в официальное ядро Linux в версии 2.6.16 в январе 2006 года. Предупреждение о коде альфа-качества для OCFS2 было снято в версии 2.6.19. Программное обеспечение для кластеризации Red Hat, включая DLM и GFS2, было официально добавлено в ядро Linux в версии 2.6.19 в ноябре 2006 года. Обе системы используют DLM, основанный на проверенном временем VMS DLM. DLM от Oracle имеет более простой API. (базовая функция, dlmlock, имеет восемь параметров, в то время как служба VMS SYS$ENQ и функция dlm lock от Red Hat обе имеют 11.)