- Ada kritik bahwa buku teks The Art of Multiprocessor Programming tidak membahas konsep futex, dan itu sangat disayangkan
- Futex adalah komponen inti untuk sinkronisasi yang efisien dalam pemrograman paralel modern, dengan kinerja yang lebih baik daripada lock lama berbasis System V
- Futex memiliki struktur yang memisahkan perolehan lock dari fungsi wait/wake, sehingga mengurangi system call dan overhead yang tidak perlu
- Termasuk penjelasan contoh dan teknik untuk langsung mengimplementasikan berbagai primitive konkurensi berbasis futex seperti spinlock, mutex, dan recursive lock
- Penulis menyoroti kesenjangan antara akademia dan praktik industri karena buku tersebut tidak membahas metodologi sinkronisasi modern yang penting untuk pekerjaan engineering nyata
Pendahuluan
- Phil Eaton memulai klub buku untuk 'The Art of Multiprocessor Programming, 2nd Edition'
- Buku ini dianggap sebagai buku teks otoritatif di bidang pemrograman paralel, tetapi penulis mengkritik kurangnya nilai praktis dalam isinya
- Secara khusus, penulis mengkritik bahwa meskipun buku ini ditujukan untuk mahasiswa tingkat akhir S1 dan mahasiswa pascasarjana, buku ini tidak membahas futex, sebuah teknik sinkronisasi inti
Apa itu futex — dan mengapa penting
- Futex adalah singkatan dari “fast user space mutex”, tetapi sebenarnya bukan mutex melainkan blok pembangun primitif sinkronisasi dengan dukungan OS untuk implementasi lock modern
- Di masa lalu, sebagian besar lock diimplementasikan berdasarkan semaphore dari System V IPC sehingga memiliki keterbatasan dalam efisiensi dan skalabilitas
- Ketika futex diperkenalkan di Linux pada tahun 2002, ia menunjukkan kinerja 20 hingga 120 kali lebih cepat dibanding lock System V dalam lingkungan dengan 1.000 pekerjaan simultan
- OS lain seperti Windows (2012) dan macOS (2016) juga mengadopsi mekanisme serupa
- Lock di library sistem yang banyak dipakai saat ini seperti pthreads menggunakan futex
Cara kerja futex dan apa yang membedakannya
- Semaphore tradisional menggabungkan lock dan penantian, tetapi futex memisahkan perolehan lock dari wait/wake
- Karena itu, delay dan system call yang tidak perlu dapat dikurangi, dan saat lock dilepas, jika dipastikan tidak ada thread yang menunggu maka tidak perlu masuk ke kernel
- Pemanggilan wait pada futex membuat thread “menunggu hanya ketika nilai di alamat memori tertentu berada pada status yang diinginkan”, dan juga mendukung timeout
- Pemanggilan wake pada futex membangunkan jumlah thread yang diinginkan dari daftar tunggu internal yang terhubung ke alamat memori tertentu
- Karena memerlukan verifikasi nilai aktual pada alamat memori, futex mencegah penantian yang tidak perlu jika status sudah berubah
Pemanfaatan nyata futex — implementasi langsung
- Karena futex adalah primitive tingkat rendah, digunakan tipe data
atomic dengan mempertimbangkan isu urutan operasi memori pada compiler dan hardware
- Di Linux, system call futex harus dipanggil langsung lewat
syscall, sedangkan di macOS digunakan antarmuka __ulock (belakangan ditambahkan API yang lebih mudah)
- Pada dasarnya, wait futex mengembalikan 0 saat berhasil dan kode error saat gagal (misalnya timeout)
- Operasi inti berbasis futex:
h4x0r_futex_wait_timespec() : menunggu jika nilai yang diharapkan cocok, dengan opsi timeout
h4x0r_futex_wake() : membangunkan 1 atau semua penunggu
Contoh praktik implementasi mutex/spinlock/recursive lock
Spinlock
- Bentuk lock paling sederhana, bekerja hanya dengan satu bit tunggal (
atomic_fetch_or)
- Ia berputar dalam loop tanpa henti (“spin”) sampai mendapatkan lock, tetapi membuang CPU saat kontensi tinggi dan memiliki masalah struktural seperti pelepasan yang salah serta risiko deadlock saat dipanggil secara rekursif
Mutex hibrida (‘unsafe’ mutex)
- Biasanya mencoba dulu dengan spinlock, lalu jika gagal sejumlah kali beralih ke futex untuk blocking yang efisien
- Jika tidak ada penunggu, system call yang tidak perlu bisa dihindari, dan untuk penunggu jumlah system call wake juga dapat diminimalkan
- Karena verifikasi kepemilikan yang ketat atau penanganan rekursi belum memadai, digunakan nama “unsafe”
Mutex dengan penghitung penunggu
- Satu bit dipakai untuk status lock, sisanya untuk menghitung jumlah penunggu, dengan tujuan mengurangi system call wake yang tidak perlu
- Tetap belum memiliki penanganan kepemilikan maupun rekursi
Mutex dengan manajemen kepemilikan
- Dengan nilai
pthread_t, pemilik lock dan statusnya dilacak dengan jelas sehingga masalah dapat dideteksi saat unlock salah atau saat dipakai secara rekursif
- Perolehan lock, pelepasan, dan pengelolaan penunggu semuanya dikendalikan secara ketat dengan operasi atomic
Recursive lock
- Dengan menambahkan penghitung kedalaman (depth) per thread, thread yang sama bisa memperoleh lock yang bertumpuk
- Saat unlock, depth dikurangi, dan ketika menjadi 0 barulah unlock sebenarnya serta wake dijalankan
- Setiap operasi diimplementasikan dengan operasi atomic dan pemeriksaan kepemilikan yang ketat
Tugas yang tersisa dan realitas engineering di lapangan
- Jika thread pemilik lock berhenti secara abnormal atau mati, maka diperlukan daftar manajemen terpisah, callback saat terminasi, dan pengelolaan tambahan lainnya untuk mengelola lock
- Saat memakai mutex bersama antarproses, dibutuhkan pertimbangan tambahan untuk mengelola perubahan status
- POSIX RW lock tidak mendefinisikan perilaku tumpukan rekursif dan implementasinya berbeda-beda, sehingga dalam praktik sulit menjamin keamanannya
- Penulis mengkritik bahwa isu konkurensi yang benar-benar penting di lapangan (futex, recursive lock, asynchronous runtime, dan lain-lain) tidak dimasukkan buku itu ke dalam kurikulum
Kesimpulan
- 'The Art of Multiprocessor Programming' terlalu berat ke sejarah atau sudut pandang teoretis sehingga gagal memuat pengetahuan praktik penting dalam pemrograman paralel modern
- Jika komponen sinkronisasi inti seperti futex yang benar-benar digunakan di sistem tidak dibahas dengan semestinya, hal itu berpotensi menimbulkan dampak buruk nyata bagi generasi penerus
- Penulis menekankan perlunya memasukkan konsep-konsep terbaru dan melengkapi isi dengan materi yang lebih praktis
Referensi
- Contoh kode lengkap dapat dilihat di codeberg
Belum ada komentar.