Langsung ke konten

Arsip

Rekayasa Perangkat Lunak

127 artikel
Linux 19 Sep 2026 5 min read

pidfd_getfd Menduplikasi Descriptor Aktif Lintas Batas Proses

Sebuah proses dapat memperoleh descriptor baru yang merujuk ke open file description yang sama dengan descriptor milik proses lain tanpa meminta proses target mengirimkannya. Linux menyediakan operasi ini melalui pidfd_getfd(). Descriptor hasilnya berada di descriptor table caller, tetapi objek kernel di belakangnya tetap sama dengan descriptor target. Perbedaan tersebut penting karena nomor descriptor hanya merupakan entri pada descriptor table sebuah proses. Open file description membawa state seperti posisi file saat ini dan file status flags. Duplikasi lintas proses karena itu memberikan referensi ke instance file kernel yang sudah ada, bukan membuka ulang pathname atau membuat instance independen.

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

Penulisan Array di Go, PHP, JavaScript, Kotlin, Rust, dan Python

Tanda kurung siku membuat kode array di beberapa bahasa terlihat seolah dapat diterjemahkan langsung. Di Rust, [10, 20, 30] dapat menjadi array berukuran tetap dengan panjang sebagai bagian dari tipe. Di Python, bentuk yang hampir sama menghasilkan list yang mutable. PHP memakai sintaks bracket untuk ordered map, sedangkan JavaScript membuat object Array yang dapat berubah ukuran. Sintaksnya mudah diingat. Perbedaan yang lebih penting adalah arti dari nilai tersebut setelah dibuat.

Linux 19 Sep 2026 6 min read

PAGEMAP_SCAN Mengelompokkan State Page Table Menjadi Rentang Alamat

Rentang alamat virtual yang besar dapat memiliki hanya sedikit transisi state page. Membaca satu entri pagemap untuk setiap virtual page memang memperlihatkan state pada granularitas page, tetapi user space harus memeriksa rangkaian entri yang panjang. Linux PAGEMAP_SCAN memindahkan filtering ke kernel dan melaporkan span yang cocok sebagai record struct page_region. Interface ini berupa ioctl() pada /proc/PID/pagemap. Request berisi interval alamat, predicate kategori, return mask, dan output vector. Kernel berjalan melalui page table lalu menghasilkan region berurutan yang properti page terpilihnya memenuhi request. Bentuk inspeksi page table berubah dari stream nilai per-page menjadi query rentang yang sudah difilter.

Rekayasa Perangkat Lunak 19 Sep 2026 7 min read

Open File Description Lock Mengikat Byte Range ke Instance File

Sebuah byte-range lock dapat melindungi inode yang sama tetapi memiliki semantik lifetime yang sangat berbeda bergantung pada objek pemilik lock. Record lock fcntl() tradisional terkait dengan proses. Open file description lock justru menempel pada open file description kernel yang dirujuk oleh descriptor. Pergeseran ini mengubah operasi close mana yang melepas lock, state yang bertahan setelah fork(), serta kemampuan dua thread dalam satu proses untuk saling berkompetisi pada region file yang sama.

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

Nilai Poison LLVM Menunda Undefined Behavior di Sepanjang IR

LLVM IR tidak mengubah setiap kondisi aritmetika atau pointer yang tidak valid menjadi undefined behavior seketika. Banyak instruksi justru menghasilkan nilai poison. Nilai itu dapat mengalir ke instruksi berikutnya, sehingga optimizer tetap dapat bertumpu pada janji seperti “penjumlahan ini tidak overflow” tanpa menjadikan pelanggaran janji tersebut sebagai undefined behavior tepat pada instruksi asalnya. Perbedaan ini merupakan bagian dari semantik LLVM, bukan detail implementasi optimizer. Frontend yang menghasilkan nsw, nuw, inbounds, noundef, atau constraint terkait sedang menyatakan fakta yang boleh dipercaya oleh pass berikutnya.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Linux pidfd Mengikat Operasi Proses ke Referensi Kernel yang Stabil

