Відповіді:
Причина полягає в тому, що Unix не блокує виконуваний файл під час його виконання або навіть якщо він працює як Linux, це блокування застосовується до inode, а не до імені файлу. Це означає, що процес, який підтримує його відкритим, отримує доступ до тих же (старих) даних навіть після того, як файл був видалений (фактично відключений) і замінений на новий з тим же ім'ям, що по суті є тим, що робить оновлення пакета.
Це одна з головних відмінностей Unix від Windows. Останній не може оновити файл, що заблокується, оскільки в ньому відсутній шар між іменами файлів та inodes, що створює великі клопоти, щоб оновити або навіть встановити деякі пакети, оскільки зазвичай потрібно повне перезавантаження.
Виконавчі файли, як правило, відкриваються один раз, приєднуються до дескриптора файлу, і не мають дескриптора файлу до їх бінарного повторного відкриття протягом одного періоду виконання. Наприклад, якщо ви виконуєте bash
, exec()
як правило, створюється лише дескриптор файлу для вводу, на який вказує /bin/bash
один раз - при виклику.
Це часто означає, що для простих бінарних файлів, які не намагаються перечитати себе під час виконання (використовуючи шлях, по якому вони викликалися), вміст, який зберігається в кеші, залишається дійсним як звисаючий inode. Це означає, що по суті є репліка попередньої версії виконуваного файлу.
У більш складних випадках це може спричинити проблеми. Наприклад, конфігураційний файл може бути оновлений і згодом перечитаний, або програма може повторно виконати себе через шлях, з якого він був виконаний. Також можуть виникнути проблеми, якщо програми пов'язані між собою, і одна виконується перед оновленням, а одна після (можливо, першою програмою). Це справедливо і для деяких бібліотек.
Для простих випадків використання оновлення безпечно, не перезавантажуючи процес.
bash
двійковий вміст становить близько 200 4К сторінок, не впевнений, що вони використовуються в середньому сеансі.
ialloc()
щоб структуру ядра було прочитано, а не відображення пам'яті самих сторінок. Хіба я не правий, думаючи, що в сучасних файлових системах ext * inode зрештою є послідовним в ядрі (і всередині підсистеми VM)?