Linux кто заблокировал файл
В этом руководстве мы поймем проблему промежуточного обновления в системе с несколькими процессами. Затем мы собираемся представить два типа блокировок в Linux.
Попутно мы изучим некоторые команды, связанные с блокировкой файлов, на примерах.
2. Проблема промежуточного обновления
Допустим, у нас есть файл balance.dat , в котором хранится баланс учетной записи, и он имеет начальное значение из « 100 «. В нашей параллельной системе есть два процесса для обновления значения баланса:
- Процесс A: считывает текущее значение, вычитает 20 и сохраняет результат обратно в файл.
- Процесс B: считывает текущее значение, добавляет 80 и записывает результат обратно в файл.
Очевидно, что после выполнения двух процессов мы ожидаем файл имеет значение: 100-20+80=160.
Однако в этой ситуации может возникнуть промежуточная проблема обновления:
- Процесс A считывает текущее значение файла ( 100 ) и готовится к дальнейшим вычислениям.
- Процесс B теперь читает тот же файл и получает текущий баланс ( 100 ).
- Процесс A вычисляет 100-20 и сохраняет результат 80 обратно к файлу.
- Процесс B не знает, что баланс был обновлен с момента последнего чтения. Таким образом, он по-прежнему будет использовать устаревшее значение 100 для вычисления 100 + 80 и записи результата 180 в файл. .
В результате мы имеем 180 в файле balance.dat вместо ожидаемого значения 160.
3. Блокировка файлов в Linux
Вскоре мы представим оба типа блокировки, но в этой статье основное внимание будет уделено рекомендательной блокировке. р>
3.1. Консультативная блокировка
Консультативная блокировка не является принудительной схемой блокировки. Это будет работать, только если участвующие процессы взаимодействуют, явно устанавливая блокировки. В противном случае рекомендательные блокировки будут игнорироваться, если процесс вообще не знает о блокировках..
Пример может помочь нам легче понять схему совместной блокировки. Давайте рассмотрим наш предыдущий пример баланса.
- Во-первых, мы предполагаем, что файл balance.dat все еще содержит начальное значение « 100 “.
- Процесс A устанавливает исключительную блокировку файла balance.dat , затем открывает и читает файл, чтобы получить текущую value: 100.
Мы должны понимать, что консультативная блокировка не была установлена операционной системой или файловой системой. Следовательно, даже если процесс A блокирует файл, процесс B по-прежнему может читать, записывать или даже удалять файл с помощью системных вызовов.
Если процесс B выполняет файловые операции, не пытаясь получить блокировку, мы говорим, что процесс B не взаимодействует с процессом A.
Но теперь давайте взглянем на как блокировка будет работать для взаимодействующих процессов :
- Процесс B пытается получить блокировку на balance.dat перед чтением файла (взаимодействуя с процессом A).
- Поскольку процесс A заблокировал файл, процесс B должен ждать, пока процесс A снимет блокировку.
- Процесс A вычисляет 100-20 и записывает 80 обратно в файл.
- Процесс A снимает блокировку.
- Теперь процесс B получает блокировку и читает файл, получая обновленное значение: 80.
- Процесс B запускает свою логику и записывает результат 160 ( 80 + 80 ) обратно в файл.
- Процесс 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 для реализации рекомендательной блокировки.
Наконец, мы увидели две демонстрации. Один помог нам понять взаимосвязь между консультативной блокировкой и взаимодействием процессов, а другой показал нам, как работает консультативная блокировка.
Читайте также: