Back to IF3130 Sistem Paralel dan Terdistribusi

Topic

Questions/Cues

  • Apa kelemahan utama Busy-Waiting?

  • Apa itu Mutex?

  • Bagaimana alur penggunaan Mutex?

  • Fungsi Pthreads untuk Mutex?

  • Apa saja praktik terbaik & jebakan umum Mutex?

  • Kapan performa Mutex lebih unggul?

Reference Points

  • Slide “paralel programming model: shared memory” (Hal. 34-41)

Mengatasi Inefisiensi Busy-Waiting

Seperti yang dibahas sebelumnya, busy-waiting sangat boros sumber daya. Sebuah thread yang aktif menunggu akan terus memakan siklus CPU, yang bisa sangat merugikan performa, terutama saat jumlah thread melebihi jumlah core prosesor. Kondisi ini seperti menyuruh seseorang terus-menerus mencoba membuka pintu yang terkunci, padahal ia bisa menunggu dengan tenang dan dipanggil saat pintu sudah terbuka.

Mutex: Kunci Digital untuk Critical Section

Mutex (singkatan dari Mutual Exclusion) adalah mekanisme sinkronisasi yang berfungsi seperti sebuah kunci untuk melindungi critical section. Tujuannya sederhana: memastikan hanya satu thread yang bisa mengakses sumber daya bersama pada satu waktu.

Analogi yang Diperluas:

Bayangkan sebuah ruang rapat (critical section) dengan satu kunci (mutex).

  • Meminta Akses (lock): Siapa pun yang ingin masuk harus mengambil kunci. Jika kunci ada, ia bisa masuk dan mengunci pintu dari dalam. Jika kunci sedang dipakai orang lain, ia harus menunggu di luar.

  • Perbedaan Kunci: Tidak seperti busy-waiting (mencoba gagang pintu terus-menerus), sistem mutex (antrean di luar ruang rapat) jauh lebih sopan. Sistem operasi akan mencatat siapa saja yang menunggu dan menempatkan mereka dalam “mode tidur” (status blocked), sehingga mereka tidak menghabiskan energi.

  • Melepas Akses (unlock): Ketika orang di dalam selesai, ia keluar, meletakkan kunci kembali, dan memberi tahu sistem bahwa kunci sekarang tersedia. Sistem kemudian akan “membangunkan” satu orang dari antrean untuk mengambil kunci dan masuk.

Fungsi-Fungsi Inti Mutex dalam Pthreads

Pthreads menyediakan tipe data pthread_mutex_t dan fungsi-fungsi untuk mengelolanya:

  • Inisialisasi & Hapus:

    • pthread_mutex_init(pthread_mutex_t *mutex, ...): Menyiapkan variabel mutex sebelum digunakan.

    • pthread_mutex_destroy(pthread_mutex_t *mutex): Membersihkan mutex setelah selesai digunakan.

  • Operasi Kunci:

    • pthread_mutex_lock(pthread_mutex_t *mutex): Meminta dan menunggu kunci. Thread akan diblokir jika kunci sedang digunakan.

    • pthread_mutex_unlock(pthread_mutex_t *mutex): Melepaskan kunci agar bisa digunakan thread lain.

Perbandingan Performa: Kapan Mutex Unggul?

Data dari slide (hal. 40) menunjukkan perbedaan dramatis:

  • Sedikit Thread (1-8): Waktu eksekusi busy-wait dan mutex hampir sama.

  • Banyak Thread (16, 32, 64): Waktu eksekusi busy-wait meledak, sementara mutex tetap stabil dan cepat.

Penyebabnya: Ketika jumlah thread melebihi jumlah core, thread yang melakukan busy-wait akan “mencuri” waktu CPU dari thread lain yang sebenarnya memegang kunci. Akibatnya, thread pemegang kunci butuh waktu lebih lama untuk selesai dan melepaskan kunci, yang memperparah antrean. Dengan mutex, thread yang menunggu akan tidur, memberikan seluruh waktu CPU kepada thread yang sedang bekerja di critical section agar cepat selesai.

Praktik Terbaik dan Jebakan Umum

  • Jaga Critical Section Tetap Singkat: Jangan menaruh operasi yang lambat (seperti I/O file) di dalam critical section. Kunci harus dipegang sesingkat mungkin.

  • Selalu unlock Apa yang di-lock: Lupa memanggil pthread_mutex_unlock akan menyebabkan semua thread lain yang membutuhkan kunci tersebut berhenti selamanya.

  • Hindari Deadlock: Jangan mencoba mengunci mutex yang sama dua kali dalam satu thread tanpa membukanya. Jika perlu dua kunci, selalu kunci dalam urutan yang konsisten di semua thread (misal, selalu kunci A dulu baru kunci B).

Summary

Mutex adalah mekanisme sinkronisasi fundamental yang menyediakan akses eksklusif ke critical section dengan cara yang jauh lebih efisien daripada busy-waiting. Dengan memblokir thread yang menunggu alih-alih membiarkannya berputar aktif, mutex menjaga stabilitas performa bahkan ketika jumlah thread melebihi core CPU, meskipun penggunaannya memerlukan kehati-hatian untuk menghindari jebakan seperti deadlock dan durasi penguncian yang berlebihan.