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 18 Sep 2026 5 min read

Linux renameat2 Membuat Kebijakan Penggantian Path Bersifat Atomik

Rename pathname mengubah entri direktori sementara file descriptor yang sudah terbuka tetap merujuk ke objek dasar yang sama. Linux renameat2() menambahkan kebijakan pada pembaruan namespace tersebut: pemanggil dapat menolak penggantian, menukar dua nama yang sudah ada, atau meminta whiteout untuk operasi union filesystem. Kebijakan ini dijalankan sebagai bagian dari operasi rename, bukan sebagai pemeriksaan terpisah di userspace. Interface ini khusus Linux. Argumen flags bernilai nol memberikan perilaku renameat(), sedangkan flag nonnol menambahkan semantik Linux yang juga bergantung pada dukungan filesystem yang di-mount.

Rekayasa Perangkat Lunak 18 Sep 2026 6 min read

Linux pidfd Mengikat Operasi Proses ke Referensi Kernel yang Stabil

Process ID numerik adalah nama di dalam PID namespace, bukan handle permanen untuk satu masa hidup proses. Setelah proses berhenti dan PID-nya tersedia untuk dipakai kembali, proses lain dapat memperoleh nomor yang sama. PID file descriptor di Linux menyediakan batas antarmuka berbeda: sebuah pidfd adalah file descriptor yang merujuk ke task tertentu, sehingga operasi berikutnya dapat menargetkan referensi kernel tersebut tanpa meresolusi PID numerik lagi. Perbedaan ini relevan pada supervisor, service manager, launcher, dan kode lain yang bertindak terhadap proses setelah suatu jeda. Persoalannya bukan bahwa penggunaan PID selalu tidak aman. PID numerik dan referensi objek yang dipertahankan memiliki semantik masa hidup yang berbeda.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

Linux pidfd Mengikat Operasi Proses ke Identitas Kernel yang Stabil

PID numerik menamai proses melalui lookup dalam namespace. Nomor tersebut dapat dipakai kembali setelah proses berakhir dan sudah di-reap. PID file descriptor pada Linux mengubah batas ini: sebuah pidfd adalah file descriptor yang merujuk ke task tertentu, sehingga operasi berikutnya dapat menargetkan referensi tersebut tanpa melakukan resolusi PID numerik lagi. Perilaku manajemen proses ini khusus Linux. Perilaku tersebut bukan properti identifier proses POSIX ataupun bahasa C. PID numerik adalah nama, bukan handle permanen Jalur kontrol yang umum menyimpan PID, menunggu kondisi eksternal, lalu memanggil kill(pid, sig). Kedua operasi itu terpisah oleh waktu. Jika proses awal telah berakhir dan PID-nya sudah didaur ulang sebelum operasi signal, lookup numerik baru dapat menunjuk proses yang berbeda.

Rekayasa Perangkat Lunak 18 Sep 2026 5 min read

Linux openat2 Membatasi Resolusi Path di Dalam Batas Direktori

Pathname yang diberikan ke openat2() dapat diresolusikan relatif terhadap file descriptor direktori sambil meminta kernel menegakkan batas pada proses resolusi itu sendiri. Perbedaan ini penting saat proses menerima komponen path dari sumber dengan tingkat kepercayaan lebih rendah. Pemeriksaan string dapat memeriksa teks pathname, tetapi pemeriksaan itu sendiri tidak dapat membekukan namespace filesystem selama lookup berlangsung. openat2() menempatkan kebijakan bersama operasi lookup. struct open_how memisahkan flag open biasa dari flag resolve yang membatasi traversal. Batas yang dihasilkan berkaitan dengan semantik resolusi, bukan sekadar bentuk teks sebuah path.

Rekayasa Perangkat Lunak 18 Sep 2026 5 min read

Linux O_PATH Memisahkan Referensi Objek dari Otoritas I/O

