Ответы:
Причина в том, что Unix не блокирует исполняемый файл во время его выполнения или даже если он работает как Linux, эта блокировка применяется к inode, а не к имени файла. Это означает, что процесс, сохраняющий его открытым, получает доступ к одним и тем же (старым) данным даже после того, как файл был удален (фактически не связан) и заменен новым с тем же именем, что по сути и делает обновление пакета.
Это одно из главных отличий Unix от Windows. Последний не может обновить заблокированный файл, так как ему не хватает слоя между именами файлов и inode, что создает большие трудности для обновления или даже установки некоторых пакетов, поскольку обычно требуется полная перезагрузка.
Исполняемые файлы обычно открываются один раз, прикрепляются к файловому дескриптору и не имеют файлового дескриптора для их двоичного файла, открытого заново в течение одного периода выполнения. Например, если вы выполняете bash
, exec()
обычно создает только файловый дескриптор для inode, на который указывает /bin/bash
однократный вызов.
Это часто означает, что для простых двоичных файлов, которые не пытаются перечитать себя во время выполнения (используя путь, по которому они были вызваны), содержимое, которое кэшируется, остается действительным как висячий инод. Это означает, что по существу существует копия предыдущей версии исполняемого файла.
В более сложных случаях это может вызвать проблемы. Например, файл конфигурации может быть обновлен и впоследствии перечитан, или программа может повторно выполнить себя через путь, из которого он был выполнен. Также могут быть проблемы, если программы связаны между собой, и одна из них выполняется до обновления, а другая - после (возможно, первой программой). Это также верно для некоторых библиотек.
Однако для простых случаев использования обновление безопасно, без перезапуска процесса.
bash
двоичный файл составляет около 200 страниц по 4K, не уверен, что они все используются в среднем сеансе.
ialloc()
структуре ядра для чтения, а не о отображении памяти самих страниц. Разве я не прав, думая, что в современных файловых системах ext * inode в конечном итоге будет согласован в ядре (и внутри подсистемы VM)?