Materi
• Latar Belakang
• Critical Section Problem
• Peterson's Solution
• Sinkronisasi dengan Hardware
• Mutex
• Semaphore
Latar Belakang
Masalah
Latar Belakang
Shared Data
counter : variabel pencatat jumlah data sekarang
buffer[] : penampung data
BUFFER_SIZE : jumlah maksimal buffer
Producer(P) Consumer(C)
while (true) { while (true) {
// Jika yg diproduksi = batas, do nothing // Jika yang dikonsumsi = 0, do nothing
while (counter == BUFFER_SIZE); while (counter == 0);
// Produksi data dan masukkan buffer // Konsumsi data
buffer [in] = nextProduced; nextConsumed = buffer[out];
in = (in + 1) % BUFFER_SIZE; out = (out + 1) % BUFFER_SIZE;
// Tambah counter dengan 1 // Kurangi counter dengan 1
counter++; counter--;
} }
Q : Jika counter = 5, berapa nilai counter setelah satu kali iterasi secara concurrent ?
Nilai Counter
• counter++ dapat diimplementasikan dalam bahasa mesin sbb :
• register1 = counter
• register1 = register1 + 1
• counter = register1
• counter-- dapat diimplementasikan dalam bahasa mesin sbb :
• register2 = counter
• register2 = register2 - 1
• count = register2
• Jika “counter = 5” dan producer-consumer dieksekusi secara concurrent
maka urutan eksekusinya bisa jadi :
1. Producer eksekusi : register1 = counter {register1 = 5}
2. Producer eksekusi : register1 = register1 + 1 {register1 = 6}
3. Consumer eksekusi : register2 = counter {register2 = 5}
4. Consumer eksekusi : register2 = register2 - 1 {register2 = 4}
5. Producer eksekusi : counter = register1 {counter = 6 }
6. Consumer eksekusi : counter = register2 {counter = 4}
• Nilai counter dapat bernilai 4 atau 6. Padahal seharusnya 5
• Problem : race condition
Problem : Race Condition
• Memenuhi 3 syarat :
• Mutual exclusion
• Progress
• Bounded waiting
Sinkronisasi dengan
Hardware
Sinkronisasi dengan Hardware
• Banyak sistem menyediakan dukungan hardware untuk
menangani critical section code
• Melakukan locking : memproteksi critical section dengan
lock.
• Pada single-processor
• Disable interrupt
• Code yang sedang dieksekusi tidak akan mengalami preemption
• TIDAK efisien untuk multiprocessor : pesan akan disebar ke
semua processor
• Modern-computer
• Menyediakan instruksi hardware khusus yang atomik (tidak bisa
diiterupsi)
• Dua pendekatan :
• Test and set
• Swap content of two memory words
Solusi Critical Section dengan Locking
do {
acquire lock
critical section
release lock
remainder section
} while (TRUE);
Solusi Critical Section dengan TestAndSet
• Definisi:
void Swap (boolean *lock, boolean *key)
{
boolean temp = *lock;
// Swap content
*lock = *key;
*key = temp;
}
• Misal ada process Pi dan Pj
• Pi panggil Swap saat parameter lock = False, key=True
• key = False, process Pi bisa akses critical section-nya
• Pj tidak bisa akses critical sectionnya karena lock=True oleh Pi
• Pi panggil Swap saat parameter lock = True, key=True,
• key = True, process Pi tidak bisa akses critical section-nya (Do Nothing)
• Pi tidak bisa akses critical sectionnya karena sebelumnya lock=True oleh Pj
Bounded-waiting Mutual Exclusion
with TestandSet()
do {
waiting[i] = true;
key = true;
while (waiting[i] && key)
key = test and set(&lock);
waiting[i] = false;
/* critical section */
j = (i + 1) % n;
while ((j != i) && !waiting[j])
j = (j + 1) % n;
if (j == i)
lock = false;
else
waiting[j] = false;
/* remainder section */
} while (true);
Mutex Locks
Mutex Lock
• Sinkronisasi dengan hardware terlalu kompleks bagi
programmer
• Desainer OS menyediakan software tool untuk
critical-section problem
• Tools paling sederhana adalah mutex (mutually
exclusion)
• Mutex lock biasanya diimplementasi dengan salah
satu mekanisme sinkronisasi dengan hardware
• Mutex menyediakan 2 fungsi dasar :
• acquire lock : mengunci critical section
• release lock : melepas kunci
• Acquire dan release menggunakan shared variable available
• Acquire lock
acquire() {
while (!available); /* busy wait */
available = false;
}
• Release lock
release() {
available = true;
}
• Solusi dengan mutex
do {
acquire lock
critical section
release lock
remainder section
} while (true);
• Apa kelemahan mutex dan sinkronisasi dengan
hardware?
• Pada saat suatu critical section di lock oleh satu process, maka
proses lain melakukan busy waiting.
• Busy waiting : menunggu dengan cara looping terus menerus
sampai lock-nya dilepas.
• Disebut juga dengan spinlock karena proses lain melakukan
"berputar" ketika menunggu
• Busy waiting menghabiskan siklus pemrosesan CPU yang
seharusnya bisa dimanfaatkan secara produktif oleh proses lain.
Semaphore
Semaphore
• Perangkat sinkronisasi yang tidak memerlukan
busy waiting.
• Semaphore S – shared integer variable
• S hanya bisa diakses dengan 2 operasi atomik :
wait dan signal
• wait : cek S dan mengurangi S dengan 1
wait (S) {
while S <= 0; // no-op
S--;
}
• signal : menambah S dengan 1
signal (S) {
S++;
}
Dua Jenis Semaphore
• Shared data:
semaphore S; //diinisialisasi S = 1
• Process Pi:
do {
wait(S);
critical section
signal(S);
remainder section
} while (1);
Implementasi Semaphore
signal(S){
if (S.value <= 0) {
Hapus proses P dari queue S.Q;
wakeup(P);
}
S.value++;
}
Masalah : Deadlock dan Starvation