патент
№ RU 2577200
МПК G06F9/50

СПОСОБ СИНХРОНИЗАЦИИ ДОСТУПА К РАЗДЕЛЯЕМЫМ РЕСУРСАМ ВЫЧИСЛИТЕЛЬНОЙ СИСТЕМЫ ПОД УПРАВЛЕНИЕМ POSIX-СОВМЕСТИМОЙ ОС И ОБНАРУЖЕНИЯ И УСТРАНЕНИЯ ПОВИСШИХ БЛОКИРОВОК С ИСПОЛЬЗОВАНИЕМ БЛОКИРОВОЧНЫХ ФАЙЛОВ

Авторы:
Мардугаллямов Руслан Тахирович
Номер заявки
2014143964/08
Дата подачи заявки
31.10.2014
Опубликовано
10.03.2016
Страна
RU
Как управлять
интеллектуальной собственностью
Реферат

Изобретение относится к способу обнаружения и устранения повисших блокировок с использованием блокировочных файлов. Технический результат заключается в повышении надежности обнаружения и устранения повисших блокировок. Ассоциируют разделяемый ресурс с блокировочным файлом. Вызывают системный вызов атомарного эксклюзивного создания и открытия временного файла с уникальным именем и в той же файловой системе. Осуществляют системный вызов создания жесткой ссылки с именем блокировочного файла на временный файл. Если системный вызов создания жесткой ссылки выполнен успешно, то удаляют жесткую ссылку на временный файл и обеспечивают выполнение текущим процессом операций с разделяемым ресурсом. Если текущий процесс в системе не существует, то выполняют устранение повисшей блокировки, осуществляя следующие действия: удаляют из существующего блокировочного файла предыдущие данные несуществующего процесса; заносят в существующий блокировочный файл данные текущего процесса. Снимают файловую блокировку записи с существующего блокировочного файла. Обеспечивают выполнение текущим процессом операций с разделяемым ресурсом. Удаляют существующий блокировочный файл.

Формула изобретения

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

Описание

[1]

Область техники, к которой относится изобретение

[2]

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

[3]

Уровень техники

[4]

Во многих современных вычислительных системах имеются ресурсы (файлы, базы данных, участки оперативной памяти и пр.), доступ к которым осуществляется для параллельно выполняемых процессов. Для обеспечения корректного доступа применяются различные способы синхронизации доступа. При обеспечении синхронизации исключительный доступ предоставляется только одному процессу, а сам ресурс блокируется для записи и/или чтения для других процессов. Блокировка может осуществляться разными методами, однако возможны ситуации, когда ресурс оказывается заблокирован одновременно несколькими процессами, и ни один из них не может ни снять блокировку, ни выполнить необходимые операции с разделяемым ресурсом.

[5]

Такое состояние обычно называют повисшей блокировкой (deadlock), определяют его наличие и затем устраняют с использованием разных механизмов.

[6]

Так, известен способ синхронизации доступа к разделяемым ресурсам между параллельно выполняемыми процессами с использованием механизма блокировочных файлов [1], заключающийся в том, что

[7]

- ассоциируют разделяемый ресурс с блокировочным файлом;

[8]

- создают в ходе попытки доступа процесса (приложения) к разделяемому ресурсу блокировочный файл;

[9]

- если такой блокировочный файл уже существует, эта операция будет завершена с ошибкой;

[10]

- если такой блокировочный файл не существует, то создается блокировочный файл;

[11]

- записывают в только что созданный и открытый блокировочный файл данные процесса, который его создал (например, идентификатор процесса, process ID (PID)) или др.);

[12]

- обеспечивают выполнение процессом операций с разделяемым ресурсом;

[13]

- снимают блокировку с разделяемого ресурса (файла) путем удаления блокировочного файла.

[14]

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

[15]

Известен также способ синхронизации доступа к разделяемым ресурсам вычислительной системы и обнаружения и устранения повисших блокировок с использованием блокировочных файлов [2], заключающийся в том, что

[16]

- ассоциируют разделяемый ресурс с блокировочным файлом;

[17]