Process ID numerik menamai sebuah proses hanya selama PID tersebut masih dialokasikan kepadanya. Setelah proses keluar dan di-reap, Linux dapat menggunakan kembali angka itu untuk proses lain. Kode yang mengamati PID, melakukan pekerjaan lain, lalu bertindak memakai angka tersebut dapat melewati batas lifetime yang tidak dikodekan oleh integer itu sendiri. Linux pidfd menyediakan referensi berbentuk file descriptor ke sebuah proses sehingga operasi berikutnya dapat menargetkan objek proses yang direferensikan tanpa mengulang lookup PID numerik.

Linux 19 Sep 2026 5 min read

Idmapped Mount Memetakan Ulang Ownership Tanpa Menulis Ulang Inode

Inode yang sama dapat terlihat memiliki ownership berbeda melalui dua mount point tanpa chown() rekursif. Idmapped mount Linux menempelkan ID mapping pada sebuah mount, sehingga penyajian ownership dan pemeriksaan permission di VFS dapat menerjemahkan user ID serta group ID untuk view tersebut sementara ownership yang disimpan filesystem tetap sama. Properti ini memisahkan metadata inode persisten dari view identitas yang diekspos pada mount tertentu. Mekanisme tersebut berguna ketika satu pohon filesystem perlu dipakai container dengan user namespace yang memetakan ID secara berbeda dari host.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Fencing Token Menutup Celah Writer dari Lease Kedaluwarsa

Lease terdistribusi dapat kedaluwarsa ketika pemegangnya tidak dapat berjalan. Pemegang tersebut kemudian dapat aktif lagi dengan state lokal yang masih menyatakan bahwa lease dimilikinya, padahal client lain sudah memperoleh lease yang lebih baru. Jika storage atau service yang dilindungi menerima operasi hanya karena client pernah memperoleh lease, dua client dapat memutasi resource yang sama pada titik waktu berbeda. Fencing token memindahkan pemeriksaan penentu dari kepemilikan lease ke resource yang dilindungi. Setiap akuisisi yang berhasil memperoleh token yang berurutan setelah semua token sebelumnya. Resource mencatat token terbesar yang pernah diterima dan menolak operasi dengan nilai lebih lama. Lease tetap mengoordinasikan akuisisi, sedangkan token membatasi tindakan pemegang lama yang terlambat setelah kembali aktif.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Fencing Token Menolak Writer Usang Setelah Lease Kedaluwarsa

Distributed lease dapat memindahkan kepemilikan tanpa menghentikan proses yang sebelumnya memegang lease tersebut. Sebuah worker dapat berhenti cukup lama hingga lease kedaluwarsa, lalu aktif kembali setelah worker lain memperoleh lease yang sama. Pada saat itu, kedua proses dapat mengeksekusi kode yang ditulis dengan asumsi bahwa kepemilikan bersifat eksklusif. Kedaluwarsa lease menyelesaikan status kepemilikan di coordination service. Mekanisme itu tidak mencabut waktu CPU, membatalkan network request yang sedang berjalan, atau menghapus I/O yang sudah masuk buffer pada holder lama. Fencing token menutup celah tersebut dengan membawa nilai pengurutan dari keputusan kepemilikan menuju resource yang dilindungi.

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

epoll Edge-Triggered Memerlukan Drain Readiness hingga EAGAIN

Dengan EPOLLET, event loop dapat menerima satu notifikasi, membaca hanya sebagian data yang tersedia, lalu menunggu tanpa batas meskipun masih ada byte yang belum dibaca di buffer socket. Descriptor tetap ready, tetapi tidak ada transisi readiness baru yang memicu edge berikutnya. Perilaku tersebut membuat epoll edge-triggered menjadi kontrak antara semantik notifikasi dan I/O nonblocking. Event menyatakan bahwa readiness berubah; event bukan janji bahwa kernel akan terus mengulang notifikasi yang sama sampai aplikasi menyelesaikan pekerjaannya.

Rekayasa Perangkat Lunak 18 Sep 2026 3 min read

timerfd Mengubah Hitungan Ekspirasi Timer Menjadi State Descriptor yang Dapat Dipoll

