Langsung ke konten

Arsip

Concurrency

72 artikel
Linux 23 Sep 2026 4 min read

signalfd Mengonsumsi Sinyal yang Diblokir Melalui Read File Descriptor

signalfd Mengonsumsi Sinyal yang Diblokir Melalui Read File Descriptor signalfd() mengubah notifikasi sinyal terpilih menjadi record yang dapat dikonsumsi dengan read(). Sinyal pending yang cocok membuat descriptor menjadi readable, sehingga pemrosesan sinyal dapat berada pada jalur poll(), select(), atau epoll yang sama dengan socket, timer, dan descriptor lain. Descriptor tidak otomatis mengalihkan sinyal hanya karena mask miliknya memuat nomor sinyal tersebut. Aturan signal mask normal tetap berlaku. Pada susunan yang umum, sinyal terpilih diblokir agar tidak dikirim melalui disposition biasa, lalu sebuah signalfd membaca instance yang pending.

Rekayasa Perangkat Lunak 23 Sep 2026 5 min read

Priority Inheritance Membatasi Priority Inversion di Sekitar Mutex

Priority Inheritance Membatasi Priority Inversion di Sekitar Mutex Priority scheduling tidak menjamin task runnable dengan priority tertinggi selalu dapat maju. Task ber-priority tinggi dapat terblokir pada mutex yang dimiliki task ber-priority rendah. Jika pekerjaan ber-priority menengah kemudian melakukan preemption terhadap pemilik mutex, task ber-priority tinggi tetap terblokir walaupun pekerjaan menengah itu tidak memiliki dependency langsung terhadap mutex. Kondisi ini disebut priority inversion. Inversion dimulai dari dependency biasa: task ber-priority tinggi memerlukan resource yang sedang dimiliki task ber-priority rendah. Bagian yang merugikan adalah interference dari task di antara kedua priority tersebut, karena interference itu dapat menunda pemilik mutex dan memperpanjang interval blocking.

Linux 23 Sep 2026 5 min read

Mode Semaphore eventfd Mengubah Nilai Counter Menjadi Read Satu Unit

Linux eventfd mengekspos counter 64-bit yang dikelola kernel melalui file descriptor. Interface yang ringkas ini memiliki pilihan semantik penting: read normal menguras nilai counter saat itu, sedangkan read dengan EFD_SEMAPHORE hanya mengambil satu unit. Jalur write tetap menambahkan nilai ke counter yang sama. Perbedaan tersebut mengubah objek dari counter notifikasi agregat menjadi sumber unit yang dapat dikonsumsi satu per satu melalui descriptor. Model readiness tetap dapat dipakai bersama poll, epoll, dan mekanisme multiplexing descriptor lain, sehingga satu objek dapat menghubungkan accounting producer dengan event loop tanpa payload pipe terpisah.

Teknologi 23 Sep 2026 6 min read

Mode Readiness epoll Mengubah Cara Event Loop Menguras File Descriptor

epoll di Linux memungkinkan satu thread menunggu perubahan readiness pada banyak file descriptor tanpa memindai seluruh descriptor pada setiap iterasi. Interface ini umum dipakai pada server jaringan, proxy, runtime, dan program lain yang mempertahankan banyak socket aktif. Mode registrasinya berpengaruh langsung pada pola kerja event loop. Operasi level-triggered terus melaporkan descriptor selama kondisi terkait masih ready. Operasi edge-triggered melaporkan transisi readiness dan mengharuskan aplikasi mengonsumsi pekerjaan yang tersedia sampai descriptor akan memblokir.

Linux 23 Sep 2026 5 min read

membarrier Private Expedited Mengurutkan Memori Userspace Antar-Thread

Linux membarrier() dapat memindahkan sebagian biaya sinkronisasi dari jalur yang sangat sering dieksekusi ke jalur koordinasi yang lebih jarang. Dengan MEMBARRIER_CMD_PRIVATE_EXPEDITED, satu thread meminta kernel membentuk titik memory ordering bagi thread yang sedang berjalan dalam proses yang sama. Biaya system call dibayar saat koordinasi diperlukan, bukan dengan menempatkan hardware memory barrier pada setiap eksekusi fast path. Mekanisme ini lebih sempit daripada rendezvous thread umum. membarrier() tidak menjalankan callback aplikasi pada sibling thread, tidak menunggu acknowledgement pada level aplikasi, dan tidak membuat data race biasa menjadi sinkronisasi yang valid. Kontraknya berfokus pada pengurutan akses memori userspace di sekitar barrier.