- вызывают системный вызов атомарного эксклюзивного создания и открытия временного файла с уникальным именем и в той же файловой системе, в которой предполагается создание блокировочного файла, со стороны текущего процесса, пытающегося получить доступ к разделяемому ресурсу;

[18]

- помещают во временный файл информацию о текущем процессе, который пытается обратиться к разделяемому ресурсу;

[19]

- осуществляют системный вызов создания жесткой ссылки с именем блокировочного файла на временный файл;

[20]

- если системный вызов создания жесткой ссылки выполнен успешно, то:

[21]

- удаляют жесткую ссылку на временный файл;

[22]

- обеспечивают выполнение текущим процессом операций с разделяемым ресурсом;

[23]

- удаляют блокировочный файл;

[24]

- если системный вызов создания жесткой ссылки выполнен с ошибкой, и ошибка не связана с тем, что файл с именем блокировочного файла уже существует, то удаляют временный файл;

[25]

- если системный вызов создания жесткой ссылки выполнен с ошибкой, и ошибка связана с тем, что файл с именем блокировочного файла уже существует, то;

[26]

- удаляют временный файл;

[27]

- осуществляют поиск процесса, указанного в существующем блокировочном файле, выполняя следующие действия:

[28]

- устанавливают файловую блокировку записи на блокировочный файл;

[29]

- проверяют наличие в системе процесса, данные которого указаны в существующем блокировочном файле;

[30]

- если текущий процесс в системе существует, то снимают файловую блокировку записи на блокировочный файл;

[31]

- если текущий процесс в системе не существует, то выполняют устранение повисшей блокировки, осуществляя следующие действия:

[32]

- удаляют из существующего блокировочного файла предыдущие данные несуществующего процесса;

[33]

- заносят в блокировочный файл данные текущего процесса;

[34]

- снимают файловую блокировку записи с существующего блокировочного файла;

[35]

- обеспечивают выполнение текущим процессом операций с разделяемым ресурсом;

[36]

- удаляют блокировочный файл.

[37]

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

[38]

Описанный способ принят за прототип.

[39]

Однако этот способ также имеет недостатки.

[40]

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

[41]

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

[42]

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

[43]

Отсутствие же такой системы снижает надежность обнаружения и устранения повисшей блокировки. Однако наличие такой отдельной системы приведет к увеличению сложности реализации способа и увеличению потребления вычислительных ресурсов (оперативной памяти и процессора). Это может стать преградой для использования такого решения в вычислительных системах с ограниченными ресурсами (к примеру, встраиваемые системы).

[44]

Раскрытие изобретения

[45]

Техническим результатом является повышение надежности обнаружения и устранения повисших блокировок.

[46]

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

[47]

Для этого предлагается способ, заключающийся в том, что

[48]

- ассоциируют разделяемый ресурс с блокировочным файлом;

[49]

- вызывают системный вызов атомарного эксклюзивного создания и открытия временного файла с уникальным именем и в той же файловой системе, в которой предполагается создание блокировочного файла, со стороны текущего процесса, пытающегося получить доступ к разделяемому ресурсу;

[50]

- создают рекомендательную эксклюзивную блокировку на временный файл;

[51]

- осуществляют системный вызов создания жесткой ссылки с именем блокировочного файла на временный файл;

[52]

- если системный вызов создания жесткой ссылки выполнен успешно, то удаляют жесткую ссылку на временный файл;

[53]

- обеспечивают выполнение текущим процессом операций с разделяемым ресурсом;

[54]

- удаляют жесткую ссылку на блокировочный файл;

[55]

- снимают рекомендательную эксклюзивную блокировку с блокировочного файла;

[56]

- закрывают открытый блокировочный файл;

[57]

- если системный вызов создания жесткой ссылки выполнен с ошибкой, и ошибка не связана с тем, что файл с именем блокировочного файла уже существует, то

[58]

- удаляют жесткую ссылку на временный файл;

[59]

- снимают рекомендательную эксклюзивную блокировку с временного файла;

[60]

- закрывают открытый временный файл;

[61]

