4 poin oleh GN⁺ 2025-08-21 | Belum ada komentar. | Bagikan ke WhatsApp
  • 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.

Belum ada komentar.