Если исполняемый код в файле должен быть заблокирован или нет, - это дизайнерское решение, и MS просто решила заблокировать, потому что это имеет явные преимущества на практике: таким образом вам не нужно знать, какой код, в какой версии используется каким приложением. Это серьезная проблема с поведением Linux по умолчанию, которое просто игнорируется большинством людей. Если заменяются общесистемные библиотеки, вы не сможете легко узнать, какие приложения используют код таких библиотек, в большинстве случаев лучшее, что вы можете получить, - это то, что менеджер пакетов знает некоторых пользователей этих библиотек и перезапускает их. Но это работает только для общих и хорошо известных вещей, например, Postgres и его библиотек или чего-то подобного. Более интересны сценарии, если вы разрабатываете собственное приложение с использованием сторонних библиотек, и они заменяются, потому что в большинстве случаев менеджер пакетов просто не знает ваше приложение. И это ' Это проблема не только нативного кода C или чего-то подобного, это может случиться практически со всем: просто используйте httpd с mod_perl и некоторыми библиотеками Perl, установленными с помощью диспетчера пакетов, и позвольте диспетчеру пакетов обновлять эти библиотеки Perl по любой причине. Он не перезапустит ваш httpd просто потому, что не знает зависимостей. Примеров, подобных этому, множество, просто потому, что любой файл потенциально может содержать код, используемый в памяти любой средой выполнения, подумайте о Java, Python и всех подобных вещах.
Так что есть веские основания полагать, что блокировка файлов по умолчанию может быть хорошим выбором. Однако вам не нужно соглашаться с этими причинами.
Так что же сделал MS? Они просто создали API, который дает вызывающему приложению возможность решить, следует ли блокировать файлы или нет, но они решили, что значение этого API по умолчанию - обеспечить монопольную блокировку для первого вызывающего приложения. Взгляните на API CreateFile и егоdwShareMode
аргумент. Это причина, по которой вы не сможете удалять файлы, используемые каким-либо приложением, оно просто не заботится о вашем варианте использования, использует значения по умолчанию и, следовательно, получает эксклюзивную блокировку Windows для файла.
Пожалуйста, не верьте людям, которые говорят вам, что Windows не использует подсчет ссылок на РУЧКАХ или не поддерживает жесткие ссылки или что-то подобное, это совершенно неправильно. Почти каждый API, использующий HANDLEs, документирует свое поведение в отношении подсчета ссылок, и вы можете легко прочитать почти в любой статье о NTFS, что он на самом деле поддерживает жесткие ссылки и всегда поддерживал. Начиная с Windows Vista, он также поддерживает символические ссылки, а поддержка жестких ссылок была улучшена за счет предоставления API-интерфейсов для чтения всех из них для данного файла и т. Д.
Кроме того, вы можете просто взглянуть на структуры, используемые для описания файла, например, в Ext4 по сравнению со структурами NTFS , которые имеют много общего. Оба работают с концепцией экстентов, которая отделяет данные от атрибутов, таких как имя файла, а inodes - это в значительной степени просто другое имя для более старой, но похожей концепции этого. Даже Википедия перечисляет обе файловые системы в своей статье. .
В Windows действительно много проблем с блокировкой файлов по сравнению с другими операционными системами в сети, как и с дефрагментацией. Некоторые из этих FUD можно исключить, просто прочитав немного в Википедии .