process_madvise() memungkinkan satu proses Linux meminta tindakan manajemen memori untuk rentang virtual address milik proses lain. Target diidentifikasi melalui pidfd, sedangkan array iovec menentukan rentang pada target. Mekanisme ini memisahkan keputusan kebijakan memori dari proses yang mapping-nya menerima saran.

Interface ini relevan bagi controller yang sudah memiliki informasi eksternal mengenai status workload. Runtime manager dapat menandai memori yang tidak aktif sebagai cold atau meminta reklamasi page tanpa menyisipkan kode ke proses yang dikelola. Kemampuan tersebut dibatasi oleh pemeriksaan permission, jenis advice yang didukung, dan semantik progres parsial.

Rentang alamat merupakan milik proses target

Pada sistem glibc saat ini, bentuk pemanggilannya adalah:

#include <sys/mman.h>
#include <sys/uio.h>

ssize_t process_madvise(int pidfd,
                        const struct iovec iovec[],
                        size_t n,
                        int advice,
                        unsigned int flags);

pidfd mengidentifikasi proses yang menerima advice. Setiap iov_base ditafsirkan sebagai virtual address pada proses tersebut, bukan pada caller. Bentuk vector memungkinkan satu operasi mendeskripsikan beberapa rentang yang terpisah.

Identitas berbasis descriptor juga menghindari penggunaan PID numerik yang dapat dipakai ulang sebagai satu-satunya referensi target. Masa hidup proses dan validitas address space tetap berpengaruh: sebuah rentang dapat hilang atau berubah ketika target memodifikasi mapping-nya.

flags dicadangkan untuk penggunaan mendatang dan saat ini harus bernilai nol.

Advice lintas proses dibatasi secara sengaja

Untuk proses lain, process_madvise() menerima sekumpulan advice yang terbatas. Dokumentasi Linux saat ini mencantumkan MADV_COLD, MADV_COLLAPSE, MADV_PAGEOUT, dan MADV_WILLNEED. Sejak Linux 6.13, proses yang menerapkan pemanggilan ini pada dirinya sendiri dapat memakai advice apa pun yang diterima oleh madvise().

Operasi yang berkaitan dengan reklamasi memiliki efek yang berbeda:

  • MADV_COLD menonaktifkan page yang sesuai sehingga menjadi kandidat reklamasi yang lebih mungkin saat terjadi tekanan memori. Operasi ini tidak destruktif dan dapat diabaikan untuk page yang tidak sesuai.
  • MADV_PAGEOUT meminta reklamasi page yang sesuai. Anonymous page dapat dipindahkan ke swap; dirty file-backed page dapat memerlukan writeback ke backing storage.
  • MADV_WILLNEED menyatakan perkiraan akses dalam waktu dekat dan dapat memicu persiapan yang bergantung pada implementasi, seperti read-ahead.
  • MADV_COLLAPSE meminta penggabungan sinkron best-effort menjadi Transparent Huge Pages jika syarat mapping dan alignment terpenuhi.

Operasi tersebut merupakan permintaan kepada subsistem memori, bukan pemindahan kepemilikan permanen atau jaminan penempatan page pada masa mendatang. Advice yang memengaruhi kondisi page saat ini tidak membekukan page fault, akses, atau perubahan mapping berikutnya.

Permission merupakan bagian dari mekanisme

Kontrol memori lintas proses tidak diberikan hanya karena caller dapat memperoleh PID numerik. Linux menerapkan pemeriksaan akses terhadap proses target, dan advice yang berkaitan dengan reklamasi membawa persyaratan capability. Interface yang terdokumentasi mensyaratkan akses yang sesuai ke address space target; operasi dengan dampak performa memerlukan CAP_SYS_NICE pada kondisi yang ditetapkan interface kernel.

Karena itu, process_madvise() cocok untuk service manager berprivilege, infrastruktur container, dan memory controller hanya jika model otoritasnya secara eksplisit mengizinkan intervensi tersebut. Interface ini bukan saluran umum bagi proses arbitrer untuk mengeluarkan page milik proses lain dari memori.

Dukungan juga bergantung pada opsi konfigurasi kernel CONFIG_ADVISE_SYSCALLS. Perangkat lunak yang bergantung pada interface ini perlu memperlakukan ketersediaan syscall sebagai properti runtime, bukan mengasumsikannya hanya dari header.

Return sukses dapat menunjukkan progres parsial

Return value berupa jumlah byte, bukan sekadar penanda sukses Boolean. Linux dapat memproses sebagian elemen iovec lalu menemukan error. Dalam kondisi tersebut, return sukses dapat lebih kecil daripada jumlah seluruh panjang yang diminta.

Untuk rentang dengan panjang (L_1, L_2, \ldots, L_n), jumlah byte yang diminta adalah:

[ B = \sum_{i=1}^{n} L_i ]

Caller yang menerima 0 <= result < B menghadapi operasi parsial dan tidak boleh melaporkan seluruh vector sebagai rentang yang telah menerima advice.

Hal ini penting bagi memory controller eksternal karena mapping target bukan transaksi statis. Validasi dan penerapan dapat menemui kondisi berbeda pada setiap elemen vector, sehingga pencatatan hasil harus mengikuti jumlah byte yang dikembalikan.

Kebijakan reklamasi tetap terpisah dari kepemilikan mapping

process_madvise() tidak memberikan kepemilikan mapping target kepada controller. Target tetap dapat membaca, menulis, memicu page fault kembali, melakukan unmap, atau mengganti mapping sesuai sinkronisasi dan logika aplikasinya sendiri.

Batas ini merupakan bagian utama dari interface: satu proses dapat memengaruhi perlakuan manajemen memori, sementara proses lain tetap memegang virtual address space dan execution state miliknya. Kernel memediasi operasi melalui pidfd, rentang alamat eksplisit, aturan khusus setiap advice, dan pemeriksaan akses.

Hasilnya adalah control surface yang sempit untuk kebijakan memori eksternal. Interface ini dapat menggeser tekanan reklamasi atau kondisi page pada rentang tertentu, tetapi tidak mengubah rentang tersebut menjadi resource stabil yang dikendalikan oleh proses pemberi advice.

Referensi