Блокировка Выполняющихся Файлов: Windows делает, Linux не делает. Почему?

diff должен дать желаемый результат:

>>> df.diff()
count_a  count_b
2015-01-01      NaN      NaN
2015-01-02    38465      NaN
2015-01-03    36714      NaN
2015-01-04    35137      NaN
2015-01-05    35864      NaN
....
2015-02-07   142390    25552
2015-02-08   126768    22835
2015-02-09   122324    21485
79
задан Giovanni Galbo 8 January 2009 в 12:48
поделиться

6 ответов

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

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

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

104
ответ дан Oren Shemesh 6 November 2019 в 02:49
поделиться

Насколько я знаю, linux делает исполняемые файлы блокировки, когда они работают - однако, он блокирует inode. Это означает, что можно удалить "файл", но inode находится все еще в файловой системе, нетронутой и все, что Вы действительно удалили, ссылка.

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

28
ответ дан Neil Williams 6 November 2019 в 02:49
поделиться

Linux действительно блокирует файлы. При попытке перезаписать файл, это выполняется, Вы получите "ETXTBUSY" (Занятый текстовый файл). Можно однако удалить файл, и ядро удалит файл, когда последняя ссылка на него будет удалена. (Если машина не была чисто завершением работы, эти файлы являются причиной "Удаленного inode, имел нуль d-time" сообщения, когда файловая система проверяется, они не были полностью удалены, потому что рабочий процесс имел ссылку на них, и теперь они.)

Это имеет некоторые главные преимущества, можно обновить процесс, который это выполняет, путем удаления исполняемого файла, замены его, затем перезапуска процесса. Даже init может быть обновлен как это, заменить исполняемый файл, и отправлять ему сигнал, и он будет передолжностное лицо () сам, не требуя перезагрузки. (Это обычно делается автоматически Вашей системой управления пакета как часть, он - обновление)

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

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

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

Программы как lsof и термофиксатор (или просто вводящий по абсолютному адресу вокруг в/proc//fd) могут показать Вам, какие процессы имеют файлы, открытые, которые больше не имеют имя.

23
ответ дан 6 November 2019 в 02:49
поделиться

Я думаю, что Вы являетесь слишком абсолютными о Windows. Обычно, это не выделяет область подкачки для части кода исполняемого файла. Вместо этого это сохраняет блокировку на excutable & DLLs. Если отброшенные кодовые страницы необходимы снова, они просто перезагружаются. Но с/SWAPRUN, эти страницы сохранены в подкачке. Это используется для исполняемых файлов на CD-приводах или сетевых дисках. Следовательно, окна не должен блокировать эти файлы.

Для.NET, посмотрите Теневая копия .

6
ответ дан MSalters 6 November 2019 в 02:49
поделиться

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

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

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

5
ответ дан Eric Tuttleman 6 November 2019 в 02:49
поделиться

Варианты NT имеют

команда openfiles

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

openfiles / локальный/?

говорит Вам, как сделать это, и также что потеря производительности понесена путем выполнения так.

0
ответ дан spender 6 November 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: