Race Condition
Proses konkuren yang saling berinteraksi memerlukan sinkronisasi agar terkendali serta menghasilkan keluaran sesuai dengan yang diinginkan dan benar. Untuk mencapai hal tersebut maka salah satunya harus dapat menangani race condition yaitu kondisi karena terdapat beberapa proses/thread mengakses shared resources secara bersamaan dan hasil akhirnya ditentukan oleh proses terakhir yang diekekusi.
Gambar Program Normal vs Terkena Race Condition.
Pada gambar diatas terlihat contoh studi kasus program producer consumer (penghasil dan pengkonsumsi) dalam mengakses resource yang sama yaitu counter. Program dapat berjalan dengan lancar jika diatur sedemikian rupa dalam mengakses sumber daya counter, dan sebaliknya jika tidak diatur dalam pengaksesannya dapat mengakibatkan race condition.
int counter = 0;
//Producer process
item next_produced;
while (true) {
/* produce an item in next produced */
while (counter == BUFFER_SIZE); /* do nothing */
buffer[in] = next_produced;
in = (in + 1) % BUFFER_SIZE;
counter++;
}
//Consumer process
item next_consumed;
while (true) {
while (counter == 0); /* do nothing */
next_consumed = buffer[out] ;
out = (out + 1) % BUFFER_SIZE;
counter--;
/* consume the item in next consumed */
}
Potongan Program Producer Consumer
Pada implementasi kasus producer consumer dalam bentuk potongan program, terlihat resource counter merupakan operand (nilai yang akan digunakan untuk proses operasi) menggunakan unary operator dengan operasi post-increment atau post-decrement sebagai instruksi yang akan ditampilkan terlebih dahulu kemudian akan ditambahkan atau dikurangkan sebagai hasil dari proses program tersebut. Variabel counter akan diinisialisai dengan nilai 0 saat pertama kali program dijalankan, kemudian akan terjadi penambahan 1 nilai pada saat proses producer dijalankan, serta akan terjadi pengurangan 1 nilai pada saat proses consumer dijalankan. Baris kode counter-- atau counter++ merupakan sintaks penulisan yang disingkat, jika dijabarkan atau diimplementasikan akan terlihat sebagai berikut.
int counter = 0;
//Producer process (counter++)
register1 = counter;
register1 = register1 + 1;
counter = counter + 1;
//Consumer process (counter--)
register2 = counter;
register2 = register2 – 1;
counter = register2;
Penjabaran ekspresi post-increment/post-decrement
Jika program producer consumer dijalankan secara konkuren menggunakan interlaving (bergantian), maka hasil nilai counter tidak dapat diprediksi karena ditentukan oleh proses terakhir yang selesai dieksekusi, bisa producer melalui operasi post-increment atau bisa ditentukan oleh consumer melalui operasi post-decrement. Berikut contoh eksekusi dari program producer consumer yang dapat terjadi untuk menggambarkani race condition, dimisalkan counter diinisialisai dengan nilai 5 sebagai awalan.
T0: producer mengeksekusi register1 = counter (register1 = 5)
T1: producer mengeksekusi register1 = register1 + 1 (register1 = 6)
T2: consumer mengeksekusi register2 = counter (register2 = 5)
T3: consumer mengeksekusi regsiter2 = register2 -1 (register2 = 4)
T4: producer mengeksekusi counter = register1 (counter = 6)
T5: consumer mengeksekusi counter = register2 (counter = 4)
Contoh Output Terjadinya Race condition
Terlihat dari beberapa proses diatas dalam mengakses dan memanipulasi data counter secara konkuren dan hasil eksekusinya bergantung pada proses mana yang terakhir di eksekusi. Meskipun hasil akhir dari nilai counter diatas adalah 4, tetapi sangat memungkinkan hasil akhirnya adalah 6, jika T4 dan T5 dibalik.
Seperti yang kita ketahui masalah race condition dapat muncul karena terjadinya proses pengaksesan atau penggunaan sumber daya secara bersama-sama, untuk mencegah hal ini dapat diatasi menggunakan sinkronisasi mutual exclusion, yaitu mekanisme memberikan jaminan bahwa hanya ada satu proses yang dapat mengakses shared resources dalam satu waktu, sementara proses lainnya akan di keluarkan terlebih dahulu. Pada saat proses mengakses atau menggunakan share resource tersebut hal ini dianggap sebagai critical section.
Artikel Terkait
Karna pembahasan sistem operasi sangat kompleks, maka kita akan membaginya menjadi beberapa bagian, untuk sementara berikut beberapa artikel lainnya yang terkait atau berhubungan dengan pembahasan ini.
- 1 Gambaran Sistem Operasi - Komponen & Fungsi
- 1.1 Apa Yang Dikerjakan Sistem Operasi
- 1.2 Organisasi Sistem Komputer
- 1.3 Arsitektur Sistem Komputer
- 1.4 Struktur Sistem Operasi
- 1.5 Operasi Sistem Operasi - Trap Exception
- 2 Proses & Thread
- 3 Konkurensi: Mutual Exclusion dan Sinkronisasi
Referensi
- Operating Systems: Internals and Design Principles (8th Edition), William Stallings, 2014.
- Operating System Concepts (9th Edition in Chinese) by Abraham Silberschatz et al.
- The Linux Programming Interface: A Linux and UNIX System Programming Handbook, Michael Kerrisk.
Warning!
We are not responsible for any loss whatsoever due to this site, also if you want to take this article please read terms of use or touch us via contact page.
If there is question, please discuss below. Very welcome and expected to provide corrections, criticisms, and suggestions.
Be the first :D