MADV_FREE tidak langsung mengganti private anonymous page dengan nol. Operasi ini menandai page yang memenuhi syarat sebagai data yang boleh dibuang, lalu Linux dapat me-reclaim-nya kemudian. Sebelum reclaim benar-benar terjadi, byte lama masih dapat terlihat. Penulisan sebelum reclaim membatalkan status tersebut pada page yang ditulis.
Karakteristik waktu ini membedakan MADV_FREE dari advice yang langsung mengubah keadaan range yang terlihat oleh proses. Kontraknya adalah reclamation tertunda: aplikasi menyatakan bahwa isi lama tidak lagi diperlukan, sedangkan kernel menentukan kapan memori fisik diambil kembali.
Mapping tetap valid setelah pemanggilan
madvise(addr, length, MADV_FREE) yang berhasil tetap mempertahankan virtual address range sebagai mapping. Operasi ini tidak berperilaku seperti munmap() dan tidak membuat bagian address space menjadi tidak dapat diakses.
void *p = mmap(NULL, length,
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
-1, 0);
if (p == MAP_FAILED) {
return -1;
}
if (madvise(p, length, MADV_FREE) == -1) {
return -1;
}MADV_FREE berlaku pada private anonymous page. Range yang mencakup file mapping, MAP_SHARED mapping, Huge TLB mapping, atau area VM_PFNMAP bukan target yang valid untuk advice ini.
Aplikasi tetap dapat mengakses range tersebut setelah pemanggilan. Perubahan pentingnya adalah kernel kini memiliki izin untuk membuang isi page lama.
Reclaim dapat ditunda
Kernel dapat menunda pembebasan page yang sudah ditandai sampai tekanan memori membuat reclamation berguna. Akibatnya, pembacaan sesaat setelah MADV_FREE masih dapat menghasilkan byte yang ada sebelum pemanggilan.
Byte tersebut tidak lagi memiliki jaminan persistensi bagi aplikasi. Setelah Linux me-reclaim page yang ditandai, isi lamanya hilang. Referensi berikutnya memperoleh zero-fill-on-demand page, bukan data yang sudah dibuang.
Setelah pemanggilan, dua keadaan berikut sama-sama valid:
sebelum reclaim: byte lama masih mungkin tersedia
setelah reclaim: referensi berikutnya melihat page berisi nolKode tidak boleh menganggap keberhasilan MADV_FREE sebagai titik yang menjamin pembacaan nilai lama langsung menghasilkan nol. Transisi menuju memori berisi nol terkait dengan reclamation, bukan dengan selesainya madvise().
Penulisan berikutnya membatalkan status disposable
Penulisan ke page yang sudah ditandai MADV_FREE tetapi belum di-reclaim membuat page tersebut dirty kembali. Linux tidak lagi dapat membuang state baru hasil penulisan berdasarkan advice sebelumnya.
Sifat ini memungkinkan allocator dan cache menandai anonymous memory yang sedang tidak dipakai sebagai memori yang boleh dibuang tanpa memaksa reclamation fisik saat itu juga. Jika memori segera dipakai kembali, penulisan mengembalikan semantik dirty page biasa. Jika tetap tidak dipakai, kernel memiliki memori yang dapat di-reclaim ketika tekanan meningkat.
Perilaku ini bekerja pada granularitas page meskipun aplikasi mengelola objek logis yang lebih kecil. Menandai range yang masih memuat data penting menimbulkan risiko correctness karena reclaim dapat membuang isi seluruh page yang terdampak.
MADV_FREE dan MADV_DONTNEED memiliki boundary berbeda
Pada private anonymous mapping, MADV_DONTNEED menetapkan semantik zero-fill-on-demand untuk akses berikutnya setelah operasi berhasil. MADV_FREE justru membiarkan isi lama bertahan sementara dan menyerahkan waktu pembuangan kepada kernel.
Perbedaan tersebut penting bagi software yang memperlakukan isi memori sebagai state. Dengan MADV_DONTNEED, caller telah melewati boundary isi secara langsung. Dengan MADV_FREE, caller baru menyatakan isi sebelumnya boleh dibuang dan tidak dapat menyimpulkan bahwa reclaim sudah terjadi hanya dari kembalinya madvise().
Keduanya tidak sama dengan melepas virtual address range. Mapping tetap ada dan akses berikutnya tetap valid sesuai protection flag normalnya.
LazyFree memperlihatkan sebagian state sistem
Linux melaporkan memori yang ditandai oleh MADV_FREE melalui field LazyFree di /proc/meminfo. Nilai tersebut menggambarkan memori pada state reclaimable ini dalam lingkup sistem.
grep '^LazyFree:' /proc/meminfoField ini dapat menjadi indikasi bahwa sejumlah page telah masuk ke populasi lazy-free, tetapi bukan catatan kepemilikan untuk satu proses dan bukan mekanisme sinkronisasi untuk mendeteksi reclaim pada page tertentu.
Kontraknya berpusat pada isi yang boleh dibuang
MADV_FREE hanya sesuai ketika byte sebelumnya sudah tidak diperlukan untuk correctness. Aplikasi tetap mempertahankan address range, dan penggunaan ulang yang cepat dapat menghindari reclamation langsung, tetapi kernel bebas membuang page bertanda yang tidak ditulis kemudian.
Boundary utamanya adalah lifetime isi, bukan lifetime mapping. Setelah pemanggilan berhasil, isi lama bersifat expendable meskipun secara fisik masih tersedia untuk sementara. Desain yang masih memerlukan byte tersebut harus menyimpannya di luar range yang diberikan ke MADV_FREE.