Sebuah proses dapat memakai memory untuk pekerjaan yang koordinasinya berada di komponen lain. Linux process_madvise() memungkinkan koordinator eksternal menerapkan virtual-memory advice terpilih ke rentang dalam proses target tanpa menyuntikkan kode ke proses tersebut. Target diidentifikasi melalui pidfd, sedangkan rentang alamat diberikan sebagai array struct iovec.
Susunan ini memisahkan keputusan memory policy dari kode yang memiliki mapping. Runtime manager, service supervisor, atau memory controller dapat meminta perlakuan berorientasi reclaim atau prefetch untuk proses lain, dengan tetap tunduk pada dukungan kernel dan pemeriksaan permission. System call ini tidak memindahkan ownership mapping, tidak membekukan target, dan tidak membuat address space target menjadi statis.
pidfd mengidentifikasi proses, sedangkan iovec mengidentifikasi rentang virtual
process_madvise() menerima pidfd, array iovec, jumlah elemen, nilai advice, dan argumen flags. Setiap pasangan iov_base dan iov_len mendeskripsikan rentang virtual address pada proses yang dirujuk oleh pidfd.
Penggunaan pidfd penting karena operasi terikat pada referensi proses, bukan hanya mengandalkan PID numerik yang diberikan ketika pemanggilan dilakukan. Model ini konsisten dengan API berbasis pidfd lain dan menghindari rancangan control operation yang bergantung pada lookup PID numerik berulang.
Nilai alamat tetap berasal dari address space target. Pointer yang valid pada controller tidak memiliki hubungan khusus dengan alamat bernilai sama pada target. Software yang memilih rentang karena itu memerlukan sumber valid lain untuk layout mapping target atau protokol aplikasi yang sudah mendefinisikan rentang tersebut.
Argumen flags disediakan untuk penggunaan mendatang dan saat ini harus bernilai nol. Memperlakukannya sebagai extension field, bukan bit yang bebas ditentukan aplikasi, menjaga kompatibilitas dengan semantik kernel di masa depan.
Advice mengubah perlakuan kernel, bukan ownership address space
Untuk proses lain, kumpulan advice yang diterima sengaja lebih sempit daripada seluruh permukaan madvise(). Dokumentasi Linux saat ini mencantumkan MADV_COLD, MADV_COLLAPSE, MADV_PAGEOUT, dan MADV_WILLNEED untuk operasi lintas proses. Sejak Linux 6.13, pemanggil yang menargetkan prosesnya sendiri dapat memakai nilai advice apa pun yang diterima untuk kasus tersebut.
Operasi itu memiliki efek berbeda. MADV_COLD menandai page yang memenuhi syarat sebagai kandidat yang lebih dingin untuk reclaim. MADV_PAGEOUT meminta reclaim page pada rentang yang ditentukan. MADV_WILLNEED menyatakan akses diperkirakan terjadi dalam waktu dekat dan dapat memicu perilaku read-ahead ketika sesuai. MADV_COLLAPSE meminta collapse sinkron menjadi transparent huge page untuk memory yang memenuhi syarat.
API ini membawa policy request dengan semantik spesifik untuk setiap advice. Ia bukan remote munmap(), remote allocator, atau editor memory generik. Proses target tetap memiliki mapping dan terus berjalan ketika kernel menerapkan perlakuan yang diminta.
Target dapat mengubah mapping secara concurrent
pidfd menstabilkan identitas proses, bukan layout virtual memory milik target. Thread lain dapat melakukan unmap, remap, split, replacement, atau perubahan region ketika controller sedang menyiapkan atau mengirim advice.
Batas ini perlu dibuat eksplisit pada kode control plane. Rentang yang diamati sebelumnya bukan handle permanen untuk sebuah mapping. Jika aplikasi mengharuskan advice terkait dengan allocation atau generation tertentu, hubungan tersebut memerlukan synchronization atau versioning di luar process_madvise().
Kernel melaporkan kegagalan seperti rentang target yang tidak dapat diakses, tetapi error bukan mekanisme transaction rollback bagi protokol aplikasi yang lebih besar. Pemanggil tetap harus menentukan apakah informasi rentang yang stale dapat dicoba kembali, dibuang, atau direkonsiliasi dengan metadata mapping yang lebih baru.
Success dapat mencakup byte lebih sedikit dari permintaan
Return value adalah jumlah byte yang berhasil menerima advice. Nilainya dapat lebih kecil daripada total panjang dalam array iovec jika pemrosesan menemui error setelah elemen sebelumnya sudah ditangani.
Perilaku hasil parsial ini penting bagi controller yang mengirim beberapa rentang terpisah dalam satu pemanggilan. Return value nonnegatif tidak berarti setiap byte yang diminta telah menerima advice. Jumlah byte hasil perlu dibandingkan dengan total permintaan jika kelengkapan merupakan bagian dari policy.
Batching juga tidak bersifat atomic. Menggabungkan rentang mengurangi system-call traffic, tetapi tidak mengubah array menjadi transaksi memory-management all-or-nothing. Recovery logic perlu membedakan byte yang sudah diproses dari rentang yang masih memerlukan tindakan.
Permission merupakan bagian dari batas interface
Memory advice lintas proses dapat memengaruhi performance dan resident memory milik proses lain secara material, sehingga Linux menerapkan access check dan tidak membiarkan proses sembarang mengirim operasi tersebut.
Permission model berubah sejak system call ini muncul pada Linux 5.10. Implementasi awal memakai ptrace-style attach access check. Linux 5.12 melonggarkan model tersebut sehingga kontrol penuh atas target tidak lagi diwajibkan, sambil tetap mempertahankan permission constraint untuk operasi lintas proses.
Kode karena itu perlu memperlakukan EPERM sebagai batas operasional, bukan bukti bahwa pidfd tidak valid. EBADF mencakup descriptor yang bukan pidfd valid, sedangkan ESRCH dapat menandakan target sudah tidak ada. Konfigurasi capability dan security policy tetap menjadi bagian deployment di sekitar API.
Dukungan kernel juga bergantung pada konfigurasi CONFIG_ADVISE_SYSCALLS. Deployment Linux tidak dapat menyimpulkan ketersediaan hanya dari versi kernel.
Reclaim advice dapat menukar RSS saat ini dengan biaya fault berikutnya
Remote advice berguna karena memory pressure dan aktivitas aplikasi tidak selalu terlihat dari komponen yang sama. Supervisor dapat memiliki pandangan lebih luas mengenai prioritas service atau tekanan host dibanding worker individual.
Dengan MADV_PAGEOUT atau MADV_COLD, pandangan tersebut dapat memengaruhi keputusan reclaim untuk rentang terpilih. Tujuan langsungnya dapat berupa pengurangan tekanan dari memory yang sedang berprioritas rendah. Namun, jika target kembali menyentuh page tersebut, akses berikutnya dapat menimbulkan pekerjaan tambahan untuk membuat data resident kembali.
Trade-off ini bergantung pada workload. External reclaim yang agresif dapat mengubah memory pressure menjadi lonjakan latency atau I/O. System call menyediakan mekanisme untuk menyatakan keputusan; ia tidak menjamin keputusan tersebut menguntungkan service tertentu.
MADV_WILLNEED mengarah ke sisi sebaliknya dengan memberi sinyal mengenai akses yang diperkirakan akan terjadi. Mekanisme ini dapat berguna saat komponen orkestrasi memiliki informasi fase yang andal, tetapi speculative prefetch juga dapat memakai bandwidth dan cache capacity. External policy tetap bertanggung jawab atas biaya tersebut.
Advice lintas proses membentuk primitive control plane
process_madvise() paling berguna ketika memory ownership dan memory policy memang dipisahkan. Proses target memiliki serta mengakses mapping, sementara komponen lain dapat menerapkan kumpulan terbatas kernel memory hint atau direction ke rentang terpilih.
Batas API membuat pemisahan tersebut presisi: pidfd menyediakan identitas proses, iovec menyediakan rentang virtual, nilai advice menentukan memory action yang diminta, permission membatasi pihak yang boleh bertindak, dan byte-count return memperlihatkan partial completion.
Properti tersebut membuat system call cocok untuk coordinated memory management tanpa mengubahnya menjadi remote memory transaction. Integrasi yang benar tetap bergantung pada informasi mapping yang mutakhir, semantik spesifik advice, penanganan eksplisit atas hasil parsial, dan policy yang memperhitungkan pola akses target berikutnya.