Linux 23 Sep 2026 5 min read

Lock OFD fcntl Mengikuti Open File Description, Bukan Proses

Record lock POSIX tradisional memiliki sifat yang dapat menimbulkan efek tak terduga pada kode dengan beberapa descriptor untuk file yang sama: kepemilikan lock terkait dengan proses, dan penutupan descriptor untuk file tersebut dapat melepas lock milik proses. Open file description lock di Linux memindahkan batas kepemilikan itu ke open file description kernel yang dirujuk descriptor. Antarmukanya tetap memakai fcntl() dan struct flock, tetapi identitas pemiliknya berubah. F_OFD_SETLK, F_OFD_SETLKW, dan F_OFD_GETLK membuat byte-range lock mengikuti open file description, bukan identitas proses.

Rekayasa Perangkat Lunak 23 Sep 2026 5 min read

Lock Convoy Mengubah Critical Section Singkat Menjadi Antrean Panjang

Lock Convoy Mengubah Critical Section Singkat Menjadi Antrean Panjang Mutex dapat melindungi critical section yang sangat kecil dan tetap menjadi pusat masalah latensi yang besar. Kode di dalam lock mungkin hanya memerlukan beberapa mikrodetik pada kondisi normal, tetapi satu holder yang tertunda dapat membuat beberapa thread menumpuk di belakangnya. Setelah antrean terbentuk, lock dapat terus berada dalam kondisi contention ketika ownership berpindah dari satu thread yang menunggu ke thread berikutnya.

Rekayasa Perangkat Lunak 23 Sep 2026 5 min read

Hazard Pointer Menunda Reklamasi sampai Reader Melepas Referensi

Menghapus node dari struktur data lock-free tidak membuat memorinya langsung aman untuk digunakan kembali. Thread lain mungkin sudah memegang alamat node tersebut dan masih akan mengaksesnya. Jika thread penghapus membebaskan alokasi terlalu cepat, pembaruan atomik yang benar dapat diikuti use-after-free. Hazard pointer memisahkan penghapusan logis dari reklamasi fisik. Reader memublikasikan alamat yang hendak diakses ke hazard slot yang ditentukan. Thread lain dapat melepas node dari struktur dan menaruhnya pada retired list, tetapi reklamasi menunggu sampai pemindaian memastikan tidak ada hazard slot yang melindungi alamat itu.

Teknologi 23 Sep 2026 5 min read

Grace Period RCU Linux Memisahkan Penghapusan dari Reklamasi

Read-Copy Update, yang umum disebut RCU, adalah keluarga mekanisme sinkronisasi yang banyak dipakai kernel Linux untuk data yang sering dibaca dan lebih jarang diubah. Langkah utamanya adalah memisahkan dua kejadian yang pada locking biasa kerap dianggap satu: menghapus objek dari struktur bersama dan mereklamasi memori yang menyimpannya. Writer dapat memublikasikan state baru atau melepas objek lama sementara reader tetap berjalan di dalam read-side critical section. Storage lama dipertahankan sampai kernel memastikan bahwa setiap reader yang mungkin sempat melihat referensi lama telah melewati quiescent state. Interval tersebut adalah RCU grace period.

Linux 23 Sep 2026 4 min read

EPOLLEXCLUSIVE Membatasi Wakeup Antar-instance epoll

EPOLLEXCLUSIVE Membatasi Wakeup Antar-instance epoll EPOLLEXCLUSIVE mengubah distribusi event ketika beberapa instance epoll mendaftarkan file description target yang sama. Tanpa flag ini, sebuah event readiness dapat membangunkan waiter yang terkait dengan setiap instance epoll yang berminat. Dengan registrasi eksklusif, Linux dapat membatasi fan-out tersebut dan mengurangi wakeup yang redundan. Flag ini tidak membuat delivery menjadi single-consumer, tidak menetapkan kepemilikan target, dan tidak menggantikan koordinasi pada level aplikasi. Kontraknya lebih sempit: di antara instance epoll yang mendaftarkan target dengan EPOLLEXCLUSIVE, satu atau lebih instance menerima event untuk sebuah wakeup, bukan mewajibkan semuanya menerima event tersebut.

