Jawaban:
Alasannya adalah Unix tidak mengunci file yang dapat dieksekusi saat dieksekusi atau bahkan jika itu seperti Linux, kunci ini berlaku untuk inode, bukan nama file. Itu berarti suatu proses menjaganya tetap terbuka mengakses data (lama) yang sama bahkan setelah file telah dihapus (sebenarnya tidak terhubung) dan diganti dengan yang baru dengan nama yang sama yang pada dasarnya adalah apa yang dilakukan pembaruan paket.
Itulah salah satu perbedaan utama antara Unix dan Windows. Yang terakhir tidak dapat memperbarui file yang sedang dikunci karena tidak ada lapisan antara nama file dan inode yang membuat kesulitan besar untuk memperbarui atau bahkan menginstal beberapa paket karena biasanya memerlukan reboot penuh.
File executable biasanya dibuka satu kali, dilampirkan ke file descriptor, dan tidak memiliki file deskriptor ke biner mereka yang dibuka kembali selama satu periode eksekusi. Sebagai contoh, jika Anda mengeksekusi bash
, exec()
umumnya hanya membuat deskriptor file untuk inode yang ditunjuk oleh /bin/bash
doa satu kali.
Ini sering berarti bahwa untuk biner sederhana yang tidak mencoba membaca ulang sendiri selama eksekusi (dengan menggunakan jalur yang digunakan), konten yang di-cache tetap valid sebagai inode yang menggantung. Ini berarti bahwa pada dasarnya ada replika dari versi eksekusi sebelumnya.
Dalam kasus yang lebih kompleks, ini dapat menyebabkan masalah. Sebagai contoh, file config dapat ditingkatkan dan kemudian dibaca kembali, atau program dapat melakukan re-exec sendiri melalui jalur dari mana ia dieksekusi. Mungkin juga ada masalah jika program saling berhubungan, dan satu dijalankan sebelum pemutakhiran, dan satu setelah (mungkin oleh program pertama). Ini juga berlaku untuk beberapa perpustakaan.
Namun, untuk kasus penggunaan yang sederhana, aman untuk ditingkatkan tanpa memulai kembali prosesnya.
bash
biner adalah sekitar 200 halaman 4K, tidak yakin mereka semua digunakan dalam sesi rata-rata.
ialloc()
ing ke struct kernel saat membaca, bukan pemetaan memori halaman itu sendiri. Apakah saya tidak benar dalam berpikir bahwa pada filesystem ext * modern, inode pada akhirnya konsisten di dalam kernel (dan di dalam subsistem VM)?