Langsung ke konten

Topic archive

Rekayasa Perangkat Lunak

Rekayasa Perangkat Lunak membahas developer tooling, arsitektur, maintainability, workflow engineering, protokol, dan praktik yang meningkatkan cara perangkat lunak dirancang dan dibangun.

183 articles
Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Seal Linux memfd Mengubah Status File Mutable Menjadi Kontrak Terbatas

Seal Linux memfd Mengubah Status File Mutable Menjadi Kontrak Terbatas File yang dikembalikan memfd_create() bermula sebagai status file mutable pada penyimpanan berorientasi memori, tetapi Linux dapat menghapus operasi mutasi dari file tersebut secara bertahap. Saat pembuatan memakai MFD_ALLOW_SEALING, fcntl() dengan F_ADD_SEALS dapat melarang penyusutan, pertumbuhan, penulisan, penulisan pada masa berikutnya, atau perubahan lanjutan terhadap kumpulan seal. Pembatasan itu melekat pada inode, bukan pada satu descriptor, sehingga pemindahan descriptor lain untuk objek yang sama tidak memulihkan operasi yang telah dihapus oleh seal.

Rekayasa Perangkat Lunak 17 Sep 2026 4 min read

renameat2 RENAME_EXCHANGE Menukar Dua Path dalam Satu Operasi Filesystem

renameat2() dengan RENAME_EXCHANGE mengubah dua directory entry yang sudah ada sebagai satu operasi rename atomik. Sebelum pemanggilan, setiap pathname mengarah ke objek asalnya; setelah pemanggilan berhasil, setiap pathname mengarah ke objek yang sebelumnya memakai path satunya. Tidak ada keadaan sukses antara kedua titik itu ketika salah satu nama hanya terhapus atau tertimpa. Sifat ini berbeda dari rename() biasa. Rename konvensional dapat mengganti destination secara atomik, tetapi replacement menghilangkan nama destination dari namespace. Exchange mempertahankan kedua objek bernama dan menukar posisi keduanya.

Rekayasa Perangkat Lunak 17 Sep 2026 4 min read

Read pada Linux timerfd Melaporkan Akumulasi Expiration

timerfd periodik pada Linux dapat mengalami beberapa expiration sebelum event loop membacanya. read() berikutnya yang berhasil tidak mengembalikan satu record untuk setiap wakeup. Operasi itu mengembalikan satu uint64_t dalam byte order host yang berisi jumlah expiration yang terakumulasi sejak timer terakhir di-arm atau sejak read berhasil sebelumnya. Count tersebut menjadikan readiness timerfd sebagai notifikasi bahwa status timer dapat dikonsumsi, bukan pemetaan satu-ke-satu antara wakeup scheduler dan periode timer. Read mengonsumsi count expiration yang terakumulasi timerfd yang dibuat dengan timerfd_create() merepresentasikan satu timer kernel melalui file descriptor. timerfd_settime() menetapkan expiration awal pada it_value dan, untuk timer periodik, it_interval yang bukan nol.

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 5 min read

Linux signalfd Mengubah Sinyal Pending Menjadi Status Readable

Proses Linux dapat memblokir sinyal tertentu lalu menerimanya dengan membaca file descriptor alih-alih menjalankan handler asinkron. signalfd() membuat sinyal pending tersebut terlihat melalui antarmuka readiness yang sama dengan socket, pipe, dan descriptor lain, termasuk poll() dan epoll. Konversi ini bukan pengganti signal masking. Descriptor memiliki himpunan sinyal sendiri, sementara setiap thread tetap memiliki signal mask yang mengendalikan delivery biasa. Desain yang konsisten bergantung pada keselarasan kedua status tersebut. Descriptor mengamati sinyal pending dari himpunan tertentu signalfd baru dibuat dengan sebuah himpunan sinyal:

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

Linux signalfd Memindahkan Delivery Signal ke Readiness File Descriptor

Linux signalfd Memindahkan Delivery Signal ke Readiness File Descriptor signalfd() mengubah antarmuka konsumsi untuk signal Linux tertentu. Alih-alih mengatur agar asynchronous signal handler berjalan saat signal tersebut dikirim, sebuah proses dapat memblokir signal lalu menerima informasinya dengan membaca file descriptor. Descriptor itu dapat dipantau melalui poll(), epoll, dan mekanisme readiness terkait, sehingga penanganan signal dapat memakai batas dispatch yang sama dengan socket, pipe, timer, dan objek pollable lain. Mekanisme ini tidak menggantikan semantik signal Linux. Pembentukan signal, delivery yang diarahkan ke proses atau thread, mask, pending state, serta aturan antrean standard signal dan real-time signal tetap berlaku. signalfd mengubah antarmuka untuk mengonsumsi signal yang berstatus pending dan termasuk dalam mask miliknya.

Rekayasa Perangkat Lunak 17 Sep 2026 4 min read

Linux pidfd Mengikat Identitas Proses ke File Descriptor

PID numerik adalah nama dari namespace kernel yang dapat digunakan kembali. Setelah sebuah proses keluar dan PID-nya tersedia lagi, proses lain dapat menerima nomor yang sama. Linux pidfd menyediakan bentuk referensi berbeda: file descriptor yang terikat pada task tertentu, bukan nomor yang harus diresolusi ulang pada setiap operasi. Perbedaan ini mengubah batas antara penemuan proses dan kontrol proses berikutnya. Program dapat meresolusi PID sekali melalui pidfd_open(), menyimpan descriptor hasilnya, lalu memakai antarmuka berbasis pidfd tanpa menganggap PID numerik sebagai identitas permanen.

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 5 min read

Linux eventfd Membuat Status Counter Dapat Dipantau

Linux eventfd dapat menggabungkan banyak notifikasi ke dalam satu counter yang dikelola kernel sambil tetap dapat digunakan dengan poll(), select(), dan epoll. Writer menambahkan nilai unsigned 64-bit ke counter; readiness menyatakan apakah status tersebut dapat dikonsumsi. Interface ini membawa status aritmetika, bukan byte stream atau antrean pesan individual. Perbedaan tersebut penting pada batas proses dan thread. Sebuah wakeup menyatakan bahwa counter bukan nol. Wakeup itu tidak mempertahankan jumlah operasi write, identitas writer, atau urutan di antara sumber notifikasi yang terpisah.

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.