Linux 23 Sep 2026 5 min read

close_range dengan UNSHARE Memisahkan Cleanup File Descriptor dari Thread Lain

Proses Linux multithread dapat memakai satu tabel file descriptor secara bersama. Pola itu praktis selama eksekusi normal: descriptor yang dibuka satu thread tersedia bagi thread lain. Masalah muncul ketika satu thread sedang menyiapkan konteks eksekusi terbatas dan ingin membuang range descriptor yang luas, sementara thread lain masih dapat mengalokasikan descriptor pada tabel yang sama. close_range() menyediakan operasi berbasis range untuk batas tersebut. Dengan CLOSE_RANGE_UNSHARE, kernel lebih dulu memisahkan caller dari tabel descriptor bersama, lalu menerapkan penutupan yang diminta pada tabel hasil pemisahan milik caller. Secara konsep, operasi ini mendekati gabungan unshare(CLONE_FILES) dan penutupan range, tetapi kernel dapat menghindari pekerjaan yang tidak diperlukan pada kasus umum.

Linux 22 Sep 2026 4 min read

TFD_TIMER_CANCEL_ON_SET Melaporkan Perubahan Diskontinu Clock Realtime

timerfd yang dipasang terhadap wall clock dapat mengalami perubahan clock diskontinu sebelum deadline tercapai. Dengan TFD_TIMER_CANCEL_ON_SET, Linux mengekspos kejadian itu melalui descriptor: read() berikutnya gagal dengan ECANCELED, bukan menyajikan lompatan clock sebagai expiration timer biasa. Cakupan flag ini sengaja sempit. Efeknya berlaku ketika timerfd_settime() memasang timer absolut pada CLOCK_REALTIME atau CLOCK_REALTIME_ALARM, lalu clock tersebut mengalami perubahan diskontinu. Cancellation terikat pada timer realtime absolut timerfd_create() memilih clock yang menjadi basis timer. Descriptor dengan CLOCK_REALTIME mengikuti system wall clock, sedangkan CLOCK_MONOTONIC mengikuti clock yang tidak disetel melalui perubahan wall clock.

Rekayasa Perangkat Lunak 22 Sep 2026 6 min read

Request Sequence Guard Menolak Response UI yang Terlambat

Request Sequence Guard Menolak Response UI yang Terlambat Interface interaktif sering mengirim request baru sebelum request sebelumnya selesai. Search box, filter, perubahan route, autocomplete, dan detail panel dapat menghasilkan pola ini. Urutan selesainya operasi jaringan tidak dijamin sama dengan urutan perubahan state oleh pengguna. Perbedaan urutan tersebut dapat menghasilkan race yang halus. Request A dimulai lebih dahulu, request B dimulai setelahnya, B selesai lebih cepat, lalu interface merender B. Jika A kemudian selesai dan callback miliknya menulis tanpa memeriksa konteks, layar kembali ke data yang terkait dengan intent lama.

Rekayasa Perangkat Lunak 22 Sep 2026 6 min read

Request Coalescing Mencegah Cache Miss Melipatgandakan Beban Backend

Request Coalescing Mencegah Cache Miss Melipatgandakan Beban Backend Cache miss biasanya murah ketika satu caller memicu satu lookup ke backend. Miss yang sama dapat menjadi mahal ketika banyak caller datang untuk key yang sama dalam waktu hampir bersamaan. Setiap caller melihat key belum tersedia, masing-masing memulai pekerjaan identik, lalu backend menerima lonjakan justru ketika cache tidak memberi perlindungan untuk key tersebut. Request coalescing mengubah pola concurrency itu. Caller pertama menjadi leader untuk sebuah key. Caller berikutnya bergabung dengan operasi yang sedang berjalan dan menunggu hasilnya, bukan memulai pekerjaan setara. Setelah fill selesai, hasilnya dapat mengisi cache sekaligus dikembalikan kepada caller yang menunggu.

Rekayasa Perangkat Lunak 22 Sep 2026 7 min read

Optimistic Concurrency Menolak Write Stale Sebelum Mengganti State yang Lebih Baru

