Pada dasarnya, saya mencoba memahami apa yang terjadi jika dua proses membuka file yang sama pada waktu yang sama, dan jika seseorang dapat menggunakan ini untuk menawarkan komunikasi antara proses dengan aman dan berkinerja baik.
Jika Anda menggunakan file biasa menggunakan read
dan write
operasi (yaitu bukan memori yang memetakannya) maka kedua proses tidak berbagi memori apa pun.
- Memori ruang pengguna di
Buffer
Java objek yang terkait dengan file TIDAK dibagikan di seluruh ruang alamat. - Bila
write
syscall dibuat, data disalin dari halaman dalam satu proses ruang alamat ke halaman dalam ruang kernel. (Ini bisa menjadi halaman dalam cache halaman. Itu khusus untuk OS.) - Bila
read
syscall dibuat, data disalin dari halaman di ruang kernel ke halaman di ruang alamat proses membaca.
Itu harus dilakukan dengan cara itu. Jika sistem operasi berbagi halaman yang terkait dengan pembaca dan penulis memproses buffer di belakang mereka, maka itu akan menjadi lubang kebocoran keamanan/informasi:
- Pembaca akan dapat melihat data di ruang alamat penulis yang belum ditulis melalui
write(...)
, dan mungkin tidak akan pernah. - Penulis akan dapat melihat data yang ditulis oleh pembaca (secara hipotetis) ke buffer bacanya.
- Tidak mungkin untuk mengatasi masalah dengan penggunaan perlindungan memori secara cerdik karena perincian perlindungan memori adalah halaman versus perincian
read(...)
danwrite(...)
yang sekecil satu byte.
Tentu:Anda dapat dengan aman menggunakan membaca dan menulis file untuk mentransfer data antara dua proses. Tetapi Anda perlu menentukan protokol yang memungkinkan pembaca mengetahui berapa banyak data yang telah ditulis penulis. Dan pembaca tahu kapan penulis telah menulis sesuatu yang dapat memerlukan polling; misalnya untuk melihat apakah file telah dimodifikasi.
Jika Anda melihatnya hanya dari segi penyalinan data dalam "saluran" komunikasi
-
Dengan file yang dipetakan memori, Anda menyalin (menyerialkan) data dari objek heap aplikasi ke buffer yang dipetakan, dan untuk kedua kalinya (menghapus serialisasi) dari buffer yang dipetakan ke objek heap aplikasi.
-
Dengan file biasa ada dua salinan tambahan:1) dari buffer proses penulisan (tidak dipetakan) ke halaman ruang kernel (misalnya di cache halaman), 2) dari halaman ruang kernel ke buffer proses membaca (tidak dipetakan) .
Artikel di bawah ini menjelaskan apa yang terjadi dengan baca/tulis konvensional dan pemetaan memori. (Ini dalam konteks menyalin file dan "zero-copy", tetapi Anda dapat mengabaikannya.)
Referensi:
- Zero Copy I:Perspektif Mode Pengguna