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

EPOLLET Menjadikan Readiness sebagai Kontrak Transisi State

Descriptor yang didaftarkan dengan EPOLLET dapat tetap readable setelah sebuah event dikirim tanpa muncul lagi pada epoll_wait() berikutnya. Kernel melaporkan transisi readiness; kernel tidak menjanjikan pengulangan notifikasi yang sama hanya karena masih ada data yang belum dibaca. Perbedaan ini menjadikan edge-triggered epoll sebagai kontrak transisi state antara kernel dan event loop. Konsekuensinya bersifat struktural. Handler tidak dapat memperlakukan satu event sebagai izin untuk satu read() lalu langsung kembali ke wait loop. Pada edge-triggered monitoring, handler harus memperhitungkan seluruh state I/O yang segera tersedia sebelum bergantung pada transisi berikutnya.

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

Compose Multiplatform vs Flutter: Rendering, Performa, dan Ukuran Bundle

Compose Multiplatform vs Flutter: Rendering, Performa, dan Ukuran Bundle Compose Multiplatform dan Flutter dapat menghasilkan UI mobile yang sama-sama mulus, tetapi jalur yang mereka tempuh sampai pixel muncul di layar tidak sama. Perbedaan ini lebih penting daripada sekadar membandingkan “Kotlin versus Dart”. Compose Multiplatform memperluas model pemrograman Compose ke beberapa platform. Flutter membawa UI stack yang lebih mandiri bersama engine dan Dart runtime miliknya. Keduanya menambahkan komponen di luar kode aplikasi, tetapi biayanya muncul di tempat berbeda: rendering, startup, memory, ukuran binary, dan integrasi platform.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Circuit Breaker Membatasi Trafik Kegagalan Lintas Panggilan Service

Circuit breaker mengubah keputusan admission untuk panggilan keluar sebelum dependency menerimanya. Pada state closed, panggilan diteruskan dan hasilnya menjadi input bagi kebijakan kegagalan. Setelah kebijakan tersebut terpicu, breaker masuk ke state open dan menolak panggilan berikutnya secara lokal. Setelah interval pemulihan yang dikonfigurasi berakhir, sejumlah terbatas panggilan probe dapat menguji apakah dependency sudah dapat dipakai kembali. Mekanisme ini berbeda dari retry. Retry mengirim percobaan lain setelah sebuah percobaan gagal. Breaker dapat mencegah sebuah percobaan dikirim sama sekali. Menggabungkan keduanya tanpa urutan yang presisi dapat memperbesar trafik saat terjadi gangguan atau mempertahankan breaker dalam state open berdasarkan sinyal yang tidak merepresentasikan kondisi dependency.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Circuit Breaker Membatasi Amplifikasi Kegagalan Antar-Service

Sebuah service call dapat gagal dengan cepat tetapi tetap menimbulkan masalah yang lebih besar pada sistem. Ketika setiap request upstream terus memanggil dependency downstream yang sedang gagal, setiap percobaan menghabiskan kapasitas koneksi, waktu worker, retry budget, dan ruang queue. Dependency menerima traffic yang belum mampu dilayaninya, sementara caller menghabiskan resource untuk menunggu hasil yang sangat berkorelasi dengan kegagalan sebelumnya. Circuit breaker menempatkan batas keputusan yang memiliki state di depan call tersebut. Alih-alih memperlakukan setiap request sebagai kesempatan terpisah untuk mencoba dependency, breaker mencatat state kegagalan terbaru dan dapat menolak call secara lokal selama interval terbatas. Pemulihan kemudian diuji melalui probe terkontrol, bukan dengan langsung mengembalikan seluruh traffic.

Rekayasa Perangkat Lunak 19 Sep 2026 7 min read

Cara Runtime Bahasa Memakai Core CPU: Thread, Goroutine, Worker, dan Proses

CPU dengan banyak core tidak membuat kode aplikasi menjadi paralel dengan sendirinya. Sistem operasi memang dapat menjadwalkan beberapa thread pada saat yang sama, tetapi bahasa dan runtime menentukan bagaimana pekerjaan aplikasi mencapai thread tersebut. Perbedaan ini menjelaskan mengapa Go, Rust, C++, Java, JavaScript, dan PHP sama-sama dapat memakai mesin multicore meskipun model pemrogramannya sangat berbeda. Pertanyaan yang lebih berguna bukan sekadar apakah sebuah bahasa “multithreaded”. Yang perlu dilihat adalah bagaimana satu unit pekerjaan aplikasi berubah menjadi sesuatu yang dapat dijadwalkan oleh sistem operasi.

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

