Langsung ke konten

Arsip

Konkurensi

12 artikel
Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Sequence Counter Mendeteksi Write Konkuren Tanpa Lock pada Reader

Sequence counter dapat memungkinkan reader menyalin shared state tanpa mengambil lock milik writer. Reader mengambil nilai counter, menyalin field yang dilindungi, lalu mengambil nilai counter sekali lagi. Nilai genap yang sama pada kedua observasi menandakan tidak ada writer yang overlap dengan proses penyalinan berdasarkan kontrak sinkronisasi. Nilai yang berubah atau ganjil memaksa reader membuang snapshot dan mengulang operasi. Pola ini memindahkan pekerjaan dari kepemilikan lock pada sisi reader, tetapi tidak menghapus sinkronisasi. Writer tetap memerlukan serialisasi, transisi counter memerlukan semantik memory ordering yang terdefinisi, dan data yang dilindungi harus tetap aman diakses selama write yang overlap. Constraint tersebut membuat sequence counter cocok untuk sebagian snapshot yang dominan dibaca, tetapi tidak aman untuk data yang lifetime-nya dapat berakhir saat reader masih mengaksesnya.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Propagasi Deadline Membatasi Umur Request Lintas Service

Sebuah request dapat kehilangan kegunaannya sebelum semua proses yang menanganinya berhenti bekerja. HTTP client mungkin berhenti menunggu setelah dua detik, sementara service upstream masih menjalankan database query, RPC, dan rangkaian retry selama beberapa detik berikutnya. Operasi tersebut tetap memakai connection, CPU time, kapasitas queue, dan konkurensi downstream meski hasilnya sudah tidak memiliki penerima. Deadline membuat batas kegunaan itu eksplisit. Propagasi deadline melalui call bertingkat memberi komponen yang terlibat satu batas atas bersama yang berasal dari request awal. Ini berbeda dari pemberian timeout independen pada setiap hop: timeout lokal membatasi operasi individual, sedangkan deadline yang dipropagasikan membatasi umur seluruh graph operasi.

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

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

Teknologi 17 Sep 2026 6 min read

Memory Fence Membatasi Urutan Memori Antar-Core

Memory Fence Membatasi Urutan Memori Antar-Core Prosesor dapat menjalankan operasi memori dengan kebebasan yang lebih besar daripada yang tampak dari urutan kode sumber. Load dapat dimulai lebih awal, store dapat menunggu di buffer, lalu lintas koherensi cache dapat selesai pada waktu berbeda, dan operasi yang saling independen dapat berlangsung tumpang tindih. Teknik-teknik ini meningkatkan throughput, tetapi perangkat lunak konkuren membutuhkan aturan yang presisi untuk memublikasikan dan mengamati state bersama. Memory fence menempatkan batas pengurutan di sekitar operasi memori tertentu. Instruksi ini biasanya tidak mengosongkan seluruh cache, tidak menserialkan seluruh prosesor, dan tidak membuat semua core menjalankan satu alur instruksi. Perannya lebih sempit: membatasi hasil pengurutan memori apa saja yang boleh terjadi melintasi sebuah batas yang ditentukan.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Edge Triggering Linux epoll Melaporkan Transisi Readiness, Bukan Unit Kerja

Edge Triggering Linux epoll Melaporkan Transisi Readiness, Bukan Unit Kerja Dengan EPOLLET, sebuah interest epoll tidak berperilaku seperti antrean yang berisi satu event untuk setiap byte, paket, koneksi, atau pesan aplikasi. Mekanisme ini melaporkan perubahan status readiness. Setelah sebuah file descriptor berada dalam status ready, pekerjaan tambahan dapat terakumulasi tanpa menghasilkan edge lain yang dapat diandalkan aplikasi. Handler karena itu perlu mengonsumsi pekerjaan yang tersedia sampai operasi nonblocking melaporkan bahwa progres berikutnya akan memblokir.

Python 09 Sep 2026 9 min read

Kendalikan Startup Task asyncio dengan eager_start

Membuat task asyncio biasanya terasa seperti batas scheduling yang jelas: panggil asyncio.create_task(), simpan task yang dikembalikan, lalu biarkan event loop segera menjalankan coroutine. Python juga mendukung eager task execution, yaitu coroutine dapat mulai berjalan langsung saat task dibuat. Python 3.14 menyediakan pilihan ini secara langsung melalui keyword eager_start pada asyncio.create_task() dan melalui pembuatan task di task group. Pendekatan ini dapat menghilangkan overhead scheduling untuk coroutine yang sering selesai tanpa blocking. Namun, ia juga dapat mengubah urutan program dengan dampak yang jauh lebih penting daripada peningkatan performanya.