Memahami MMAP

9

Saya sedang membaca dokumentasi tentang MMAP di sini dan mencoba mengimplementasikannya menggunakan ini

Saya punya beberapa keraguan tentang implementasinya.

  1. Apakah MMAP menyediakan pemetaan file dan mengembalikan penunjuk lokasi itu dalam memori fisik atau mengembalikan dengan alamat tabel pemetaan? dan apakah itu mengalokasikan dan mengunci ruang untuk file itu juga?

  2. Setelah file disimpan di lokasi itu dalam memori, apakah itu tetap di sana sampai munmap dipanggil?

  3. Apakah file bahkan dipindahkan ke memori atau hanya tabel pemetaan yang berfungsi sebagai pengalihan dan file tersebut sebenarnya di memori virtual - (disk)?

  4. Dengan asumsi itu dipindahkan ke memori, dapatkah proses lain mengakses ruang itu untuk membaca data jika mereka memiliki alamat?

john
sumber
2
Anda tidak menerapkan mmap tetapi Anda menggunakan itu
Basile Starynkevitch

Jawaban:

12

Menjawab hal-hal secara berurutan:

  1. Ini mengembalikan pointer ke lokasi dalam memori virtual , dan ruang alamat memori virtual dialokasikan, tetapi file tersebut tidak dikunci dengan cara apa pun kecuali Anda menguncinya secara eksplisit (juga perhatikan bahwa mengunci memori tidak sama dengan mengunci wilayah di mengajukan). Implementasi yang efisien dari mmap () sebenarnya hanya mungkin dari perspektif praktis karena paging dan memori virtual (jika tidak, itu akan memerlukan membaca seluruh wilayah ke dalam memori sebelum panggilan selesai).
  2. Tidak juga, ini terkait dengan jawaban berikutnya, jadi saya akan membahasnya di sana.
  3. Agak. Apa yang sebenarnya terjadi dalam kebanyakan kasus adalah bahwa mmap () menyediakan akses copy-on-write ke data file dalam cache halaman. Akibatnya, pembatasan cache yang biasa pada masa berlaku data berlaku (jika sistem membutuhkan ruang, halaman dapat dijatuhkan (atau dibuang ke disk jika kotor) dari cache dan perlu disalahgunakan lagi.
  4. Tidak, karena cara kerja memori virtual. Setiap proses memiliki ruang alamat virtual sendiri, dengan pemetaan virtual sendiri. Setiap program yang ingin berkomunikasi data harus memanggil mmap () pada file yang sama (atau segmen memori bersama), dan mereka semua harus menggunakan MAP_SHAREDbendera.

Perlu dicatat bahwa mmap () tidak hanya berfungsi pada file, Anda juga dapat melakukan hal-hal lain seperti:

  • Memetakan memori perangkat secara langsung (jika Anda memiliki hak yang memadai). Ini sebenarnya digunakan pada banyak sistem embedded untuk menghindari keharusan menulis driver mode kernel untuk perangkat keras baru.
  • Memetakan segmen memori bersama.
  • Memetakan halaman besar secara eksplisit.
  • Alokasikan memori yang dapat Anda panggil madvise (2) aktif (yang pada gilirannya memungkinkan Anda melakukan hal-hal berguna seperti mencegah data tidak disalin ke proses anak di garpu (2), atau menandai data untuk KSM (fitur deduplikasi memori Linux)).
Austin Hemmelgarn
sumber
Terima kasih atas jawaban terinci seperti itu. Hanya klarifikasi pada poin 1. Jika saya mencoba mengakses alamat memori virtual yang dikembalikan. Pertama akan melewati peta alamat yang dibuat untuk proses dan kemudian dialihkan ke lokasi sebenarnya - yang mungkin disk, cache atau memori Kedua jika bendera MAP_SHARED aktif dan tabel untuk kedua proses mengembalikan nilai yang sama untuk alamat fisik kemudian file dapat dibagikan?
john
1. Ya, itu akan menggunakan tabel pemetaan kehabisan memori virtual. 2. Alamat di setiap proses tidak masalah, hanya fakta bahwa mereka telah memetakan wilayah yang sama dari file yang sama dengan MAP_SHARED.
Austin Hemmelgarn