Sebuah timerfd Linux menjadi readable ketika timer yang dikonfigurasi mengalami ekspirasi. Byte yang dikembalikan oleh read(2) bukan timestamp atau event record: nilainya mengodekan satu integer unsigned 64-bit yang berisi jumlah ekspirasi sejak successful read sebelumnya. State timer dengan demikian masuk ke mekanisme readiness yang sama dengan socket dan pipe, sementara semantik khusus timer tetap berada di balik batas descriptor. Readiness merepresentasikan hitungan ekspirasi tertunda timerfd_create(2) membuat descriptor yang terkait dengan sebuah clock, sedangkan timerfd_settime(2) mengaktifkan atau menonaktifkan timer. Setelah setidaknya satu ekspirasi tertunda, poll(2), select(2), dan epoll(7) dapat melaporkan descriptor sebagai readable.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

timerfd Mengubah Ekspirasi Timer Menjadi Readiness Descriptor

Sebuah timerfd menjadi readable setelah timernya mengalami ekspirasi. Notifikasi ini bukan pemanggilan signal handler dan bukan pesan byte stream. Linux mencatat ekspirasi yang pending pada objek timer lalu mengekspos status tersebut melalui file descriptor, sehingga timer dapat berada pada batas readiness yang sama dengan socket, pipe, dan descriptor lain. Interface ini lebih dari sekadar penggantian mekanisme notifikasi. Pilihan clock menetapkan domain waktu, flag arming menetapkan apakah deadline bersifat relatif atau absolut, dan setiap read yang berhasil melaporkan jumlah ekspirasi yang terakumulasi sejak read sukses sebelumnya atau konfigurasi ulang timer.

Rekayasa Perangkat Lunak 18 Sep 2026 5 min read

SO_REUSEPORT Memindahkan Distribusi Listener ke Seleksi Socket

SO_REUSEPORT memungkinkan beberapa socket Linux AF_INET atau AF_INET6 melakukan bind pada alamat dan port lokal yang sama selama setiap anggota memenuhi aturan reuse-port. Pada listener TCP, distribusi koneksi masuk berpindah ke tahap sebelum accept(): kernel memilih satu listener dari grup reuse-port, lalu listener tersebut menerima koneksi pada accept queue miliknya. Pada UDP, seleksi menentukan socket yang menerima datagram masuk. Batas concurrency ini berbeda dari beberapa thread yang berbagi satu listening file description. Setiap anggota reuse-port adalah socket terpisah dengan descriptor, queue, status polling, dan lifecycle sendiri.

Rekayasa Perangkat Lunak 18 Sep 2026 3 min read

signalfd Menyalurkan Signal Tertunda melalui I/O Descriptor

Sebuah signalfd Linux menjadi readable ketika signal yang dipilih oleh mask-nya berada dalam state pending untuk konteks yang membaca. read(2) yang berhasil mengonsumsi state signal tertunda dan mengembalikan satu atau beberapa record signalfd_siginfo berukuran tetap. Penanganan signal dengan demikian dapat masuk ke event loop berbasis descriptor tanpa menjadikan handler asinkron sebagai mekanisme dispatch utama. Mask descriptor tidak memblokir signal Mask yang diberikan ke signalfd(2) memilih signal yang dapat diterima descriptor. Mask tersebut tidak mengubah signal mask milik thread pemanggil. Penggunaan normal memblokir signal itu secara terpisah dengan sigprocmask(2) atau pthread_sigmask(3) agar disposition biasa tidak berjalan sebelum signal dikonsumsi melalui descriptor.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

Seal pada memfd Mengubah State File Bersama Menjadi Pembatasan Monotonik

File hasil memfd_create() dapat bermula sebagai state bersama yang writable lalu berubah menjadi semakin terbatas. File seal membuat transisi itu monotonik: seal yang berhasil dipasang menjadi properti inode, berlaku pada setiap descriptor yang merujuk inode tersebut, dan tidak dapat dihapus. Sifat ini berguna ketika satu proses menyiapkan byte lalu mengirim descriptor ke proses lain. Penerima dapat memeriksa pembatasan yang ditegakkan kernel, bukan hanya bergantung pada janji protokol bahwa produsen sudah berhenti mengubah objek.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