- если системный вызов создания жесткой ссылки выполнен с ошибкой, и ошибка связана с тем, что файл с именем блокировочного файла уже существует, то

[62]

- удаляют жесткую ссылку на временный файл;

[63]

- снимают рекомендательную эксклюзивную блокировку с временного файла;

[64]

- закрывают открытый временный файл; открывают блокировочный файл;

[65]

- устанавливают рекомендательную эксклюзивную блокировку на блокировочный файл;

[66]

- если рекомендательная эксклюзивная блокировка на блокировочный файл успешно установлена, то

[67]

- обеспечивают выполнение текущим процессом операций с разделяемым ресурсом;

[68]

- удаляют жесткую ссылку на блокировочный файл;

[69]

- снимают рекомендательную эксклюзивную блокировку с блокировочного файла;

[70]

- закрывают открытый блокировочный файл;

[71]

- если рекомендательную эксклюзивную блокировку на блокировочный файл установить не удалось, то закрывают открытый блокировочный файл.

[72]

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

[73]

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

[74]

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

[75]

Осуществление изобретения

[76]

Реализация предложенного способа может быть осуществлена в вычислительной системе, работающей под управлением POSIX-совместимой ОС, в частности ОС GNU/Linux, где механизм блокировочных файлов для синхронизации доступа к разделяемому ресурсу получил широкое распространение.

[77]

Необходимым условием реализации предложенного способа является наличие в составе ОС вычислительной системы следующих средств, описанных в стандарте ISO/IEC/IEEE 9945:2009 [3]:

[78]

- системных вызовов для работы с файлами (open, close, link, unlink);

[79]

- поддержка жестких ссылок в ОС и файловой системой, в которой предполагается создание блокировочного файла;

[80]

- операций атомарного эксклюзивного создания и открытия временного файла с уникальным именем (например, выполняемых с помощью системного вызова mkstemp);

[81]

- поддержка файловых блокировок и наличие системных вызовов для работы с ними (fcntl и F_SETLKW).

[82]

Все указанные средства присутствуют в ОС GNU/Linux, в частности, в доступном для любого пользователя дистрибутиве ОС Debian 6.

[83]

Жесткие ссылки поддерживаются большинством файловых систем, в частности файловой системой Ext3 (Extended File System версии 3), поддерживаемой в ОС Debian.

[84]

Для реализации способа в создаваемой или модернизируемой программе или программном модуле, предназначенном для работы с разделяемыми ресурсами, выполняют последовательно следующие действия.

[85]

Ассоциируют разделяемый ресурс (например, последовательный порт, файл базы данных) с блокировочным файлом. Это можно сделать, к примеру, сформировав константу, содержащую путь к блокировочному файлу.

[86]

В каждом процессе перед обращением к разделяемому ресурсу вызывают системный вызов mkstemp путем вызова одноименной системной функции, указав в качестве шаблона пути для создания временного файла путь в той же файловой системе, в которой предполагается создание блокировочного файла.

[87]

Устанавливают рекомендательную эксклюзивную блокировку записи на временный файл, для чего вызывают системный вызов fcntl, передавая в качестве первого параметра номер файлового дескриптора открытого блокировочного файла, в качестве второго значения - F_SETLKW, в качестве третьего значения - заполненную структуру flock, для установки блокировки временного файла.

[88]

Вызывают системный вызов link с помощью одноименной функции, передавая в качестве первого параметра путь к временному файлу, а в качестве второго параметра - путь к блокировочному файлу с которым ассоциирован разделяемый ресурс.

[89]

Если функция link возвращает 0, то:

[90]

- удаляют жесткую ссылку на временный файл, вызывая системный вызов unlink;

[91]

- обеспечивают выполнение текущим процессом операций с разделяемым ресурсом;

[92]

- удаляют жесткую ссылку на блокировочный файл, для чего вызывают системный вызов unlink, передавая в качестве параметра путь к блокировочному файлу;

[93]

- снимают рекомендательную эксклюзивную блокировку с блокировочного файла, для чего вызывают системный вызов fcntl, передавая в качестве первого параметра номер файлового дескриптора открытого блокировочного файла, в качестве второго значения - F_SETLKW, в качестве третьего значения - заполненную структуру flock, для снятия блокировки;

