Câu trả lời:
Lý do là Unix không khóa tệp thực thi trong khi nó được thực thi hoặc ngay cả khi nó giống như Linux, khóa này áp dụng cho inode, không phải tên tệp. Điều đó có nghĩa là một quá trình giữ cho nó mở đang truy cập cùng một dữ liệu (cũ) ngay cả sau khi tệp đã bị xóa (thực sự không được liên kết) và được thay thế bằng một cái mới có cùng tên mà về cơ bản là cập nhật gói.
Đó là một trong những khác biệt chính giữa Unix và Windows. Cái sau không thể cập nhật một tệp đang bị khóa vì nó thiếu một lớp giữa tên tệp và inodes gây rắc rối lớn để cập nhật hoặc thậm chí cài đặt một số gói vì nó thường yêu cầu khởi động lại đầy đủ.
Các tệp thực thi thường được mở một lần, được đính kèm với một bộ mô tả tệp và không có một bộ mô tả tệp để nhị phân của chúng được mở lại trong một khoảng thời gian thực hiện. Ví dụ: nếu bạn thực thi bash
, exec()
thường chỉ tạo một bộ mô tả tệp cho nút được trỏ đến /bin/bash
một lần - khi gọi.
Điều này thường có nghĩa là đối với các nhị phân đơn giản không cố đọc lại chính chúng trong khi thực thi (bằng cách sử dụng đường dẫn mà chúng được gọi), nội dung được lưu trong bộ nhớ cache vẫn có hiệu lực như một nút inode. Điều này có nghĩa là về cơ bản có một bản sao của phiên bản thực thi trước đó.
Trong trường hợp phức tạp hơn, điều này có thể gây ra vấn đề. Ví dụ, một tệp cấu hình có thể được nâng cấp và sau đó đọc lại hoặc chương trình có thể tự thực hiện lại thông qua đường dẫn mà nó được thực thi. Cũng có thể có vấn đề nếu các chương trình được kết nối với nhau và một chương trình được thực thi trước khi nâng cấp và một sau đó (có thể bởi chương trình đầu tiên). Điều này cũng đúng với một số thư viện.
Tuy nhiên, đối với các trường hợp sử dụng đơn giản, việc nâng cấp mà không cần khởi động lại quá trình là an toàn.
bash
nhị phân là khoảng 200 trang 4K, không chắc chắn tất cả chúng đều được sử dụng trong một phiên trung bình.
ialloc()
ing với cấu trúc kernel khi đọc, không phải là ánh xạ bộ nhớ của chính các trang. Tôi có đúng không khi nghĩ rằng trên các hệ thống tập tin ext * hiện đại, inode cuối cùng là in-kernel nhất quán (và bên trong hệ thống con VM)?