GNU/Linux >> Belajar Linux >  >> Linux

Apa perbedaan antara menulis ke file dan memori yang dipetakan?

  1. Salah satu alasannya mungkin karena Anda memiliki kode (warisan) yang diatur untuk menulis ke buffer data, dan kemudian buffer ini ditulis ke file sekaligus di akhir. Dalam hal ini menggunakan mmap akan menyimpan setidaknya satu salinan data, karena OS dapat langsung menulis buffer ke disk. Selama ini hanya tentang penulisan file, saya tidak dapat (belum) membayangkan alasan lain mengapa Anda ingin menggunakan mmap .

  2. Tidak, perlindungan tidak relevan di sini menurut saya.

  3. Mungkin menyimpan satu atau dua salinan data dari mis. buffer aplikasi ke buffer libc ke buffer OS, lihat poin 1. Ini mungkin membuat perbedaan kinerja saat menulis data dalam jumlah besar.

  4. Tidak. Sejauh yang saya tahu, OS bebas untuk menulis data kapan saja sesukanya, selama data telah ditulis ke disk setelah panggilan ke msync atau munmap di wilayah memori itu. (Dan untuk sebagian besar file kemungkinan besar tidak akan menulis apa pun di antara sebagian besar waktu, karena alasan kinerja:menulis seluruh blok ke disk karena perubahan satu byte agak mahal, khususnya jika diharapkan bahwa lebih banyak modifikasi pada blok akan terjadi dalam waktu dekat.)


File yang dipetakan memori sebenarnya sebagian atau seluruhnya dipetakan dalam memori (RAM), sedangkan file yang Anda tulis akan ditulis ke memori dan kemudian dibuang ke disk. File yang dipetakan memori diambil dari disk dan ditempatkan ke dalam memori secara eksplisit untuk membaca dan/atau menulis. Itu tetap di sana sampai Anda menghapusnya.

Akses ke disk lebih lambat, jadi ketika Anda menulis ke file, itu akan dibuang ke disk dan tidak lagi berada di RAM, yang berarti, lain kali Anda membutuhkan file tersebut, Anda mungkin akan mendapatkannya dari disk ( lambat), sedangkan pada file yang dipetakan memori, Anda tahu bahwa file tersebut ada di RAM dan Anda dapat memiliki akses lebih cepat ke file tersebut daripada saat berada di disk.

Selain itu, file yang dipetakan memememory sering digunakan sebagai mekanisme IPC, sehingga dua atau lebih proses dapat dengan mudah berbagi file yang sama dan membaca/menulisnya. (menggunakan mekanisme sinkronisasi yang diperlukan)

Ketika Anda perlu sering membaca file, dan file ini cukup besar, akan menguntungkan untuk memetakannya ke dalam memori sehingga Anda memiliki akses yang lebih cepat daripada harus membukanya dan mengambilnya dari disk setiap saat.

EDIT:

Itu tergantung pada kebutuhan Anda, ketika Anda memiliki file yang perlu diakses sangat sering oleh utas yang berbeda, maka saya tidak yakin bahwa pemetaan memori file tersebut akan menjadi ide yang bagus, dari pandangan itu, Anda harus menyinkronkan akses ke file mmap'ed ini jika Anda ingin menulisnya, di tempat yang sama dari utas yang berbeda. Jika itu sangat sering terjadi, ini bisa menjadi tempat pertengkaran sumber daya.

Hanya membaca dari file, maka ini mungkin solusi yang bagus, karena Anda tidak terlalu perlu menyinkronkan akses, jika Anda hanya membacanya dari beberapa utas. Saat Anda mulai menulis, Anda harus gunakan mekanisme sinkronisasi.

Saya sarankan, agar setiap utas melakukan akses file sendiri dengan cara lokal utas, jika Anda harus menulis ke file, seperti yang Anda lakukan dengan file lainnya. Dengan cara ini, ini mengurangi kebutuhan akan sinkronisasi utas dan kemungkinan bug yang sulit ditemukan dan di-debug.


1) Anda salah memahami panggilan sistem tulis (2). write() tidak menulis, itu hanya menyalin konten buffer ke rantai buffer OS dan menandainya sebagai kotor. Salah satu utas OS (bdflush IIRC) akan mengambil buffer ini, menulisnya ke disk dan mengutak-atik beberapa flag. nanti.Dengan mmap, Anda langsung mengakses buffer OS (tetapi jika Anda mengubah isinya, itu akan ditandai kotor juga)

2) Ini bukan tentang perlindungan, Ini tentang pengaturan bendera di entri halaman.

3) Anda menghindari buffering ganda. Anda juga dapat mengalamatkan file dalam bentuk karakter alih-alih blok, yang terkadang lebih praktis

4) Ini adalah buffer sistem (terhubung ke ruang alamat Anda) yang telah Anda gunakan. Sistem mungkin atau mungkin tidak menulis bagiannya ke disk.

5) Jika utas milik proses yang sama dan berbagi tabel halaman dan ruang alamat, ya.


Linux
  1. Apa perbedaan antara fsync dan syncfs?

  2. Apa perbedaan antara adduser dan useradd?

  3. Apa perbedaan antara ls dan l?

  1. Apa perbedaan antara PAE 32-bit dan kernel 64-bit?

  2. Apa perbedaan antara `su -` dan` su --login`?

  3. Apa perbedaan antara $(CC) dan $CC?

  1. Apa perbedaan antara InnoDB dan MyISAM?

  2. Perbedaan Antara [[ $a ==Z* ]] Dan [ $a ==Z* ]?

  3. Perbedaan Antara .exrc Dan .vimrc?