Anda tampaknya membingungkan pemetaan memori dengan file dalam sistem file yang berada di memori, bersama dengan konsep-konsep lain seperti bagaimana proses mempertahankan akses ke file bahkan ketika mereka dipindahkan.
Saya akan mengajukan pertanyaan demi pertanyaan untuk melihat apakah saya dapat menjelaskan semuanya.
- Katakanlah saya meramban direktori di sistem file saya dan ada file di direktori ini. Mungkinkah file ini menunjuk ke suatu wilayah di memori utama, alih-alih menunjuk ke suatu wilayah di disk?
Itu menunjuk ke memori utama jika itu pada sistem file yang berada di memori, seperti procfs yang biasanya dipasang di / proc, atau sysfs yang ada di / sys, atau tmpfs yang kadang-kadang ada di / tmp.
- Jika ini mungkin, apakah ini yang kita sebut 'file yang dipetakan memori'?
Tidak. Seperti yang dikatakan stephen-kitt, "pemetaan memori" mengacu pada cara untuk mengakses file dengan "memetakan" pada memori utama dan bekerja dengannya di sana daripada membaca dan menulis bongkahan sekaligus melalui fungsi-fungsi seperti baca () dan menulis().
- Apa artinya memindahkan file semacam itu di sekitar sistem file (yaitu, memindahkan file tersebut dari direktori ke direktori lain)? Apa yang saya pahami adalah, karena file tersebut dipetakan memori, proses (es) berinteraksi dengan file selalu menulis ke wilayah yang telah ditentukan dari memori utama, dan ketika kita membuka file itu (misalnya menggunakan vim), kita membaca wilayah itu dari memori utama (jadi, tidak ada disk yang terlibat). Karenanya, di mana pun kita memindahkan file, itu akan selalu berfungsi dengan benar, bukan? Jika ya, apakah memindahkan file di sekitar sistem file memiliki arti penting?
Jika Anda memindahkannya dalam sistem file yang sama, Anda benar-benar hanya bergerak di sekitar referensi, sebuah inode dari satu direktori ke direktori lain. Jika ada program yang sudah membuka file ini, mereka masih akan mengakses file yang sama karena mereka sudah memiliki inode di tangan melalui deskriptor file. Inilah yang terjadi dengan file table_name.idb yang Anda sebutkan dalam komentar.
- Apakah ada perintah yang akan memberi tahu jika file dipetakan memori?
Wossname sudah menjawab ini untuk file yang dipetakan memori. lsof
akan memberi tahu Anda proses mana yang dipetakan memori file.
Untuk mengetahui apakah suatu file berada dalam sistem file yang berada di memori, Anda dapat menggunakan df
atau
mount
untuk membuat daftar sistem file dan titik mountnya. Anda hanya perlu tahu jenis sistem file mana yang berada di memori dengan mencarinya (misalnya di wikipedia).
- Akhirnya, jika saya membuka file yang dipetakan dengan vim, buat beberapa perubahan dan simpan serta tutup vim, apa yang akan terjadi? Apakah perubahan saya hanya akan ditulis ke memori utama? Jika demikian, apakah proses lain yang menggunakan file ini akan melihat perubahan yang baru saja saya buat? Dalam pengalaman saya, proses lain tidak melihat perubahan yang saya buat pada file ketika saya membuat beberapa perubahan pada file dengan vim. Apa alasannya?
Secara pribadi, saya belum menggunakan mmap
fungsi dalam program C, tapi seperti yang saya pahami dari membaca sekilas man mmap
dan info mmap
, tidak ada keajaiban yang terlibat dalam mempertahankan representasi dalam memori dalam sinkronisasi. Dalam bentuk dasarnya, memanggil mmap menyalin isi file ke memori dan msync
digunakan untuk menulisnya kembali dari memori ke disk. Jika file pada disk berubah, tidak ada yang tersedia untuk mendeteksi itu dan secara otomatis mengubah representasi dalam memori dalam semua proses yang memetakannya.
EDIT: Ternyata mmap () benar-benar mencoba untuk menjaga representasi dalam memori tetap sinkron dalam beberapa kondisi. Jika peta hanya dibaca dari, peta itu akan tetap disinkronkan bahkan ketika proses lain menulis ke file. Jika ditulis ke (dengan menetapkan ke wilayah memori), apa yang terjadi tergantung pada bendera MAP_SHARED atau MAP_PRIVATE yang tampaknya wajib diberikan ke mmap (). Jika MAP_PRIVATE disediakan, peta bercabang dari representasi di-disk dan berhenti disinkronkan hingga Anda menggunakan msync (). Jika MAP_SHARED disediakan, maka pembaruan dibuat terlihat oleh proses lain yang memiliki file dipetakan, serta (meskipun ini tidak langsung diperlukan) representasi pada disk.
Saya baru saja membuka vim pada file yang ada e
, dan menjalankan perintah :w
, sambil inotifywait -m .
menjalankan di terminal lain. Di antara beberapa bagian aneh, ini adalah bagian penting yang saya dapatkan inotifywait
.
./ MOVED_FROM e
./ MOVED_TO e~
./ CREATE e
./ OPEN e
./ MODIFY e
./ CLOSE_WRITE,CLOSE e
./ ATTRIB e
./ ATTRIB e
./ DELETE e~
Vim membuat file baru, dan menghapus yang lama. Mengapa ini dilakukan alih-alih memodifikasi file berada di luar cakupan pertanyaan ini, tetapi intinya adalah bahwa ini adalah file baru dan karenanya memiliki inode baru.
Sekarang, apa yang Anda maksud dengan proses lain menggunakan file ini? Jika yang Anda maksud adalah proses yang memiliki file dibuka saat Anda melakukan ini, tidak mereka tidak akan melihat perubahan. Ini karena, meskipun mereka membuka file dengan jalur yang sama, mereka bukan file yang sama. Jika Anda maksud proses yang dapat membuka file setelah Anda melakukan ini, maka ya mereka akan melihat perubahannya. Mereka akan membuka file baru yang Anda buat.
Penting untuk dicatat bahwa meskipun program tampaknya memiliki file terbuka di antarmuka pengguna, itu tidak berarti bahwa mereka menjaga file tetap terbuka dalam proses. Vim adalah contohnya, seperti yang ditunjukkan di atas.