Pendahuluan
Proses: - Independent - Cooperating Race Condition Proteksi dapat dilakukan dengan Sinkronisasi
Sinkronisasi?
Critical Section
Konkurensi
Jenis: - Pseudo-concurrency - True-concurrency
Penyebab Konkurensi: - Interrupt - Softirqs dan Tasklets - Kernel Preemption - Sleeping dan Synchronization with user-space - Symmetrical Multiprocessing
Syarat Sinkronisasi
Mutex - Independent - Cooperating Race Condition Cara mencapai Mutex: - Processor Synchronous - Memory Synchronous - Instruksi Atomik - Spin Lock - Semaphore - SMP
Instruksi Atomik
Salah satu metode dalam kernel LINUX untuk sinkronisasi adalah instruksi atomik Salah satu jenis dari instruksi atomik adalah integer atomik
TestAndSet()
Bersifat atomik Jika dua instruksi TestAndSet () dijalankan secara serentak, kedua instruksi tersebut akan dieksekusi secara sekuensial
TestAndSet()
boolean testAndSet(boolean lock){ boolean t = lock; lock = true; return t; } while (testAndSet(lock)) ; // Critical Section Lock[0] = false;
Semaphore
Semafor adalah sebuah variabel bertipe integer yang selain saat inisialisasi, hanya dapat diakses melalui dua operasi standar, yaitu increment dan decrement. Nama asli dari operasi tersebut sebenarnya adalah Proberen (test) dan Verhogen (increment). Namun, untuk mempermudah pemahaman digunakan nama signal dan wait
8
Semaphore (contd)
void signal(int sem_value) { sem_value++; }
void wait(int sem_value) { while(sem_value <= 0); sem_value--; }
Semaphore (contd)
Jenis - Binary (primitive semaphore)-0/1 - Counting semaphore-0,1,2,3, (tergantung usage count) Fungsi
Mutual Exclusion Resource Controller Sinkronisasi antar proses
Semaphore (contd)
Mutual Exclusion
thread A: wait(mutex); count = count + 1; signal(mutex); thread B: wait(mutex); count = count + 1; signal(mutex);
Semaphore (contd)
Resource Controller
thread A: wait(multiplex); //critical section signal(multiplex); thread B: wait(multiplex); //critical section signal(multiplex); thread C: wait(multiplex); //critical section signal(multiplex);
Semaphore (contd)
Sinkronisasi Antar-Proses
thread A: count = count + 1; signal(mutex); thread B: wait(mutex); count = count * 2;
Semaphore (contd)
Dilihat dari operasi wait() nya, semafor dapat dibedakan menjadi 2:
Semaphore spinlock
Semaphore (contd)
void signal(int sem_value){ sem_value++; if(sem_value <= 0){ /*keluarkan satu thread dari waiting queue*/ /*aktifkan thread tersebut*/ } } void wait(int sem_value){ sem_value--; if(sem_value < 0){ /*masukkan thread ke dalam waiting queue*/ /*blok thread tersebut*/ } }
Semaphore (contd)
Keuntungan
Dari segi programming, penanganan masalah sinkronisasi dengan semafor umumnya rapi
dan teratur, sehingga mudah untuk dibuktikan kebenarannya Semafor diimplementasikan dalam hard code sehingga penggunaannya bersifat portabel
SMP
Spin lock tunggal ini tidak memunculkan permasalahan untuk proses yang banyak menghabiskan waktu untuk menunggu proses komputasi, tapi untuk proses yang banyak melibatkan banyak aktifitas kernel, spin lock menjadi sangat mengkhawatirkan
19
SMP
Dalam pengembangan kernel LINUX 2.1, kernel spin lock tunggal menjadi banyak lock yang masing-masing melindungi terhadap masuknya kembali sebagian kecil data struktur kernel sehingga mengizinkan banyak processor untuk dieksekusi oleh kernel mode secara bersamaan.
20
SMP
Pada Linux 2.6, kernel mendukung adanya konsep preemptive, scheduler dalam kernel dapat menginterrupt kernel code yang sedang berjalan untuk memberi kesempatan bagi kernel code lain untuk dijalankan.