Pertanyaan Mengunci File Pelaksana: Windows tidak, Linux tidak. Mengapa?


Saya perhatikan ketika file dieksekusi pada Windows (.exe atau .dll), itu terkunci dan tidak dapat dihapus, dipindahkan atau diubah.

Linux, di sisi lain, tidak mengunci file eksekusi dan Anda bisa menghapus, memindahkan, atau memodifikasinya.

Mengapa Windows mengunci ketika Linux tidak? Apakah ada keuntungan untuk mengunci?


75
2017-10-13 07:05


asal


Jawaban:


Linux memiliki mekanisme referensi-hitungan, sehingga Anda dapat menghapus file ketika sedang mengeksekusi, dan itu akan terus ada selama beberapa proses (yang sebelumnya membukanya) memiliki pegangan terbuka untuk itu. Entri direktori untuk file dihapus ketika Anda menghapusnya, sehingga tidak dapat dibuka lagi, tetapi proses sudah menggunakan file ini masih bisa menggunakannya. Setelah semua proses menggunakan file ini berakhir, file akan dihapus secara otomatis.

Windows tidak memiliki kemampuan ini, sehingga dipaksa untuk mengunci file sampai semua proses yang dieksekusi dari itu selesai.

Saya percaya bahwa perilaku Linux lebih baik. Mungkin ada beberapa alasan arsitektur yang mendalam, tetapi alasan utama (dan sederhana) yang saya anggap paling menarik adalah bahwa di Windows, Anda terkadang tidak dapat menghapus file, Anda tidak tahu mengapa, dan semua yang Anda tahu adalah bahwa beberapa proses menyimpannya di menggunakan. Di Linux itu tidak pernah terjadi.


96
2017-10-13 07:18



Sejauh yang saya tahu, linux tidak mengunci kunci yang dapat dieksekusi ketika sedang berjalan - namun, ia mengunci inode. Ini berarti Anda dapat menghapus "file" tetapi inode masih berada di sistem berkas, tidak tersentuh dan semua yang Anda hapus adalah tautan.

Program Unix menggunakan cara berpikir ini tentang sistem file sepanjang waktu, membuat file sementara, membukanya, menghapus nama. File Anda masih ada tetapi nama tersebut dibebaskan untuk digunakan orang lain dan tidak ada orang lain yang dapat melihatnya.


26
2017-10-13 07:19



Linux mengunci file. Jika Anda mencoba menimpa file yang mengeksekusi, Anda akan mendapatkan "ETXTBUSY" (File teks sibuk). Namun Anda dapat menghapus file, dan kernel akan menghapus file ketika referensi terakhir untuk itu dihapus. (Jika mesin tidak shutdown bersih, file-file ini adalah penyebab dari pesan "Penghapusan inode memiliki nol d-time" ketika filesystem dicentang, mereka tidak sepenuhnya dihapus, karena proses yang berjalan memiliki referensi kepada mereka, dan sekarang mereka.)

Ini memiliki beberapa keuntungan besar, Anda dapat meningkatkan proses yang sedang berjalan, dengan menghapus file yang dapat dieksekusi, menggantinya, kemudian memulai ulang prosesnya. Bahkan init dapat ditingkatkan seperti ini, ganti executable, dan kirimkan sinyal, dan itu akan re-exec () sendiri, tanpa membutuhkan reboot. (Ini biasanya dilakukan secara otomatis oleh sistem manajemen paket Anda sebagai bagian dari peningkatannya)

Di bawah jendela, mengganti file yang sedang digunakan tampaknya menjadi kerumitan besar, umumnya membutuhkan reboot untuk memastikan tidak ada proses yang sedang berjalan.

Mungkin ada beberapa masalah, seperti jika Anda memiliki file log yang sangat besar, dan Anda menghapusnya, tetapi lupa untuk memberi tahu proses yang sedang masuk ke file itu untuk membuka kembali file, itu akan menahan referensi, dan Anda akan bertanya-tanya mengapa disk Anda tidak tiba-tiba mendapatkan lebih banyak ruang kosong.

Anda juga dapat menggunakan trik ini di bawah linux untuk file sementara. buka file, hapus, lalu lanjutkan untuk menggunakan file. Ketika proses Anda keluar (untuk alasan apa pun - bahkan kegagalan daya), file akan dihapus.

