mmap
(bila digunakan dengan MAP_ANONYMOUS
) mengalokasikan potongan RAM yang dapat ditempatkan di mana saja dalam ruang alamat virtual proses, dan yang dapat dibatalkan alokasinya nanti (dengan munmap
) terlepas dari semua alokasi lainnya.
brk
mengubah alamat akhir dari satu "arena" yang berdekatan dari ruang alamat virtual:jika alamat ini dinaikkan, ia mengalokasikan lebih banyak memori ke arena, dan jika berkurang, ia membatalkan alokasi memori di ujung arena. Oleh karena itu, memori dialokasikan dengan brk
hanya dapat dirilis kembali ke sistem operasi ketika rentang alamat terus menerus di ujung arena tidak lagi dibutuhkan oleh proses.
Menggunakan brk
untuk alokasi kecil, dan mmap
untuk alokasi besar, adalah heuristik yang didasarkan pada asumsi bahwa alokasi kecil cenderung memiliki umur yang sama, sedangkan alokasi besar lebih cenderung memiliki umur yang tidak berkorelasi dengan umur alokasi lainnya. Jadi, alokasi besar menggunakan primitif sistem yang memungkinkan alokasinya terpisah dari hal lain, dan alokasi kecil menggunakan primitif yang tidak.
Heuristik ini tidak terlalu bisa diandalkan. Generasi malloc
saat ini implementasi, jika saya ingat dengan benar, telah menyerah sama sekali pada brk
dan menggunakan mmap
untuk semuanya. malloc
implementasi Saya menduga Anda melihat (yang ada di Perpustakaan GNU C, berdasarkan tag Anda) sudah sangat tua dan terutama terus digunakan karena tidak ada yang cukup berani untuk mengambil risiko menukarnya dengan sesuatu yang lebih baru yang akan mungkin tapi tidak pasti menjadi lebih baik.
jadi mengapa malloc memanggil mmap ketika harus mengalokasikan memori ukuran besar?
Jawaban singkatnya adalah untuk meningkatkan efisiensi pada implementasi Linux yang lebih baru, dan algoritme alokasi memori yang diperbarui yang menyertainya. Namun perlu diingat bahwa ini adalah topik yang sangat bergantung pada implementasi, dan mengapa serta mengapa akan sangat bervariasi untuk model dan rasa yang berbeda dari OS Linux tertentu yang sedang dibahas.
Berikut adalah artikel yang cukup baru mengenai bagian level rendah mmap()
dan brk()
bermain di alokasi memori Linux. Dan, artikel Jurnal Linux yang tidak terlalu baru, tetapi masih relevan yang menyertakan beberapa konten yang sangat tepat untuk topik di sini, termasuk ini:
Untuk permintaan yang sangat besar, malloc() menggunakan panggilan sistem mmap() untuk menemukan ruang memori yang dapat dialamatkan. Proses ini membantu mengurangi efek negatif dari fragmentasi memori ketika blok memori yang besar dibebaskan tetapi dikunci oleh blok yang lebih kecil dan lebih baru dialokasikan yang terletak di antara mereka dan akhir ruang yang dialokasikan. Dalam kasus ini, sebenarnya, seandainya blok dialokasikan dengan brk(), ia akan tetap tidak dapat digunakan oleh sistem bahkan jika proses membebaskannya.
(penekanan dari saya)
Mengenai brk()
:
kebetulan, "...mmap() tidak ada di versi awal Unix. brk()
adalah satu-satunya cara untuk meningkatkan ukuran segmen data dari proses pada saat itu. Versi pertama Unix dengan mmap() adalah SunOS pada pertengahan 80-an, versi sumber terbuka pertama adalah BSD-Reno pada tahun 1990. ". Sejak saat itu, implementasi modern dari algoritme alokasi memori telah difaktorkan ulang dengan banyak peningkatan, sangat mengurangi kebutuhan untuk menyertakannya menggunakan brk()
.