Optimistic Concurrency Menolak Write Stale Sebelum Mengganti State yang Lebih Baru Alur read-modify-write terlihat sederhana ketika hanya satu actor menyentuh sebuah record. Client membaca state, mengubah sebagian isinya, lalu menulis hasilnya kembali. Saat beberapa actor bekerja bersamaan, jeda antara read dan write menjadi race. Writer lain dapat melakukan commit terhadap nilai yang lebih baru pada jeda tersebut, lalu update tanpa kondisi dapat menghapusnya. Optimistic concurrency control menambahkan kondisi pada write terakhir. Client membawa version yang berasal dari state yang dibacanya, dan storage layer menerima mutation hanya jika version itu masih current. Ketidakcocokan menjadi conflict, bukan overwrite yang tidak terlihat.

Rekayasa Perangkat Lunak 22 Sep 2026 6 min read

Optimistic Concurrency Control Menolak Write dari State yang Sudah Usang

Optimistic Concurrency Control Menolak Write dari State yang Sudah Usang Dua client dapat membaca record yang sama, membuat perubahan berbeda, lalu menyimpan dengan selisih beberapa detik. Jika setiap update langsung mengganti value yang tersimpan, write terakhir dapat menghapus perubahan sebelumnya meski kedua request sama-sama dinyatakan berhasil. Optimistic concurrency control mencegah overwrite diam-diam dengan memberi syarat pada write. Client menyimpan version saat membaca data. Update hanya berhasil jika version tersebut masih berlaku. Version yang sudah berubah membuat write berakhir sebagai conflict, bukan kehilangan perubahan tanpa tanda.

Rekayasa Perangkat Lunak 22 Sep 2026 6 min read

Fencing Token Menghentikan Pemegang Lease yang Sudah Stale

Fencing Token Menghentikan Pemegang Lease yang Sudah Stale Distributed lease memberi satu worker izin sementara untuk bertindak sebagai owner. Lease akhirnya kedaluwarsa agar worker lain dapat mengambil alih setelah crash atau gangguan jaringan. Mekanisme itu menjaga availability, tetapi expiry saja tidak menjamin worker lama sudah berhenti. Sebuah process dapat pause cukup lama hingga lease kedaluwarsa, lalu kembali berjalan dengan local state yang sudah stale. Garbage-collection pause yang panjang, scheduler stall, virtual machine yang disuspend, atau network path yang tertunda dapat menciptakan kondisi ini. Jika worker lama melakukan write setelah pengganti mengambil ownership, dua worker dapat memengaruhi resource yang sama meskipun lease service tidak pernah menganggap kedua lease valid pada saat yang sama.

Rekayasa Perangkat Lunak 22 Sep 2026 6 min read

Fencing Token Memblokir Pemegang Lock yang Sudah Kedaluwarsa

Fencing Token Memblokir Pemegang Lock yang Sudah Kedaluwarsa Distributed lock sering dipakai agar dua worker tidak mengubah resource yang sama pada saat bersamaan. Kasus yang lebih sulit muncul ketika kepemilikan lock bergantung pada lease. Sebuah client dapat memperoleh lease, berhenti cukup lama sampai lease kedaluwarsa, lalu melanjutkan eksekusi setelah client lain memperoleh lease baru. Dari sisi client lama, eksekusi hanya sempat terhenti. Dari sisi layanan koordinasi, kepemilikan sudah berpindah. Jika sistem penyimpanan yang dilindungi menerima write dari keduanya, pemegang lama dapat menimpa pekerjaan yang dilakukan pemegang saat ini.

Linux 22 Sep 2026 4 min read

EFD_SEMAPHORE Membuat Read eventfd Mengonsumsi Satu Unit Counter

eventfd normal mengubah seluruh counter yang bernilai nonzero menjadi satu hasil read lalu mereset counter ke nol. Saat dibuat dengan EFD_SEMAPHORE, hanya sisi read yang berubah: setiap read yang berhasil mengembalikan nilai 64-bit 1 dan mengurangi counter yang dikelola kernel sebanyak satu. Perbedaan ini membuat beberapa unit yang dikumpulkan writer tetap dapat dikonsumsi secara terpisah. Objeknya tetap sebuah eventfd, dengan counter, aturan write, lifetime descriptor, dan integrasi readiness yang sama.

Rekayasa Perangkat Lunak 22 Sep 2026 4 min read

Bulkhead Mengisolasi Concurrency Sebelum Satu Dependency Menghabiskannya