Program seperti lsof dan fuser (atau hanya mengaduk-aduk di / proc // fd) dapat menunjukkan kepada Anda proses apa yang memiliki file terbuka yang tidak lagi memiliki nama.


22
2017-12-30 10:51



Saya pikir linux / unix tidak menggunakan mekanisme penguncian yang sama karena mereka dibangun dari bawah ke atas sebagai sistem multi-pengguna - yang mengharapkan kemungkinan beberapa pengguna menggunakan file yang sama, bahkan mungkin untuk tujuan yang berbeda.

Apakah ada keuntungan untuk mengunci? Yah, itu bisa mengurangi jumlah penunjuk yang harus dikelola oleh OS, tetapi sekarang jumlah tabungan hari ini cukup dapat diabaikan. Keuntungan terbesar yang dapat saya pikirkan untuk mengunci adalah ini: Anda menyimpan beberapa ambiguitas yang dapat dilihat pengguna. Jika pengguna menjalankan file biner, dan pengguna b menghapusnya, maka file yang sebenarnya harus bertahan sampai proses pengguna A selesai. Namun, jika Pengguna B atau pengguna lain melihat pada sistem file untuk itu, mereka tidak akan dapat menemukannya - tetapi itu akan terus mengambil ruang. Tidak benar-benar menjadi perhatian besar bagi saya.

Saya pikir sebagian besar itu lebih dari sebuah pertanyaan tentang kompatibilitas mundur dengan sistem file jendela.


5
2017-10-13 07:14



Saya pikir Anda terlalu absolut tentang Windows. Biasanya, itu tidak mengalokasikan ruang swap untuk bagian kode yang dapat dieksekusi. Sebaliknya, itu membuat kunci pada excutable & DLL. Jika halaman kode yang dibuang diperlukan lagi, mereka cukup dimuat ulang. Tetapi dengan / SWAPRUN, halaman ini disimpan dalam swap. Ini digunakan untuk executable pada CD atau drive jaringan. Oleh karena itu, windows tidak perlu mengunci file-file ini.

Untuk .NET, lihat Salinan Bayangan.


5
2017-10-13 09:46



Jika kode yang dieksekusi dalam file harus dikunci atau tidak merupakan keputusan desain dan MS memutuskan untuk mengunci, karena memiliki keuntungan yang jelas dalam praktik: Dengan cara itu Anda tidak perlu tahu kode mana di versi mana yang digunakan oleh aplikasi mana. Ini adalah masalah utama dengan perilaku default Linux, yang diabaikan oleh kebanyakan orang. Jika sistem libs lebar diganti, Anda tidak dapat dengan mudah mengetahui aplikasi mana yang menggunakan kode lib tersebut, sebagian besar waktu yang terbaik yang bisa Anda dapatkan adalah bahwa pengelola paket mengetahui beberapa pengguna dari libs tersebut dan memulainya kembali. Tapi itu hanya berfungsi untuk hal-hal umum dan baik seperti Postgres dan libs-nya atau semacamnya. Skenario yang lebih menarik adalah jika Anda mengembangkan aplikasi Anda sendiri terhadap beberapa lib pihak ketiga dan yang diganti, karena sebagian besar waktu manajer paket tidak tahu aplikasi Anda. Dan itu bukan hanya masalah kode C asli atau semacamnya, itu bisa terjadi dengan hampir semuanya: Cukup gunakan httpd dengan mod_perl dan beberapa lib Perl diinstal menggunakan manajer paket dan biarkan pengelola paket memperbarui lib Perl tersebut karena alasan apa pun. Ini tidak akan memulai ulang httpd Anda, hanya karena tidak mengetahui dependensi. Ada banyak contoh seperti ini, hanya karena setiap file berpotensi mengandung kode yang digunakan dalam memori oleh runtime apa saja, pikirkan Java, Python dan semua hal semacam itu.

Jadi ada alasan bagus untuk memiliki pendapat bahwa mengunci file secara default mungkin merupakan pilihan yang baik. Anda tidak perlu setuju dengan alasan itu.

Jadi apa yang dilakukan MS? Mereka hanya membuat API yang memberikan aplikasi panggilan kesempatan untuk memutuskan apakah file harus dikunci atau tidak, tetapi mereka memutuskan bahwa nilai default dari API ini adalah untuk menyediakan kunci eksklusif untuk aplikasi panggilan pertama. Lihatlah API di sekitar CreateFile dan itu dwShareMode argumen. Itulah alasan mengapa Anda mungkin tidak dapat menghapus file yang digunakan oleh beberapa aplikasi, itu hanya tidak peduli tentang kasus penggunaan Anda, menggunakan nilai default dan karena itu mendapat kunci eksklusif oleh Windows untuk file.

Tolong jangan percaya pada orang yang mengatakan sesuatu tentang Windows tidak menggunakan penghitungan ulang pada HANDLE atau tidak mendukung Hardlink atau semacamnya, itu sepenuhnya salah. Hampir setiap API menggunakan HANDLEs mendokumentasikan perilakunya mengenai penghitungan ulang dan Anda dapat dengan mudah membaca di hampir semua artikel tentang NTFS yang di dalamnya memang mendukung Hardlink dan selalu melakukannya, karena Windows Vista memiliki dukungan untuk Symlinks juga dan Dukungan untuk Hardlink telah ditingkatkan dengan menyediakan API untuk baca semua tautan keras untuk file yang diberikan dan seperti.

Selain itu, Anda mungkin hanya ingin melihat struktur yang digunakan untuk mendeskripsikan file dalam mis. Ext4 dibandingkan dengan NTFS, yang memiliki banyak kesamaan. Keduanya bekerja dengan konsep luasan, yang memisahkan data dari atribut seperti nama file, dan inode cukup banyak hanya nama lain untuk yang lebih tua, tetapi konsep serupa itu. Bahkan Wikipedia mencantumkan kedua sistem file tersebut di dalamnya artikel.

Ada benar-benar banyak FUD sekitar penguncian file di Windows dibandingkan dengan OS lain di internet, seperti tentang defragmentasi. ;-) Beberapa FUD ini dapat dikesampingkan hanya dengan membaca sedikit di atas Wikipedia.


2
2018-05-16 08:39



Varian NT memiliki

openfiles

perintah, yang akan menunjukkan proses mana yang menangani file mana. Memang, bagaimanapun, membutuhkan memungkinkan bendera global sistem 'memelihara daftar objek'

openfiles / local /?

memberitahu Anda bagaimana melakukan ini, dan juga bahwa penalti kinerja terjadi dengan melakukannya.


0
2017-10-13 09:11



Executables secara progresif dipetakan ke memori saat dijalankan. Apa itu artinya bagian-bagian dari yang dapat dieksekusi dimuat sesuai kebutuhan. Jika file di-swap sebelum semua bagian dipetakan, itu bisa menyebabkan ketidakstabilan besar.


0
2017-10-21 18:00