Блокировка исполняемых файлов: Windows делает, Linux нет. Зачем? - PullRequest
79 голосов
/ 13 октября 2008

Я заметил, что при запуске файла в Windows (.exe или .dll) он блокируется и не может быть удален, перемещен или изменен.

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

Почему Windows блокируется, а Linux - нет? Есть ли преимущество у блокировки?

Ответы [ 8 ]

102 голосов
/ 13 октября 2008

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

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

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

28 голосов
/ 13 октября 2008

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

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

23 голосов
/ 30 декабря 2008

Linux блокирует файлы. Если вы попытаетесь перезаписать исполняемый файл, вы получите «ETXTBUSY» (текстовый файл занят). Однако вы можете удалить файл, и ядро ​​удалит файл при удалении последней ссылки на него. (Если машина не была полностью отключена, эти файлы являются причиной сообщений «У удаленного inode было нулевое время d» при проверке файловой системы, они не были полностью удалены, потому что запущенный процесс имел ссылку на них, и теперь они есть.)

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

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

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

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

Такие программы, как lsof и fuser (или просто просмотр / proc / fd) могут показать, какие процессы открыли файлы, которые больше не имеют имени.

6 голосов
/ 13 октября 2008

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

Для .NET посмотрите Shadow Copy .

5 голосов
/ 13 октября 2008

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

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

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

1 голос
/ 16 мая 2015

Если исполняемый код в файле должен быть заблокирован или нет, это проектное решение, и MS просто решила заблокировать, потому что на практике у него есть явные преимущества: таким образом, вам не нужно знать, какой код в какой версии используется какое приложение. Это основная проблема с поведением Linux по умолчанию, которое просто игнорируется большинством людей. При замене общесистемных библиотек вы не можете легко узнать, какие приложения используют код таких библиотек. В большинстве случаев лучшее, что вы можете получить, это то, что менеджер пакетов знает некоторых пользователей этих библиотек и перезапускает их. Но это работает только для общего и хорошо знаю такие вещи, как, может быть, Postgres и его libs или что-то подобное. Более интересные сценарии, если вы разрабатываете свое собственное приложение для некоторых сторонних библиотек, и они заменяются, потому что в большинстве случаев менеджер пакетов просто не знает ваше приложение. И это не только проблема нативного кода C или чего-то подобного, это может случиться практически со всем: просто используйте httpd с mod_perl и некоторыми библиотеками Perl, установленными с помощью менеджера пакетов, и позвольте менеджеру пакетов обновить эти Perl-библиотеки по любой причине. Он не перезапустит ваш httpd просто потому, что не знает зависимостей. Существует множество примеров, подобных этому, просто потому, что любой файл может потенциально содержать код, используемый в памяти любой средой выполнения, например, Java, Python и все такое.

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

Так что же сделал MS? Они просто создали API, который дает вызывающему приложению возможность решить, должны ли файлы быть заблокированы или нет, но они решили, что значением этого API по умолчанию является предоставление эксклюзивной блокировки первому вызывающему приложению. Посмотрите на API вокруг CreateFile и его аргумента dwShareMode. По этой причине вы не сможете удалить файлы, используемые каким-либо приложением, оно просто не заботится о вашем сценарии использования, использует значения по умолчанию и поэтому получает эксклюзивную блокировку Windows для файла.

Пожалуйста, не верьте, что люди, рассказывающие вам что-то о Windows, не используют ссылки на РУЧКИ или не поддерживают жесткие ссылки или что-то подобное, что совершенно неправильно. Почти каждый API, использующий HANDLE, документирует свое поведение в отношении подсчета ссылок, и вы можете легко прочитать практически в любой статье о NTFS, что он на самом деле поддерживает Hardlinks и всегда делал это. Начиная с Windows Vista, она также поддерживает Symlinks, а поддержка Hardlinks была улучшена благодаря предоставлению API для чтения всех из них для данного файла и т. Д.

Кроме того, вы можете просто захотеть взглянуть на структуры, используемые для описания файла, например. Ext4 по сравнению с NTFS , которые имеют много общего. Оба работают с концепцией экстентов, которая отделяет данные от таких атрибутов, как имя файла, а inode - это просто еще одно имя для более старой, но схожей концепции. Даже Википедия перечисляет обе файловые системы в своей статье .

Действительно много FUD вокруг блокировки файлов в Windows по сравнению с другими ОС в сети, как и в случае дефрагментации. Некоторые из этих FUD можно исключить, просто прочитав немного в Википедии .

0 голосов
/ 21 октября 2014

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

0 голосов
/ 13 октября 2008

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

открытые файлы

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

openfiles / local /?

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

...