open() biasanya menggabungkan dua efek: resolusi pathname memilih objek sistem file, lalu file descriptor yang dihasilkan membawa mode akses untuk I/O data. Linux O_PATH memisahkan kedua efek tersebut. open(path, O_PATH) yang berhasil menghasilkan descriptor yang merujuk objek terpilih, sementara read() dan write() biasa melalui descriptor itu tidak diizinkan. Pemisahan ini berguna ketika proses memerlukan referensi kernel yang tahan terhadap perubahan nama untuk operasi metadata atau operasi relatif terhadap pathname, tanpa membuka objek untuk transfer data. Analisis race juga berubah: operasi berikutnya dapat dimulai dari descriptor, bukan melakukan resolusi ulang terhadap pathname awal.

Rekayasa Perangkat Lunak 18 Sep 2026 5 min read

Linux inotify Melaporkan Event Entri Direktori, Bukan Identitas Path yang Persisten

Sebuah watch inotify tidak menjadikan pathname sebagai identifier yang persisten. Linux menempelkan watch pada objek filesystem yang dipilih saat inotify_add_watch() berhasil, lalu menghasilkan record yang mendeskripsikan aktivitas terkait objek yang dipantau dan entri direktori. Nama dapat berpindah, objek dapat hilang, dan detail event dapat terlewat ketika queue mengalami overflow. Batas ini relevan bagi file synchronizer, pemuat ulang konfigurasi, indexer, dan service supervisor. Event stream dapat memberi sinyal bahwa state filesystem lokal berubah, tetapi rekonstruksi state yang otoritatif tetap bergantung pada operasi filesystem yang dilakukan setelah event diterima.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

Linux eventfd Merepresentasikan State Counter melalui Readiness Descriptor

Objek eventfd menyimpan counter unsigned 64-bit di kernel dan mengekspos state tersebut melalui file descriptor. Operasi write menambah counter dalam batas yang ditentukan; operasi read mengonsumsi state counter; antarmuka readiness menunjukkan apakah suatu operasi dapat berjalan tanpa blocking. Hasilnya adalah batas sinkronisasi ringkas yang cocok dengan event loop berbasis descriptor tanpa mengubah counter menjadi byte stream. Antarmuka ini khusus Linux. Jaminannya berasal dari kontrak system call eventfd dan semantik descriptor kernel, bukan dari bahasa C atau POSIX.

Rekayasa Perangkat Lunak 18 Sep 2026 7 min read

Linux copy_file_range Memisahkan Semantik Penyalinan dari Pergerakan Data

copy_file_range() meminta Linux menyalin byte di antara regular file tanpa mengharuskan aplikasi memindahkan byte tersebut melalui buffer user space. Pemanggilan ini mendefinisikan operasi rentang byte, tetapi tidak menentukan mekanisme transfer fisiknya. Filesystem dapat melakukan pergerakan data biasa, memakai mekanisme sharing copy-on-write seperti reflink, atau memakai jalur akselerasi lain yang didukung sambil mempertahankan isi file yang terlihat sesuai operasi tersebut. Pemisahan itu merupakan batas utama API. Aplikasi menentukan rentang sumber dan tujuan lalu mengamati jumlah byte yang dikembalikan. Kernel dan filesystem tetap memiliki keleluasaan untuk memilih mekanisme yang merealisasikan salinan.

Rekayasa Perangkat Lunak 18 Sep 2026 7 min read

Linux close_range Menjadikan Pembersihan Tabel Descriptor sebagai Operasi Rentang

Proses yang bersiap mengeksekusi program lain sering memerlukan invariant descriptor yang sederhana: standard input, output, dan error tetap tersedia, sedangkan descriptor yang tidak terkait tidak melewati batas eksekusi. Menutup descriptor satu per satu dapat mengubah invariant tersebut menjadi persoalan enumerasi. Linux close_range() menerapkan operasi pada interval numerik inklusif di tabel file descriptor milik task pemanggil. Antarmukanya kecil, tetapi semantiknya menjangkau sharing tabel descriptor, pewarisan melalui execve(), alokasi descriptor secara concurrent, dan transisi privilege. Flag yang dipilih menentukan lebih dari strategi implementasi: flag tersebut menetapkan apakah descriptor langsung hilang, menjadi close-on-exec, atau terlebih dahulu dipisahkan dari tabel yang dibagi dengan task lain.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

Linux close_range Menjadikan Pembersihan Descriptor sebagai Operasi Tabel

