Linux кто заблокировал файл

Обновлено: 04.07.2024

В этом руководстве мы поймем проблему промежуточного обновления в системе с несколькими процессами. Затем мы собираемся представить два типа блокировок в Linux.

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

2. Проблема промежуточного обновления

Допустим, у нас есть файл balance.dat , в котором хранится баланс учетной записи, и он имеет начальное значение из « 100 «. В нашей параллельной системе есть два процесса для обновления значения баланса:

  1. Процесс A: считывает текущее значение, вычитает 20 и сохраняет результат обратно в файл.
  2. Процесс B: считывает текущее значение, добавляет 80 и записывает результат обратно в файл.

Очевидно, что после выполнения двух процессов мы ожидаем файл имеет значение: 100-20+80=160.

Однако в этой ситуации может возникнуть промежуточная проблема обновления:

  1. Процесс A считывает текущее значение файла ( 100 ) и готовится к дальнейшим вычислениям.
  2. Процесс B теперь читает тот же файл и получает текущий баланс ( 100 ).
  3. Процесс A вычисляет 100-20 и сохраняет результат 80 обратно к файлу.
  4. Процесс B не знает, что баланс был обновлен с момента последнего чтения. Таким образом, он по-прежнему будет использовать устаревшее значение 100 для вычисления 100 + 80 и записи результата 180 в файл. .

В результате мы имеем 180 в файле balance.dat вместо ожидаемого значения 160.

3. Блокировка файлов в Linux

Вскоре мы представим оба типа блокировки, но в этой статье основное внимание будет уделено рекомендательной блокировке. р>

3.1. Консультативная блокировка

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

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

  1. Во-первых, мы предполагаем, что файл balance.dat все еще содержит начальное значение « 100 “.
  2. Процесс A устанавливает исключительную блокировку файла balance.dat , затем открывает и читает файл, чтобы получить текущую value: 100.

Мы должны понимать, что консультативная блокировка не была установлена ​​операционной системой или файловой системой. Следовательно, даже если процесс A блокирует файл, процесс B по-прежнему может читать, записывать или даже удалять файл с помощью системных вызовов.

Если процесс B выполняет файловые операции, не пытаясь получить блокировку, мы говорим, что процесс B не взаимодействует с процессом A.

Но теперь давайте взглянем на как блокировка будет работать для взаимодействующих процессов :

  1. Процесс B пытается получить блокировку на balance.dat перед чтением файла (взаимодействуя с процессом A).
  2. Поскольку процесс A заблокировал файл, процесс B должен ждать, пока процесс A снимет блокировку.
  3. Процесс A вычисляет 100-20 и записывает 80 обратно в файл.
  4. Процесс A снимает блокировку.
  5. Теперь процесс B получает блокировку и читает файл, получая обновленное значение: 80.
  6. Процесс B запускает свою логику и записывает результат 160 ( 80 + 80 ) обратно в файл.
  7. Процесс B снимает блокировку, чтобы другие взаимодействующие процессы могли читать и писать в файл.

Мы увидим, как этот пример реализуется с помощью flock в следующем разделе.

3.2. Обязательная блокировка

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

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

Чтобы включить принудительную блокировку файлов в Linux, необходимо выполнить два требования:

4. Проверка всех блокировок в системе

В этом разделе давайте рассмотрим два способа проверки текущих блокировок в работающей системе.

4.1. Команда lslocks

Команда lslocks является членом util-linux и доступен во всех дистрибутивах Linux. Он может перечислить все текущие блокировки файлов в нашей системе.

Давайте посмотрим на пример вывода:

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

4.2. /proc/locks

/proc/locks не является командой. Вместо этого это файл в виртуальной файловой системе procfs . Файл содержит все текущие блокировки файлов. Команда lslocks также использует этот файл для создания списка.

Чтобы получить информацию о /proc/locks , мы выполняем « cat/proc/locks »:

Давайте выберем первую строку, чтобы понять, как блокируется информация организована в файловой системе /proc/locks :

5. Введение в команду flock

Команда flock также предоставляется командой util-linux package. Эта утилита позволяет нам управлять блокировками рекомендательных файлов в сценариях оболочки или в командной строке..

Основной синтаксис использования:

Далее давайте продемонстрируем наш пример обновления баланса с помощью команды flock .

В дополнение к текстовому файлу balance.dat , содержащему текущее значение баланса, нам все еще нужны два процесса, A и B, для обновления баланса в файле.

Сначала мы создаем простой сценарий оболочки update_balance.sh для обработки логики обновления баланса для обоих процессов:

Мы создаем простой сценарий оболочки a.sh для моделирования процесса A:

Теперь приступим процесс A для проверки:

В выводе мы видим, что команда flock сначала установила блокировку файл balance.dat , затем скрипт update_balance.sh прочитал и обновил файл.

Во время его запуска мы можно проверить информацию о блокировке с помощью команды lslocks :

Вывод показывает, что команда flock удерживание блокировки WRITE для всего файла /tmp/test/balance.dat .

5.1. Демонстрация flock с некооперативными процессами

Мы узнали, что рекомендательные блокировки работают, только если участвующие процессы взаимодействуют . Давайте сбросим баланс до 100 и проверим, что произойдет, если мы установим консультативную блокировку файла для процесса A, но запустим процесс B без взаимодействия.

Теперь давайте создадим простую оболочку скрипт b_non-cooperative.sh :

Мы видим, что процесс B вызывает update_balance.sh , не пытаясь получить блокировку файла данных баланса.

Давайте продемонстрируем этот сценарий на GIF-анимация:

Мы видим, что консультативная блокировка, полученная процессом A, игнорируется, если процесс B запускается без взаимодействия с процессом A.

Следовательно, у нас 180 вместо 160 в the balance.dat .

5.2. Демонстрация flock с кооперативными процессами

Наконец, давайте создадим еще один кооперативный процесс B, b.sh , и посмотрим, как работает консультативная блокировка:

Мы снова показываем демонстрацию в формате GIF:

В демонстрации мы сделали два процесса для взаимодействия.

Мы заметили, что когда процесс B пытался получить блокировку для файла balance.dat , он ждал, пока процесс A снимет блокировку . Таким образом, консультативная блокировка g, и мы получили ожидаемый результат 160 в файле данных баланса.

6. Заключение

В этой статье мы начали с понимания проблемы промежуточного обновления. Затем мы обсудили различные типы схем блокировки файлов в системах Linux.

Мы также изучили команду lslocks для проверки блокировок в системе и команду flock для реализации рекомендательной блокировки.

Наконец, мы увидели две демонстрации. Один помог нам понять взаимосвязь между консультативной блокировкой и взаимодействием процессов, а другой показал нам, как работает консультативная блокировка.

Читайте также: