Langsung ke konten

Arsip

Rekayasa Perangkat Lunak

127 artikel
Rekayasa Perangkat Lunak 17 Sep 2026 4 min read

pidfd Menjaga Identitas Proses Tetap Stabil Saat PID Dipakai Ulang

PID numerik Linux dapat dipakai ulang setelah prosesnya berakhir. Sebaliknya, PID file descriptor merujuk ke task tertentu, sehingga operasi berikutnya melalui descriptor tersebut tidak diam-diam beralih ke proses lain yang kemudian memperoleh PID numerik yang sama. Sifat ini mengubah identitas proses dari lookup yang diulang pada setiap operasi menjadi referensi yang dipertahankan kernel dengan semantik descriptor. Perbedaannya relevan untuk pengiriman signal, pemantauan exit, dan event loop yang menyimpan handle proses selama pekerjaan asinkron berlangsung.

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

pidfd Linux Mengubah Identitas Proses Menjadi Handle yang Dapat Dipantau

PID Linux adalah angka dari namespace yang dapat digunakan ulang. pidfd berbeda: ia adalah file descriptor yang merujuk ke proses tertentu. Perbedaan itu mengubah pengelolaan proses dari lookup berulang berdasarkan nama numerik menjadi operasi terhadap handle yang dipertahankan kernel dan identitasnya tidak diam-diam berpindah ketika PID didaur ulang. Perbedaannya paling terlihat pada supervisor, launcher, sandbox, dan service manager yang mempertahankan referensi proses melintasi pekerjaan asynchronous. PID numerik dapat tetap valid secara sintaksis setelah proses asli keluar, tetapi kemudian mengidentifikasi proses lain. pidfd menjaga referensi tetap terikat pada objek proses asli dan juga dapat berpartisipasi dalam event loop berbasis descriptor.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

openat2 Membatasi Resolusi Path pada Batas Lookup

Sebuah pathname dapat dimulai di bawah direktori tepercaya tetapi tetap keluar dari subtree tersebut selama resolusi. Komponen .., symbolic link, magic link, atau perpindahan mount dapat mengubah objek yang akhirnya dicapai meskipun directory file descriptor awal berasal dari lokasi tepercaya. Linux openat2() menempatkan constraint langsung di dalam resolusi pathname, sehingga kernel dapat menolak lookup yang melanggar batas yang dipilih. Perilaku ini berbeda dari memeriksa string pathname sebelum memanggil open(). Resolusi path bekerja terhadap objek filesystem dan state namespace, bukan hanya teks. openat2() memperluas model openat() dengan struct open_how yang memiliki field resolve untuk mengendalikan traversal komponen pathname.

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

Notifikasi seccomp Linux Memisahkan Entri Syscall dari Respons Supervisor

Filter seccomp dapat menghentikan sebuah task pada entri syscall dan mengubah kejadian itu menjadi pesan untuk process lain. Dengan SECCOMP_RET_USER_NOTIF, kernel tidak langsung menjalankan syscall yang dipilih. Kernel membuat notifikasi untuk listener, memblokir task pemanggil, lalu menunggu respons yang dapat memberikan nilai balik, menginjeksi file descriptor, atau mengizinkan syscall berlanjut. Batas ini lebih sempit daripada emulasi syscall umum. Notifikasi membawa metadata syscall dan nilai argumen register, sedangkan memori yang dirujuk argumen pointer tetap berada di process target. Target juga dapat berhenti atau notifikasinya menjadi tidak valid saat supervisor sedang mengambil keputusan. Sifat tersebut menjadikan identitas, kepemilikan memori, dan waktu respons sebagai bagian dari kontrak interface.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Linux userfaultfd Mengubah Page Fault Menjadi Protokol Userspace

Sebuah thread dapat mengakses alamat virtual yang valid lalu berhenti sebelum akses tersebut selesai karena komponen userspace lain diberi tanggung jawab untuk menyelesaikan page fault. Dengan Linux userfaultfd, rentang memori tertentu dapat mengubah fault menjadi pesan descriptor sementara thread yang mengalami fault tetap tertahan sampai operasi resolusi yang sesuai memungkinkan eksekusi berlanjut. Mekanisme ini bukan pengganti subsistem virtual memory kernel. Kernel tetap mendeteksi fault, memvalidasi rentang yang terdaftar, menahan jalur eksekusi yang terdampak, dan menjalankan operasi page table yang diminta manager. Batas yang berbeda terletak pada partisipasi userspace dalam menentukan kapan dan dengan isi apa sebuah fault diselesaikan.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Linux timerfd Membuat Periode Terlewat Terlihat sebagai Hitungan Expiration

Linux timerfd periodik dapat mengalami beberapa expiration sebelum event loop kembali berjalan. read() berhasil berikutnya tidak sekadar melaporkan bahwa timer telah aktif; operasi itu mengembalikan hitungan unsigned 64-bit untuk expiration yang terakumulasi sejak read berhasil sebelumnya atau sejak timer terakhir dikonfigurasi. Dispatch yang tertunda dengan demikian terlihat sebagai hitungan, bukan rangkaian record timer yang diantrekan. Kontrak tersebut memisahkan jadwal timer dari eksekusi consumer. Sebuah proses dapat kehilangan jatah CPU untuk sementara, event loop dapat menghabiskan waktu pada descriptor lain, atau beberapa periode dapat berlalu sebelum timerfd dikonsumsi. Kernel melacak expiration, sedangkan kode aplikasi menentukan arti beberapa expiration bagi pekerjaan yang terkait dengannya.

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

Linux splice Menjadikan Pipe sebagai Batas Transfer Data Kernel

splice() dapat memindahkan byte antara dua file descriptor tanpa terlebih dahulu menyalin payload ke buffer userspace, tetapi antarmukanya mengharuskan setidaknya satu endpoint berupa pipe. Syarat ini menjadikan pipe lebih dari sekadar transport perantara. Pipe adalah batas buffer yang terlihat oleh kernel, tempat semantik offset, blocking, kapasitas, dan partial progress operasi tersebut dibentuk. Hal ini berbeda dari read() yang diikuti write(). Pada urutan tersebut, userspace memiliki array byte perantara dan dapat memeriksa atau mengubahnya. Dengan splice(), payload dapat tetap berada di storage yang dikelola kernel sementara proses mengoordinasikan perpindahan antar-endpoint.

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

Linux openat2 Menjadikan Kebijakan Resolusi Path Bagian dari Operasi Open

Pathname bukan referensi objek. Pathname merupakan instruksi untuk menelusuri namespace yang dapat berubah, sementara task lain dapat mengubah directory entry, symbolic link, atau mount pada saat traversal tersebut relevan bagi aplikasi. Linux openat2() menangani batas ini dengan menempatkan constraint resolusi path di dalam operasi kernel yang sama dengan operasi yang mengembalikan file descriptor. Penempatan tersebut penting ketika program menerima pathname tetapi bermaksud membatasi resolusi pada sebuah tree direktori. Urutan di user space yang memeriksa komponen lalu memanggil open() memisahkan validasi dari penggunaan. openat2() dapat menjadikan aturan traversal terpilih sebagai bagian dari lookup itu sendiri.

Rekayasa Perangkat Lunak 17 Sep 2026 8 min read

Linux openat2 Membuat Batas Resolusi Path Menjadi Atomik

Sebuah pathname dapat menunjuk ke objek yang berbeda ketika lookup kedua dilakukan. Di Linux, openat2() menangani batas ini dengan menempelkan aturan resolusi pada operasi kernel yang sama dengan operasi yang menelusuri pathname dan membuka objek hasilnya. Kebijakan dievaluasi selama lookup berlangsung, bukan disimpulkan dari pathname yang diperiksa sebelum atau sesudah file dibuka. Perbedaan ini penting ketika proses menerima komponen path dari sumber yang kurang tepercaya tetapi ingin memastikan resolusi tetap berada di dalam direktori tertentu, menolak symbolic link, mencegah perpindahan mount, atau mewajibkan lookup yang hanya memakai cache. Objek yang penting bukan hanya string input, melainkan hasil resolusi string tersebut terhadap namespace aktif yang isi direktori, link, dan mount-nya dapat berubah secara bersamaan.

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

Linux O_TMPFILE Menjaga File Staging di Luar Namespace

Linux O_TMPFILE membuat regular file tanpa lebih dulu menempatkan nama file tersebut di sebuah direktori. Pemanggil menerima file descriptor dan dapat menulis data, menetapkan metadata, atau membatalkan objek saat belum ada pathname yang mengekspos file yang baru disiapkan sebagian. Jika publikasi diperlukan, operasi link berikutnya dapat memasang directory entry pada inode yang sama. Mekanisme ini memisahkan konstruksi objek dari publikasi namespace. Mekanisme tersebut tidak membuat seluruh operasi filesystem di sekitarnya menjadi transaksional, dan tidak menyediakan semantik penggantian untuk tujuan yang sudah ada. Batas manfaatnya lebih sempit: state file perantara dapat tetap terjangkau hanya melalui referensi terbuka sampai proses secara eksplisit membuat nama.

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

Linux mmap Memisahkan Masa Hidup Mapping dari File Descriptor

mmap() berbasis file yang berhasil membuat mapping virtual memory yang tidak bergantung pada file descriptor sumber agar tetap terbuka. Linux secara eksplisit mengizinkan descriptor ditutup segera setelah mmap() selesai tanpa membatalkan mapping. Mapping dan descriptor dengan demikian merupakan referensi terpisah dengan masa hidup yang terpisah. Pemisahan ini mudah terlewat karena keduanya berasal dari file terbuka yang sama. Dampaknya menjadi penting ketika kode menutup descriptor secara agresif, mengganti pathname, melakukan truncate pada file, atau membawa mapping melewati fork(). Alamat mapped bukan read() tertunda melalui descriptor awal; alamat tersebut beroperasi dalam virtual-memory system dengan kontrak mapping tersendiri.

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

Linux memfd Seals Mengubah Byte Mutable Menjadi Kontrak yang Ditegakkan Kernel

Sebuah memfd dapat dimulai sebagai anonymous file yang writable lalu menolak kelas mutasi tertentu melalui seal yang ditegakkan kernel. Transisi ini melekat pada inode, bukan pada satu descriptor, sehingga proses tidak dapat mempertahankan duplicate descriptor tanpa pembatasan untuk melewati seal yang dipasang melalui referensi lain. Sifat tersebut berbeda dari memberikan descriptor dengan mode akses yang lebih sempit kepada komponen lain. Mode akses descriptor membatasi satu open file description. Seal mengubah operasi yang diizinkan kernel terhadap file itu sendiri, termasuk operasi melalui descriptor lain yang merujuk inode yang sama.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Linux io_uring Memisahkan Submission dari Kepemilikan Completion

Linux io_uring Memisahkan Submission dari Kepemilikan Completion Sebuah request io_uring dapat tetap in flight setelah aplikasi selesai membentuk submission queue entry. Kondisi ini menciptakan batas lifetime yang tidak ada pada call sinkron sederhana: metadata request dapat menjadi stabil saat submission, sedangkan memori yang menjadi payload I/O masih dapat diakses sampai operasi selesai. Completion queue karena itu bukan sekadar kanal hasil. Untuk banyak operasi, completion menandai titik ketika state operasi milik aplikasi dapat di-reclaim atau digunakan kembali.

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

Linux eventfd Menggabungkan State Counter dengan Readiness Descriptor

Objek eventfd menggabungkan counter unsigned 64-bit yang dikelola kernel dengan readiness file descriptor. Sebuah write menambahkan nilai ke counter ketika penambahan itu diizinkan; sebuah read mengonsumsi state counter. Karena objek yang sama dapat dipakai oleh poll(), select(), dan epoll(), transisi counter juga dapat menjadi notifikasi event loop tanpa byte stream atau lapisan framing pesan. Antarmuka ringkas ini memiliki semantik yang tegas. Read default menguras nilai saat ini menjadi nol, read dengan EFD_SEMAPHORE mengonsumsi satu unit, write dapat blocking saat counter mendekati batas, dan readiness menunjukkan operasi yang dapat berjalan, bukan jumlah event logis yang dipetakan aplikasi ke counter.

Rekayasa Perangkat Lunak 17 Sep 2026 7 min read

Linux Direct I/O Menjadikan Alignment Bagian dari Antarmuka File

Membuka regular file dengan O_DIRECT dapat membuat alamat user-space buffer, file offset, dan panjang transfer menjadi bagian yang terlihat dari antarmuka file. read() atau write() yang secara lain valid dapat gagal dengan EINVAL ketika salah satu nilai tersebut melanggar constraint direct I/O untuk file itu. Pada kombinasi filesystem dan perilaku kernel tertentu, operasi yang misaligned dapat beralih ke buffered I/O. Batas ini mudah terlewat karena buffered file I/O biasa sebagian besar menyembunyikan geometri transfer fisik. Page cache dan filesystem dapat menerima application buffer pada alamat arbitrer lalu memediasi transfer secara internal. Direct I/O mengurangi mediasi tersebut, sehingga constraint yang biasanya berada di bawah batas system call dapat menjadi requirement untuk memory aplikasi dan bentuk request.

Rekayasa Perangkat Lunak 17 Sep 2026 7 min read

Linux copy_file_range Memisahkan Semantik Penyalinan dari Implementasi Transfer

Linux copy_file_range Memisahkan Semantik Penyalinan dari Implementasi Transfer Pemanggilan copy_file_range() yang berhasil melaporkan jumlah byte, bukan janji mengenai jalur fisik yang ditempuh byte tersebut. Linux dapat memenuhi permintaan melalui akselerasi spesifik filesystem, jalur transfer di dalam kernel, atau implementasi lain yang diizinkan interface filesystem aktif. Aplikasi memperoleh operasi penyalinan range dengan semantik offset dan nilai balik yang terdefinisi; aplikasi tidak memperoleh jaminan bahwa blok storage diduplikasi secara fisik. Batas ini penting pada replikasi file, staging backup, pengisian cache, dan pemindahan object lokal. Kode yang memperlakukan pemanggilan ini hanya sebagai versi lebih cepat dari loop read() dan write() dapat melewatkan properti yang tampak pada batas API: short copy sah, sparse hole dapat berubah menjadi data teralokasi, dukungan lintas filesystem bersifat kondisional, dan implementasi filesystem dapat memanfaatkan sharing copy-on-write.

Rekayasa Perangkat Lunak 17 Sep 2026 4 min read

io_uring Multishot Accept Mempertahankan Satu Request untuk Banyak Koneksi

Satu request io_uring multishot accept di Linux dapat menghasilkan beberapa completion queue entry dari satu submission queue entry. Kernel mempertahankan operasi accept setelah completion yang sukses ketika CQE membawa IORING_CQE_F_MORE, sehingga server tidak perlu mengirim SQE accept baru untuk setiap koneksi. Perilaku ini mengubah kontrak lifetime antara submission dan completion. Request oneshot normal selesai setelah CQE-nya. Multishot accept dapat tetap in-flight melewati banyak koneksi yang diterima, dan flag pada CQE menentukan apakah request tersebut masih ada.

Rekayasa Perangkat Lunak 17 Sep 2026 7 min read

File-Backed Mapping Dapat Bertahan Lebih Lama daripada Ukuran File yang Diasumsikan

Sebuah proses dapat mempertahankan virtual memory mapping yang valid setelah pihak lain memperpendek file yang dipetakan. Rentang alamatnya masih ada di dalam proses, tetapi backing object mungkin tidak lagi memiliki setiap page yang sebelumnya direpresentasikan oleh rentang tersebut. Pada sistem POSIX, akses ke satu page terpetakan penuh yang berada di luar akhir file baru dapat menghasilkan SIGBUS, bukan berperilaku seperti pembacaan file biasa yang gagal. Batas ini membuat file-backed mmap() berbeda dari menyalin byte ke private heap storage. Pointer ke dalam mapping bukan bukti bahwa extent file yang sesuai masih ada. Alamat virtual, lifetime mapping, identitas file, dan ukuran file saat ini merupakan state yang saling berkaitan, tetapi bukan satu objek yang tidak dapat dipisahkan.

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

Event Linux inotify Merupakan Aliran Perubahan yang Dapat Kehilangan Data

File descriptor inotify memaparkan aktivitas filesystem sebagai antrean terurut berisi record event, tetapi antrean tersebut bukan riwayat otoritatif atas state namespace. Event identik yang belum dibaca dapat digabungkan, kapasitas antrean terbatas, dan overflow secara eksplisit berarti sejumlah event telah hilang. Proses yang memperlakukan aliran ini sebagai transaction log lengkap dapat mempertahankan state yang tidak lagi sesuai dengan filesystem. Model yang lebih tepat adalah notifikasi perubahan dengan kewajiban pemulihan. Event dapat menjaga cache tetap mutakhir secara inkremental selama alirannya utuh; kondisi tertentu memutus riwayat inkremental tersebut dan menuntut rekonsiliasi terhadap state filesystem.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