Proses yang bersiap menjalankan execve() sering memerlukan invariant sederhana: descriptor di atas allowlist kecil tidak boleh bertahan ke program baru. Menutup nomor descriptor satu per satu mengubah invariant tersebut menjadi masalah enumerasi. Linux close_range() menyatakannya langsung sebagai operasi pada interval inklusif di tabel file descriptor milik task pemanggil. Interface ini khusus Linux. Perilakunya berasal dari semantik file table dan system call Linux, bukan dari bahasa C atau jaminan POSIX yang portabel.

Rekayasa Perangkat Lunak 18 Sep 2026 3 min read

Link io_uring Menserialkan Request yang Saling Bergantung

Dua submission queue entry io_uring yang bersebelahan pada kondisi normal merupakan request independen. Menetapkan IOSQE_IO_LINK pada entry pertama mengubah hubungan itu: request berikutnya tidak mulai sebelum request yang ditautkan selesai. Pengulangan flag tersebut membentuk rantai berurutan di dalam satu batch submission. Sifat pengurutan ini lebih sempit daripada serialisasi queue secara global. Request di luar rantai tetap dapat berjalan secara independen, dan rantai terpisah dapat berjalan tumpang tindih. Sebuah link dengan demikian menyatakan dependensi antar-SQE tertentu, bukan memasang barrier pada seluruh ring.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

Handled Rights Landlock Menetapkan Batas Sandbox Deny-by-Default

Sebuah ruleset Landlock tidak otomatis menolak setiap operasi yang dikenal kernel. Ruleset terlebih dahulu menyatakan access rights yang ditanganinya. Setelah ruleset diberlakukan, action yang ditangani tersebut ditolak secara default kecuali rule yang cocok memberinya izin. Batas eksplisit ini menjadi bagian penting dari kompatibilitas Landlock. User space dapat membatasi rights yang dikenal dan telah diuji, sementara kernel yang lebih baru dapat menyediakan rights tambahan yang tidak pernah disebut binary lama. Handled rights memilih kumpulan action yang dibatasi landlock_create_ruleset() menerima landlock_ruleset_attr dengan access mask yang menentukan action yang dikontrol ruleset baru.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

eventfd Mengubah Status Counter Menjadi Readiness Descriptor

Descriptor eventfd menjadi readable saat counter yang dipelihara kernel bernilai lebih besar dari nol. Sebuah write tidak memasukkan pesan dengan panjang variabel ke antrean. Operasi itu menambahkan nilai unsigned 64-bit ke counter, sehingga status notifikasi yang terakumulasi tampil sebagai readiness file descriptor biasa. Batas ini berguna ketika thread atau fasilitas kernel perlu membangunkan event loop tanpa membentuk protokol byte stream. Status yang dibawa descriptor sengaja sempit: sebuah counter, kondisi readiness, dan dua pilihan semantik konsumsi.

Rekayasa Perangkat Lunak 18 Sep 2026 5 min read

EPOLLEXCLUSIVE Membatasi Wakeup di Antara Instance epoll yang Bersaing

EPOLLEXCLUSIVE mengubah waiter epoll mana yang dibangunkan saat beberapa instance epoll memantau target yang sama. Tanpa flag ini, sebuah readiness event dapat dikirim ke setiap instance epoll yang terpasang. Dengan registrasi eksklusif, Linux dapat membangunkan subset yang lebih kecil sehingga scheduling redundan berkurang pada konfigurasi yang jika tidak demikian dapat memicu thundering herd. Flag ini mengubah distribusi wakeup. Ia tidak memberikan kepemilikan permanen atas target descriptor, tidak menserialisasi I/O, dan tidak menjamin tepat satu thread aplikasi mengonsumsi setiap unit pekerjaan.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

CLOSE_RANGE_UNSHARE Mengisolasi Pembersihan Tabel Descriptor

