Back to IF3130 Sistem Paralel dan Terdistribusi

Topic

Questions/Cues

  • Apa itu Race Condition?

  • Contoh Race Condition?

  • Kenapa hasil bisa salah?

  • Apa itu Critical Section?

  • Apa itu Busy-Waiting?

  • Bagaimana cara kerja Busy-Waiting?

  • Apa kelemahan Busy-Waiting?

Reference Points

  • Slide “paralel programming model: shared memory” (Hal. 25-33)

Masalah: Hasil yang Tidak Terduga

Saat beberapa thread mencoba memodifikasi variabel global yang sama secara bersamaan, hasilnya sering kali menjadi salah dan tidak dapat diprediksi.

Studi Kasus: Menghitung Nilai π (Pi)

Kita dapat mengestimasi nilai π menggunakan deret Gregory-Leibniz:

Dalam versi paralel, setiap thread menghitung sebagian dari deret ini dan menambahkan hasilnya ke satu variabel global sum. Namun, ketika dijalankan dengan banyak thread, hasil estimasi π justru semakin buruk seiring bertambahnya jumlah iterasi, yang seharusnya membuatnya semakin akurat.

Race Condition

Race Condition adalah sebuah “cacat” dalam program yang terjadi ketika hasil akhir dari suatu operasi bergantung pada urutan eksekusi thread yang tidak terkontrol. Thread-thread seolah-olah “berlomba” untuk mengakses dan memodifikasi sumber daya bersama (shared resource).

Contoh Mekanisme Kesalahan:

Misalkan variabel sum saat ini bernilai 5.0.

  1. Thread 0 membaca nilai sum (5.0) ke dalam registernya.

  2. Scheduler menghentikan Thread 0 sejenak dan menjalankan Thread 1.

  3. Thread 1 membaca nilai sum (masih 5.0) ke registernya, menghitung 5.0 + 0.5 = 5.5, lalu menyimpan 5.5 kembali ke sum.

  4. Scheduler menghentikan Thread 1 dan kembali menjalankan Thread 0.

  5. Thread 0 melanjutkan perhitungannya dari nilai yang tadi ia baca, yaitu 5.0 + 0.2 = 5.2, lalu menyimpan 5.2 kembali ke sum.

Hasil akhir sum adalah 5.2, padahal seharusnya 5.0 + 0.5 + 0.2 = 5.7. Perhitungan dari Thread 1 hilang begitu saja (lost update).

Critical Section

Critical Section adalah blok kode di mana sebuah thread mengakses atau memodifikasi sumber daya bersama. Untuk mencegah race condition, kita harus memastikan bahwa hanya satu thread yang dapat mengesekusi critical section pada satu waktu. Ini disebut mutual exclusion (eksklusi mutual).

// Contoh pada kasus Pi
sum += factor / (2*i + 1); // Ini adalah Critical Section

Solusi Awal: Busy-Waiting

Busy-waiting (atau spinning) adalah teknik sederhana untuk melindungi critical section. Sebuah thread secara terus-menerus memeriksa sebuah variabel (sering disebut flag) dalam sebuah loop kosong sampai kondisi tertentu terpenuhi, yang menandakan gilirannya untuk masuk ke critical section.

Cara Kerja:

  1. Sebuah variabel global flag diinisialisasi ke 0.

  2. Thread 0 ingin masuk. Ia memeriksa flag dan karena nilainya 0 (sama dengan rank-nya), ia bisa masuk ke critical section.

  3. Sementara itu, Thread 1 juga ingin masuk. Ia terus-menerus memeriksa flag dalam loop while (flag != 1);. Selama flag bukan 1, ia akan terus “berputar” di sana.

  4. Setelah Thread 0 selesai, ia mengubah flag menjadi 1.

  5. Kondisi flag != 1 pada Thread 1 menjadi salah, sehingga ia bisa keluar dari loop dan masuk ke critical section. Proses ini berlanjut untuk thread berikutnya.

Kelemahan Busy-Waiting

Meskipun bisa menyelesaikan masalah race condition, busy-waiting sangat tidak efisien. Thread yang sedang menunggu akan terus memakai siklus CPU sepenuhnya hanya untuk memeriksa sebuah kondisi. Ini membuang-buang sumber daya komputasi yang berharga. Bayangkan seseorang terus-menerus menekan tombol refresh pada sebuah halaman web—ia aktif, tetapi tidak melakukan pekerjaan yang produktif sama sekali.

Summary

Sebuah race condition terjadi ketika banyak thread mengakses sumber daya bersama secara tidak teratur, menyebabkan hasil yang salah dan tidak dapat diprediksi. Bagian kode yang mengakses sumber daya ini disebut critical section dan harus dilindungi untuk memastikan hanya satu thread yang bisa masuk pada satu waktu (mutual exclusion) Busy-waiting adalah salah satu metode perlindungan pertama dengan memaksa thread untuk “berputar” dalam loop kosong sambil menunggu giliran, namun metode ini sangat boros sumber daya CPU.