EPOLLET Melaporkan Transisi Readiness, Bukan Pengosongan Buffer

Dengan EPOLLET, sebuah file descriptor dapat tetap memiliki data yang belum dibaca setelah event readiness-nya sudah dikonsumsi. Pemanggilan epoll_wait() berikutnya tidak wajib melaporkan descriptor itu lagi hanya karena state readable sebelumnya masih bertahan. Perilaku ini merupakan batas utama edge-triggered epoll: notifikasi mengikuti perubahan readiness, sedangkan objek I/O di bawahnya mempertahankan state sendiri secara terpisah. Readiness dan pengiriman event merupakan state terpisah Sebuah epoll instance memiliki interest list dan ready list. Registrasi melalui epoll_ctl() menentukan open file description yang dipantau dan kelas event yang relevan. epoll_wait() mengembalikan entry yang sudah mencapai ready list.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Edge Triggering Linux epoll Melaporkan Transisi Readiness, Bukan Unit Kerja

Edge Triggering Linux epoll Melaporkan Transisi Readiness, Bukan Unit Kerja Dengan EPOLLET, sebuah interest epoll tidak berperilaku seperti antrean yang berisi satu event untuk setiap byte, paket, koneksi, atau pesan aplikasi. Mekanisme ini melaporkan perubahan status readiness. Setelah sebuah file descriptor berada dalam status ready, pekerjaan tambahan dapat terakumulasi tanpa menghasilkan edge lain yang dapat diandalkan aplikasi. Handler karena itu perlu mengonsumsi pekerjaan yang tersedia sampai operasi nonblocking melaporkan bahwa progres berikutnya akan memblokir.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Counter eventfd Menggabungkan Notifikasi Sebelum Read

Sebuah eventfd Linux dapat menerima beberapa write sebelum consumer berjalan, tetapi descriptor tersebut tidak menyimpan setiap write sebagai pesan terpisah. Setiap write yang diterima menambahkan nilai unsigned 64-bit ke counter yang dikelola kernel. Tanpa EFD_SEMAPHORE, satu read yang berhasil mengembalikan nilai counter saat itu lalu meresetnya menjadi nol. Perilaku tersebut membuat eventfd menjadi primitive notifikasi berbasis counter, bukan message queue. Readiness menyatakan bahwa counter tidak nol; readiness tidak mempertahankan jumlah operasi write, urutan, atau boundary setiap write.

Rekayasa Perangkat Lunak 17 Sep 2026 3 min read

Cookie Rename inotify Mengorelasikan Event Move Tanpa Membuatnya Atomik

Sebuah rename() di Linux yang diamati melalui inotify dapat menghasilkan dua record dengan cookie nonzero yang sama: IN_MOVED_FROM untuk directory entry lama dan IN_MOVED_TO untuk entry baru. Cookie tersebut mengorelasikan kedua record, tetapi tidak mengubahnya menjadi satu item queue yang atomik. Batas ini penting bagi perangkat lunak yang memelihara indeks pathname, menyinkronkan state direktori, atau mengubah notifikasi filesystem menjadi record perubahan tingkat lebih tinggi. Rename merupakan satu operasi filesystem, sedangkan representasinya di inotify dapat berupa pasangan dengan properti pengelompokan delivery yang lebih lemah.

Rekayasa Perangkat Lunak 16 Sep 2026 6 min read

Negative Caching DNS Dapat Bertahan Setelah Record Dibuat

Recursive DNS resolver dapat terus mengembalikan hasil ketiadaan lama setelah authoritative zone memperoleh nama yang diminta. Record baru dan negative answer yang tersimpan di cache tidak saling bertentangan: keduanya berada pada titik berbeda dalam jalur resolution, dan cache tetap valid sampai negative TTL berakhir atau policy lokal menghapusnya lebih cepat. Perilaku ini memberi ketiadaan DNS lifetime cache tersendiri. Menerbitkan record mengubah state authoritative, tetapi tidak secara sinkron membatalkan negative entry yang sudah tersimpan pada recursive resolver.