Sebuah thread yang bersiap melewati batas execve() dapat perlu menghapus seluruh file descriptor di atas sekumpulan kecil descriptor yang dipertahankan ketika thread lain masih memakai tabel descriptor yang sama. Penutupan descriptor satu per satu membuka race: thread lain dapat mengalokasikan descriptor baru ke interval tersebut saat pembersihan masih berjalan. Di Linux, close_range() dengan CLOSE_RANGE_UNSHARE mengubah batas pemakaian bersama tabel sebelum operasi range diterapkan. Perilaku ini penting karena nomor file descriptor hanya merupakan indeks pada tabel descriptor proses. Dengan CLONE_FILES, beberapa task dapat merujuk tabel yang sama, sehingga penutupan oleh satu task mengubah visibilitas descriptor bagi seluruh task yang berbagi tabel tersebut. CLOSE_RANGE_UNSHARE memberi task pemanggil tabel descriptor privat sebagai bagian dari operasi.

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

userfaultfd Memindahkan Resolusi Missing Page ke User Space

Sebuah thread dapat mengakses alamat virtual yang valid lalu berhenti sebelum akses selesai karena page tersebut belum memiliki backing yang present. Pada range yang didaftarkan dengan UFFDIO_REGISTER_MODE_MISSING, Linux dapat melaporkan fault itu melalui userfaultfd alih-alih menyelesaikannya sepenuhnya di kernel. Manager di user space kemudian menentukan isi page yang menjadi terlihat sebelum akses yang tertahan dilanjutkan. Mekanisme ini memindahkan kendali atas satu bagian penanganan page fault. Kernel tetap mendeteksi fault, memvalidasi virtual memory area, menahan eksekusi yang mengalami fault, dan memasang mapping melalui antarmuka UFFDIO_*. User space memperoleh kendali atas isi dan waktu resolusi untuk fault yang terdaftar.

Rekayasa Perangkat Lunak 17 Sep 2026 4 min read

timerfd Menghitung Ekspirasi melalui Read Descriptor

timerfd periodik dapat mengalami beberapa ekspirasi sebelum user space membacanya. read() sukses berikutnya tidak hanya melaporkan tick terbaru: operasi itu mengembalikan nilai unsigned 64-bit yang berisi jumlah ekspirasi sejak read sukses sebelumnya, atau sejak timer dikonfigurasi jika belum ada read yang selesai. Perilaku ini menjadikan timer sebagai objek event loop tanpa mengubah setiap ekspirasi menjadi signal. Descriptor menjadi readable ketika sedikitnya satu ekspirasi tertunda, dan descriptor yang sama dapat dipantau oleh poll(), select(), atau epoll() bersama socket, pipe, dan sumber event berbasis descriptor lainnya.

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

SO_REUSEPORT Memindahkan Distribusi Koneksi TCP ke Kernel

Dengan SO_REUSEPORT, beberapa socket TCP Linux dapat listen pada alamat lokal dan port yang sama secara bersamaan. Koneksi masuk ditetapkan ke salah satu anggota reuseport group sebelum aplikasi memanggil accept(). Aplikasi tidak lagi membutuhkan satu listening socket bersama sebagai satu-satunya titik handoff antara network stack dan banyak worker. Perubahan ini lebih dari sekadar kelayakan bind(). Distribusi koneksi dipindahkan ke kernel dan setiap listener memiliki identitas socket serta jalur accept sendiri. Arsitektur yang dihasilkan memiliki sifat queueing, lifecycle, dan routing yang berbeda dari desain ketika banyak worker berebut satu listening socket.

Rekayasa Perangkat Lunak 17 Sep 2026 4 min read

SO_REUSEPORT Membentuk Grup Socket dengan Seleksi oleh Kernel

Beberapa socket Linux dapat melakukan bind ke alamat lokal yang sama ketika setiap socket mengaktifkan SO_REUSEPORT sebelum bind(). Traffic masuk kemudian ditetapkan ke salah satu anggota reuseport group, bukan dikirim ke setiap socket. Alamat bersama tersebut menjadi batas seleksi oleh kernel, bukan endpoint broadcast. Perilaku ini mendukung receive loop atau accept loop yang berdiri sendiri tanpa memaksa seluruh pekerjaan melewati satu listening descriptor. Konsekuensinya juga jelas: keanggotaan grup dan kebijakan seleksi menentukan socket yang menerima packet atau connection.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

signalfd Mengubah Sinyal Pending Menjadi Record yang Dapat Dibaca