Bulkhead Mengisolasi Concurrency Sebelum Satu Dependency Menghabiskannya Sebuah service dapat memiliki CPU dan memori yang cukup tetapi berhenti membuat progres berguna karena concurrency habis. Thread, koneksi database, outbound socket, worker slot, dan permit request in-flight bersifat finite. Jika satu dependency melambat, call menuju dependency tersebut dapat memenuhi seluruh shared pool. Bulkhead isolation membagi kapasitas itu sebelum saturation terjadi. Workload yang dapat gagal secara independen memperoleh anggaran concurrency terpisah, sehingga tekanan pada satu jalur tidak otomatis memakai setiap slot yang diperlukan jalur lain.

Rekayasa Perangkat Lunak 22 Sep 2026 6 min read

Bulkhead Mencegah Satu Dependency yang Jenuh Menghabiskan Semua Worker

Bulkhead Mencegah Satu Dependency yang Jenuh Menghabiskan Semua Worker Sebuah service dapat memiliki CPU yang sehat, memory yang masih tersedia, dan internal code yang responsif tetapi tetap menjadi unavailable. Satu downstream dependency cukup untuk menghabiskan seluruh concurrency budget jika call ke sana melambat dan setiap request dibiarkan menunggu. Dampaknya tidak berhenti pada dependency yang lambat. Worker pool, connection pool, semaphore, queue, dan request slot yang dipakai bersama dapat mengubah saturasi lokal menjadi outage di seluruh service. Bulkhead isolation membatasi blast radius tersebut dengan menyediakan kapasitas terpisah untuk workload atau dependency yang berbeda.

Rekayasa Perangkat Lunak 22 Sep 2026 5 min read

Backpressure Mencegah Producer Cepat Membanjiri Consumer Lambat

Backpressure Mencegah Producer Cepat Membanjiri Consumer Lambat Pipeline stabil selama pekerjaan meninggalkan setiap tahap dengan laju yang kurang lebih seimbang dengan laju masuk dalam rentang waktu yang relevan. Ketika producer dapat mengirim pekerjaan lebih cepat daripada kemampuan consumer menyelesaikannya, selisih tersebut harus menumpuk di suatu tempat. Antrean tanpa batas membuat penumpukan itu mudah tersembunyi. Request terus diterima, producer tampak sehat, dan consumer tetap bekerja. Sementara itu, pekerjaan dalam antrean memakai memori dan semakin tua sebelum dieksekusi. Backpressure mengubah saturation downstream menjadi sinyal upstream sebelum backlog berubah menjadi kegagalan.

Rekayasa Perangkat Lunak 21 Sep 2026 5 min read

Write Skew Dapat Merusak Invariant Lintas Baris pada Snapshot Isolation

Write Skew Dapat Merusak Invariant Lintas Baris pada Snapshot Isolation Snapshot isolation memberi setiap transaksi view database yang stabil dan umumnya mencegah transaksi concurrent melakukan commit atas write yang saling bertabrakan pada baris yang sama. Properti concurrency ini kuat, tetapi tidak membuat setiap invariant aplikasi menjadi serializable. Write skew muncul ketika dua transaksi membaca state yang saling beririsan, mengambil keputusan dari snapshot valid yang sama, lalu menulis record yang berbeda. Karena write set keduanya tidak bertabrakan, kedua commit dapat berhasil. State gabungannya dapat melanggar aturan yang sudah diperiksa masing-masing transaksi sebelum menulis.

Rekayasa Perangkat Lunak 21 Sep 2026 4 min read

Version Vector Membedakan Update Concurrent dari Penerus Kausal

Version Vector Membedakan Update Concurrent dari Penerus Kausal Data tereplikasi dapat menerima write pada node berbeda ketika komunikasi antar-node tertunda. Saat versi-versi tersebut bertemu kembali, scalar revision number dapat menunjukkan bahwa dua nilai berbeda, tetapi tidak selalu dapat menentukan apakah satu versi merupakan turunan versi lain atau keduanya dibuat secara independen. Version vector mencatat progres per-replica. Perbandingan counter tersebut menghasilkan partial order: satu versi dapat mendominasi versi lain, kedua vector dapat sama, atau tidak ada yang mendominasi. Kondisi terakhir menandai history concurrent yang membutuhkan aturan rekonsiliasi eksplisit.