GNU/Linux >> Belajar Linux >  >> Linux

Menggunakan file untuk IPC untuk memori bersama

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(...) dan write(...) 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

Linux
  1. Grep:Memori Habis?

  2. CentOS / RHEL 6:Cara membatasi sumber daya memori untuk pengguna tertentu menggunakan cgroups

  3. Mengunci mekanisme untuk konsistensi memori bersama

  1. Cara Mentransfer File Antara Dua Komputer menggunakan Perintah nc dan pv

  2. Bagaimana saya bisa menguji RAM untuk kerusakan data pada sistem berbasis ARM?

  3. Menggunakan /proc/stat untuk jumlah proses yang berjalan pada sistem

  1. Menggunakan GPG untuk Mengenkripsi dan Mendekripsi File di Linux [Langsung untuk Pemula]

  2. Menggunakan Bash untuk otomatisasi

  3. Bagaimana memulihkan file yang dihapus di Linux menggunakan alat pemulihan data Scalpel?