Sinyal yang masuk ke mask signalfd dapat membuat file descriptor menjadi readable alih-alih menjalankan handler asinkron, selama sinyal tersebut diblokir dari delivery biasa. read() yang berhasil kemudian mengonsumsi status sinyal pending dan mengembalikan satu atau beberapa record signalfd_siginfo. Perubahan ini mengganti antarmuka penerimaan untuk sinyal terpilih, tetapi tidak mengganti semantik signal Linux. Signal mask, delivery yang diarahkan ke process atau thread, penggabungan standard signal, serta status khusus SIGKILL dan SIGSTOP tetap menentukan batas perilaku descriptor.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

signalfd Mengonsumsi Signal yang Diblokir melalui Read Descriptor

Sebuah signalfd di Linux menjadi readable ketika signal yang dipilih oleh mask miliknya berstatus pending bagi konteks pembaca. read() yang berhasil tidak sekadar mengamati status tersebut: operasi itu mengonsumsi kemunculan signal yang dikembalikan dan menghapusnya dari status pending. Perilaku ini memberi signal jalur konsumsi berbasis descriptor. Mekanisme tersebut tidak mengubah subsistem signal menjadi byte stream, dan tidak menggantikan signal mask yang mengendalikan delivery biasa. Mask descriptor memilih signal pending yang memenuhi syarat signalfd() mengaitkan sebuah signal set dengan file descriptor. Ketika argumen pertama bernilai -1, Linux membuat objek signalfd baru. Jika descriptor signalfd yang sudah ada diberikan, mask pada objek tersebut diganti.

Rekayasa Perangkat Lunak 17 Sep 2026 7 min read

Shared Ring io_uring Menjadikan Memory Ordering Bagian dari ABI

Queue io_uring adalah shared memory yang diubah oleh dua domain eksekusi independen. User space menyiapkan submission entry dan memajukan metadata queue; kernel mengonsumsi submission tersebut lalu memublikasikan completion entry. Layout ring menghilangkan satu batas copy, tetapi pada saat yang sama membuat visibilitas memori menjadi bagian dari kontrak interface. Assignment biasa pada level source ke tail queue tidak cukup sebagai model publikasi yang portabel. Data entry harus terlihat lebih dulu sebelum nilai tail yang membuat entry tersebut boleh dikonsumsi. Di sisi completion, user space harus mengamati publikasi completion dari kernel sebelum membaca field di completion tersebut. Relasi ordering ini adalah bagian dari correctness, bukan sekadar detail optimasi.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Seccomp User Notification Mendelegasikan System Call Terpilih ke Supervisor

Sebuah system call yang dipilih oleh seccomp filter dapat berhenti sebelum dieksekusi kernel lalu muncul sebagai request pada notification file descriptor. Dengan SECCOMP_RET_USER_NOTIF, Linux mengubah call tersebut menjadi titik koordinasi antara target yang terblokir dan supervisor userspace. Supervisor dapat mengemulasikan hasil, menginjeksi file descriptor untuk operasi yang sesuai, atau mengizinkan kernel melanjutkan call asli. Mekanisme ini sengaja lebih sempit daripada security policy engine umum di userspace. Batas terkuatnya adalah protokol suspensi dan respons yang dimediasi kernel. Data yang diakses melalui pointer ke memori target tetap dapat berubah di sekitar proses inspeksi supervisor, dan respons yang melanjutkan call asli kembali masuk ke eksekusi kernel biasa dengan race tersebut tetap relevan.

Rekayasa Perangkat Lunak 17 Sep 2026 4 min read

Seal memfd Mengubah File Bersama Menjadi Objek Monotonik

Sebuah memfd Linux dapat bermula sebagai file anonim yang writable, lalu memperoleh pembatasan yang tidak dapat dihapus. Pembatasan tersebut melekat pada inode, sehingga transfer atau duplikasi descriptor tidak menghasilkan tampilan yang lebih longgar. Setelah sebuah seal berhasil ditambahkan, setiap descriptor yang merujuk inode itu tunduk pada seal tersebut. Sifat ini berbeda dari access mode pada descriptor. Descriptor dapat membawa flag lokal, sedangkan seal mengubah batas mutasi pada objek file bersama itu sendiri.