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.

7 articles
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 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 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 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 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 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.