[94]

- закрывают открытый блокировочный файл, вызывая системный вызов close, передавая в качестве параметра номер файлового дескриптора открытого блокировочного файла;

[95]

Если функция link возвращает - 1, и в errno (error return value) содержится код ошибки, отличный от EEXISTS, то

[96]

- удаляют жесткую ссылку на временный файл, для чего вызывают системный вызов unlink, передавая в качестве параметра путь к временному файлу;

[97]

- снимают рекомендательную эксклюзивную блокировку с временного файла, для чего вызывают системный вызов fcntl, передавая в качестве первого параметра номер файлового дескриптора открытого временного файла, в качестве второго значения - F_SETLKW, в качестве третьего значения - заполненную структуру flock, для снятия блокировки;

[98]

- закрывают открытый временный файл, вызывая системный вызов close, передавая в качестве параметра номер файлового дескриптора открытого временного файла;

[99]

Если функция link возвращает - 1, и в errno содержится код ошибки EEXISTS, то

[100]

- удаляют жесткую ссылку на временный файл, для чего вызывают системный вызов unlink, передавая в качестве параметра путь к временному файлу;

[101]

- снимают рекомендательную эксклюзивную блокировку с временного файла, для чего вызывают системный вызов fcntl, передавая в качестве первого параметра номер файлового дескриптора открытого временного файла, в качестве второго значения - F_SETLKW, в качестве третьего значения - заполненную структуру flock, для снятия блокировки;

[102]

- закрывают открытый временный файл, вызывая системный вызов close, передавая в качестве параметра номер файлового дескриптора открытого временного файла;

[103]

- открывают блокировочный файл, для чего выполняют системный вызов open, передавая в качестве первого параметра путь к блокировочному файлу, с которым ассоциирован разделяемый ресурс, а в качестве второго параметра - режим чтения, и запоминают возвращаемый номер файлового дескриптора открытого блокировочного файла;

[104]

- устанавливают файловую блокировку записи, для чего вызывают системный вызов fcntl, передавая в качестве первого параметра номер файлового дескриптора открытого блокировочного файла, в качестве второго значения - F_SETLKW, в качестве третьего значения - заполненную структуру flock, для установки блокировки файла;

[105]

- если операция установки файловой блокировки прошла успешно, то считают, что была обнаружена и устранена повисшая блокировка и текущий процесс захватил разделяемый ресурс, после чего

[106]

- обеспечивают выполнение текущим процессом операций с разделяемым ресурсом;

[107]

- удаляют жесткую ссылку на блокировочный файл, для чего вызывают системный вызов unlink, передавая в качестве параметра путь к блокировочному файлу;

[108]

- снимают рекомендательную эксклюзивную блокировку с блокировочного файла, для чего вызывают системный вызов fcntl, передавая в качестве первого параметра номер файлового дескриптора открытого блокировочного файла, в качестве второго значения - F_SETLKW, в качестве третьего значения - заполненную структуру flock, для снятия блокировки;

[109]

- закрывают открытый блокировочный файл, вызывая системный вызов close, передавая в качестве параметра номер файлового дескриптора открытого блокировочного файла;

[110]

- если не удалось установить файловую блокировку, то закрывают открытый блокировочный файл, вызывая системный вызов close, передавая в качестве параметра номер файлового дескриптора открытого блокировочного файла;

[111]

Реализовать действия предложенного способа в составе программы или функции может специалист в области программирования (программист).

[112]

Источники информации

[113]

1. Джонсон М.К., Троан Э.В. Разработка приложений в среде Linux, 2-е изд., Москва, 2007, стр. 231-232.

[114]

2. Патент РФ №2526282, приоритет от 21.09.2012 г.

[115]

3. Стандарт ISO/IEC/IEEE 9945:2009 Information technology - Portable Operating System Interface (POSIX®) Base Specifications, Issue 7.

Как компенсировать расходы
на инновационную разработку
Похожие патенты