Seal pada Linux memfd Mengubah File Memori Mutable menjadi Transisi State yang Dipaksakan Kernel

File yang dibuat dengan memfd_create() dapat bermula sebagai penyimpanan mutable lalu memperoleh pembatasan yang dipaksakan kernel dan berlaku pada file dasarnya, bukan hanya pada satu descriptor. Dengan MFD_ALLOW_SEALING, proses dapat menambahkan seal melalui fcntl(F_ADD_SEALS) sehingga mutasi tertentu tidak lagi tersedia bagi semua pemegang file tersebut. Mekanisme ini membentuk transisi state yang tidak dapat dinyatakan oleh permission descriptor biasa. Produsen dapat mengisi byte, menetapkan ukuran file, lalu memublikasikan descriptor dengan pembatasan yang tetap melekat meskipun descriptor melintasi batas proses.

Rekayasa Perangkat Lunak 18 Sep 2026 6 min read

Seal pada Linux memfd Mengubah File Anonim Mutable Menjadi Capability Terbatas

File descriptor yang dikembalikan memfd_create() dapat bermula sebagai file anonim yang writable dan dapat diubah ukurannya, lalu beralih menjadi objek dengan operasi mutasi yang telah dikurangi secara permanen. Linux menerapkan transisi tersebut melalui file seal. Mekanisme ini melekat pada file yang mendasarinya, bukan pada satu descriptor, sehingga pengiriman descriptor duplikat melintasi batas proses tidak membentuk state sealing yang terpisah. Properti ini membuat sealing lebih dari sekadar fasilitas untuk penyimpanan sementara. Sealing mengubah otoritas yang dibawa setiap descriptor yang merujuk ke objek memfd yang sama. Transisinya monoton: seal dapat ditambahkan, tetapi tidak dapat dihapus.

Rekayasa Perangkat Lunak 18 Sep 2026 5 min read

SCM_RIGHTS Mentransfer Open File Description Melintasi Batas Proses

SCM_RIGHTS memungkinkan satu proses mengirim referensi ke file yang sudah terbuka melalui Unix domain socket. Penerima memperoleh file descriptor di tabel descriptornya sendiri, tetapi transfer tersebut tidak membuka ulang pathname atau menyalin objek kernel. Pada Linux, referensi yang dihasilkan memiliki semantik setara dengan menduplikasi descriptor milik pengirim ke proses penerima. Perbedaan ini penting ketika batas proses juga menjadi batas otoritas. Supervisor dapat membuka socket, file, pipe, device, atau objek lain berbasis descriptor lalu memberikan referensi yang sudah terbentuk kepada worker. Worker menerima akses ke objek yang telah terbuka, termasuk state open-file yang dapat tetap dipakai bersama dengan pengirim.

Linux 18 Sep 2026 5 min read

pidfd_getfd Menduplikasi File Descriptor Proses Lain ke Proses Pemanggil

Nomor file descriptor hanya memiliki arti di dalam tabel descriptor suatu proses, tetapi objek kernel di balik nomor tersebut dapat dipakai bersama oleh beberapa proses. Linux pidfd_getfd() menjembatani dua ruang itu: syscall ini menerima PID file descriptor beserta nomor descriptor dari proses yang dirujuk, lalu memasang descriptor duplikat pada proses pemanggil. Descriptor baru tersebut merujuk ke open file description yang sama dengan descriptor target. Properti terakhir itu merupakan batas utama. pidfd_getfd() tidak membuka ulang pathname, menyalin byte, atau membuat posisi file yang independen. Operasi ini menduplikasi referensi kernel yang sudah ada sehingga semantik state bersama dapat memengaruhi kedua proses.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

pidfd Mengikat Operasi Proses ke Referensi Kernel yang Stabil