Cara GitHub Codespaces Menghitung Core-Hours, Meneruskan Port, dan Berhubungan dengan CI

GitHub Codespace adalah mesin development yang berjalan di cloud, bukan CI runner yang kebetulan memiliki editor. Environment ini tetap interaktif ketika developer mengedit file, menjalankan command, menyalakan server, melakukan debugging, dan membuat commit. Perbedaan ini menjelaskan tiga hal yang sering tercampur: cara kuota compute dihitung, cara localhost dapat dibuka dari browser, dan kapan CI mulai bekerja setelah kode di-push. Core-hours mengukur kapasitas mesin dikalikan waktu aktif Compute Codespaces dihitung dalam core-hours. Modelnya sederhana:

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

Bounded Queue Mengubah Overload Menjadi Keputusan Admission yang Eksplisit

Queue di antara producer dan consumer yang lebih lambat dapat menyerap perbedaan laju untuk sementara. Queue tidak dapat menghapus perbedaan tersebut. Jika arrival terus lebih cepat daripada completion, setiap item yang diterima menambah pekerjaan yang belum selesai. Unbounded queue membiarkan state itu menumpuk sampai resource lain menjadi batas efektif, sering kali memory atau timeout eksternal. Bounded queue memindahkan batas tersebut ke interface. Setelah capacity habis, admission harus menghasilkan sesuatu yang dapat diamati: menunggu ruang tersedia, menolak pekerjaan baru, membuang pekerjaan tertentu, atau mengalihkannya ke tempat lain. Karena itu, capacity queue dan perilaku saat penuh menjadi bagian dari kontrak overload sistem.

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

seccomp User Notification Mendelegasikan Syscall Terpilih ke Supervisor

seccomp User Notification Mendelegasikan Syscall Terpilih ke Supervisor Filter seccomp dapat menghentikan system call terpilih sebelum kernel mengeksekusinya, lalu mengirim notifikasi ke supervisor di user space. Thread target tetap terblokir saat supervisor menerima event dan mengirim disposisi. Perilaku ini mengubah hasil filter menjadi handoff terkontrol pada batas kernel dan user space. Mekanismenya adalah SECCOMP_RET_USER_NOTIF. Berbeda dari action seccomp biasa, filter BPF tidak menyelesaikan keputusan sendirian. Sebuah listener file descriptor menjadi titik koordinasi untuk menerima notifikasi, mengirim respons, dan secara opsional menginjeksi file 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.

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.

Rekayasa Perangkat Lunak 18 Sep 2026 6 min read

Linux signalfd Mengubah Sinyal Pending menjadi Read Descriptor

Linux signalfd memberi sinyal terpilih jalur konsumsi berbasis descriptor. Alih-alih memindahkan kontrol ke handler asinkron, proses dapat memblokir sinyal tersebut, mengaitkannya dengan objek signalfd, lalu mengonsumsi instance yang pending melalui read(). Descriptor ini juga dapat masuk ke poll(), select(), dan epoll, sehingga penerimaan sinyal dapat berada bersama socket, timer, dan sumber readiness lain. Antarmuka ini khusus Linux. Signal mask, aturan pending signal, dan operasi descriptor berasal dari semantik sinyal Linux serta POSIX pada bagian yang relevan; semuanya bukan properti bahasa C itu sendiri.

Rekayasa Perangkat Lunak 18 Sep 2026 5 min read

Linux signalfd Mengubah Signal Terpilih Menjadi Read Descriptor

Signal yang masuk ke mask signalfd dapat muncul sebagai state readable pada file descriptor alih-alih menjalankan asynchronous signal handler, selama signal tersebut diblokir dari delivery biasa pada thread yang relevan. Batas interface pun berubah: kedatangan signal dapat ikut dalam event loop berbasis descriptor yang sama dengan socket, pipe, dan objek pollable lain. Mekanisme ini tidak mengganti semantik signal Linux. Pembentukan signal, signal mask pada proses dan thread, state pending, penggabungan standard signal, antrean real-time signal, serta aturan delivery tetap berlaku. signalfd mengubah interface konsumsi untuk signal yang dipilih oleh mask-nya.