Menjawab hal-hal secara berurutan:
- 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).
- Tidak juga, ini terkait dengan jawaban berikutnya, jadi saya akan membahasnya di sana.
- 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.
- 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_SHARED
bendera.
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)).
mmap
tetapi Anda menggunakan itu