PID numerik menamai sebuah proses hanya selama PID tersebut masih dialokasikan kepadanya. Setelah proses berhenti dan di-reap, Linux dapat memakai kembali nomor itu untuk proses lain. PID file descriptor, atau pidfd, menyimpan referensi kernel ke task tertentu, sehingga operasi berikutnya dapat menargetkan task tersebut tanpa melakukan resolusi ulang terhadap PID numeriknya. Perbedaan ini menghilangkan satu kelas race time-of-check/time-of-use dari pengelolaan proses. pidfd tidak membuat proses tetap hidup, tidak memberi izin tambahan, dan tidak mengubah seluruh operasi proses menjadi API descriptor yang portabel.

Rekayasa Perangkat Lunak 18 Sep 2026 5 min read

openat2 Membatasi Resolusi Path di Dalam Batas Direktori

Pathname bukan referensi objek yang stabil. Di antara direktori awal dan komponen akhir, resolusi path Linux dapat mengikuti symbolic link, melewati mount point, memproses .., atau menjumpai link khusus dari pseudo-filesystem. openat2() memungkinkan caller memasang batas pada operasi resolusi tersebut sehingga kernel dapat menolak lookup yang keluar dari boundary yang ditetapkan. Perbedaannya lebih kuat daripada memeriksa string yang sudah dinormalisasi sebelum open(). Validasi string memeriksa sintaks. openat2() dapat membatasi traversal aktual oleh kernel ketika objek filesystem dan topologi mount ikut menentukan hasil lookup.

Rekayasa Perangkat Lunak 18 Sep 2026 7 min read

MAP_SHARED mmap Menghubungkan Write Memori dengan State Page Berbasis File

Mapping MAP_SHARED yang writable memungkinkan proses mengubah state berbasis file dengan memory store biasa. Byte diakses melalui virtual memory, bukan dikirim lewat write(), tetapi mapping tersebut tetap berpartisipasi dalam state filesystem: perubahan dapat terlihat melalui shared mapping lain dan file I/O, lalu dirty page dapat ditulis kembali ke storage. Antarmuka ini menyatukan beberapa mekanisme ke dalam satu rentang alamat. CPU store, page fault, residensi page cache, writeback filesystem, dan persistensi storage dapat terlibat dalam siklus hidup byte yang sama. Menyamakan store yang berhasil dengan output file yang sudah durable menghapus batas yang tetap dipisahkan oleh sistem operasi.

Rekayasa Perangkat Lunak 18 Sep 2026 5 min read

Linux userfaultfd Memindahkan Penanganan Page Fault Terpilih ke User Space

Page fault biasanya membawa eksekusi dari proses ke kernel dan baru kembali setelah kernel menyelesaikan kondisi virtual-memory atau mengirim error. Linux userfaultfd dapat menyisipkan komponen user-space ke jalur tersebut untuk rentang alamat yang didaftarkan secara eksplisit. Kernel melaporkan fault terpilih melalui file descriptor, memblokir execution context yang mengalami fault saat mode mengharuskannya, lalu menerima ioctl yang menyelesaikan fault tersebut. Ini adalah antarmuka virtual-memory Linux, bukan jaminan memori dari C atau POSIX. Perilakunya bergantung pada fitur kernel yang dinegosiasikan, rentang terdaftar, jenis mapping, dan mode registrasi.

Rekayasa Perangkat Lunak 18 Sep 2026 6 min read

Linux splice Menjadikan Kapasitas Pipe Bagian dari Semantik Transfer Data

Linux splice() dapat memindahkan byte antar-file descriptor tanpa mengalirkan byte tersebut melalui buffer user space, tetapi interface ini bukan primitive penyalinan generik dari sembarang descriptor ke descriptor lain. Sedikitnya satu endpoint harus berupa pipe. Syarat tersebut membuat state pipe menjadi bagian dari kontrak transfer: kapasitas, data yang dapat dibaca, keberadaan writer, mode blocking, dan progres parsial dapat memengaruhi jalur data yang tampak sederhana. Batas yang relevan bukan sekadar “salinan kernel versus salinan user.” splice() mengubah bentuk ownership dan flow control. Kode aplikasi tidak lagi memiliki array byte perantara, tetapi tetap memiliki control loop yang menghitung byte yang sudah dipindahkan, menangani readiness, dan mempertahankan semantik offset.