Pertemuan membahas tentang sinkronisasi proses dan masalah critical section. Video ditayangkan untuk mendemonstrasikan konsep sinkronisasi proses. Berbagai metode sinkronisasi dibahas seperti semaphore, test and set, swap, mutex lock, dan larik memutar untuk mengatasi masalah race condition dan memastikan akses bersamaan hanya dilakukan satu proses."
3. Mari kita saksikan video berikut :
SISTEM OPERASI
Sistem Operasi - Kasus Sinkronisasi Proses
https://www.youtube.com/watch?v=PR2A6P2e4ik
Sinkronisasi Proses - Sistem Operasi
https://www.youtube.com/watch?v=mqUwJUsLAN4
Process Synchronization
https://www.youtube.com/watch?v=ph2awKa8r5Y&list=PLBlnK6fEyqRiVhbXDG
LXDk_OQAeuVcp2O&index=57
5. Sinkronisasi Proses
Sinkronisasi mengacu pada salah satu
dari dua proses yang berbeda tetapi
saling berkaitan satu sama lainnya. Dua
proses ini merupakan sinkronisasi data
dan sinkronisasi proses.
Inti dari permasalahan sinkronisasi ini
nantinya akan mengacu pada sebuah
gagasan yang di dalamnya terdapat
banyak proses yang pada titik tertentu
akan bertemu, bergabung dalam rangka
untuk mencapai sebuah kesepakatan
ataupun komitmen untuk suatu urutan
tindakan tertentu.
Gambar 1: Sinkronisasi Proses
6. Sinkronisasi Proses
Sinkronisasi ini mengacu pada gagasan yang menjaga beberapa salinan dari dataset yang
ada dalam koherensi antara satu sama lain.
Sinkronisasi merupakan suatu proses pengaturan jalannya beberapa proses pada
waktu yang bersamaan untuk menyamakan waktu dan data supaya tidak terjadi
inconsitensi (ketidak konsistenan) data akibat adanya akses data secara konkuren
agar hasilnya bagus dan sesuai dengan apa yang diharapkan.
Disini sinkronisasi diperlukan agar data tersebut tetap konsisten.
Pengertian dari Sinkronisasi adalah akses bebarengan untuk berbagi dua bersama
dapat mengakibatkan inkosistensi data. Pemeliharaan konsistensi data memerlukan
mekanisme untuk memastikan eksekusi dari proses kerjasama.
7. Sinkronisasi Proses
Tujuan dari sinkronisasi itu sendiri ialah untuk menghindari terjadinya inkonsitensi data
karena pengaksesan oleh beberapa proses yang berbeda serta untuk mengatur urutan
jalannya proses-proses sehingga dapat berjalan dengan baik dan sesuai apa yang di
harapkan.
Adapun manfaat sikronisasi pada sistem operasi adalah:
1. Adanya akses - akses data yang sama yang di lakukan secara bersamaan bisa saja
menyebabkan data menjadi tidak konsisten
2. Agar semua data yang ada tetap konsisten membutuhkan mekanisme - mekanisme
agar bisa di pastikan proses eksekusi berjalan.
3. Adanya Race Condition yang merupakan kondisi dimana beberapa proses
mengakses dan memanipulasi data secara bersamaan akan membuat nilai terkhirnya
nanti bergantung dari proses mana yang duluan diakhiri.
8. Sinkronisasi Proses
Komunikasi antara proses membutuhkan subroutine untuk mengirim dan menerima
data primitif. Terdapat desain yang berbeda-beda dalam implementasi setiap primitif.
Pengiriman pesan mungkin dapat diblok (blocking) atau tidak dapat dibloking (nonblocking) –
juga dikenal dengan nama sinkron atau asinkron.
Ketika dalam keadaan sinkron, terjadi dua kejadian :
a. Blocking send. Pemblokiran pengirim sampai pesan sebelumnya diterima.
b. Blocking receive. Pemblokiran penerima sampai terdapat pesan yang akan dikirim.
Sedangkan untuk keadaan asinkron, yang terjadi adalah:
a. Non-blocking send . Pengirim dapat terus mengirim pesan tanpa memperdulikan
apakah pesan sebelumnya sampai atau tidak.
b. Non-blocking receive . Penerima menerima semua pesan baik berupa pesan yang valid
atau pesan yang salah (null).
9. Race Condition
Race Condition merupakan situasi dimana beberapa
proses mengakses dan memanipulasi data secara
bersamaan.
Nilai terakhir dari data bergantung dari proses mana
yang selesai terakhir. Untuk menghindari
Race Condition, proses - proses secara bersamaan
harus disinkronisasikan.
Dalam beberapa sistem operasi, proses-proses yang
berjalan bersamaan mungkin untuk membagi
beberapa penyimpanan umum, masing-masing dapat
melakukan proses baca (read) dan proses tulis
(write). Penyimpanan bersama (shared storage)
mungkin berada di memori utama atau berupa sebuah
berkas bersama, lokasi dari memori bersama tidak
merubah kealamian dari komunikasi atau masalah
yang muncul.
10. Masalah Race Condition
Untuk mengetahui bagaimana komunikasi antar proses bekerja, mari kita simak sebuah contoh
sederhana, sebuah print spooler. Ketika sebuah proses ingin mencetak sebuah berkas, proses tersebut
memasukkan nama berkas ke dalam sebuah spooler direktori yang khusus. Proses yang lain, printer
daemon, secara periodik memeriksa untuk mengetahui jika ada banyak berkas yang akan dicetak, dan
jika ada berkas yang sudah dicetak dihilangkan nama berkasnya dari direktori.
Bayangkan bahwa spooler direktori memiliki slot dengan jumlah yang sangat besar, diberi nomor 0,
1, 2, 3, 4,... masing-masing dapat memuat sebuah nama berkas.
Juga bayangkan bahwa ada dua variabel bersama, out, penunjuk berkas berikutnya untuk dicetak,
dan in, menunjuk slot kosong di direktori. Dua variabel tersebut dapat menangani sebuah two-word
berkas untuk semua proses.
Dengan segera, slot 0, 1, 2, 3 kosong (berkas telah selesai dicetak), dan slot 4, 5, 6 sedang terisi
(berisi nama dari berkas yang antre untuk dicetak).
11. Race Condition
Lebih atau kurang secara besamaan, proses A dan B,
mereka memutuskan untuk antre untuk sebuah berkas
untuk dicetak. Situasi ini digambarkan seperti gambar di
samping kiri berikut :
Dalam Murphy‟s Law kasus tesebut dapat terjadi.
Proses A membaca in dan menyimpan nilai "7"
di sebuah variabel lokal yang disebut next_free_slot.
Sebuah clock interrupt terjadi dan CPU memutuskan
bahwa proses A berjalan cukup lama, sehingga diga
ntikan oleh proses B.
Proses B juga membaca in, dan juga mengambil n
ilai 7, sehingga menyimpan nama berkas di slot no
mor 7 dan memperbaharui nilai in menjadi 8. Maka
proses mati dan melakukan hal lain.
12. Race Condition
Akhirnya proses A berjalan lagi, dimulai dari tempat dimana proses tersebut mati. Hal ini terlihat dalam
next_free_slot, ditemukan nilai 7 di sana, dan menulis nama berkas di slot nomor 7, menghapus nama
berkas yang baru saja diletakkan oleh proses B.
Kemudian proses A menghitung next_free_slot + 1, yang nilainya 8 dan memperbaharui nilai in
menjadi 8.
Direktori spooler sekarang secara internal konsisten, sehingga printer daemon tidak akan
memberitahukan apa pun yang terjadi, tetapi poses B tidak akan mengambil output apa pun.
Situasi seperti ini, dimana dua atau lebih proses melakukan proses reading atau writing beberapa
shared data dan hasilnya bergantung pada ketepatan berjalan disebut race condition.
13. Masalah Critical Section
Critical Section adalah sebuah segmen
kode dimana sebuah proses memiliki sumber
daya bersama yang diakses terdiri dari :
1. Entry Section, kode yang digunakan untuk
masuk ke dalam critical section
2. Critical Section, kode dimana hanya ada satu
proses yang dapat dieksekusi pada satu waktu
3. Exit Section, akhir dari critical section,
mengizinkan proses lain
4. Remainder Section, merupakan kode istirahat
setelah masuk ke critical section.
14. Semaphore
Semaphore adalah pendekatan yang diajukan oleh Djikstra, dengan prinsip bahwa dua
proses atau lebih dapat bekerja sama dengan menggunakan penanda - penanda sederhana.
Seperti proses dapat dipaksa berhenti pada suatu saat, sampai proses mendapatkan
penanda tertentu itu.
Sembarang kebutuhan koordinasi kompleks dapat dipenuhi dengan struktur penanda
yang cocok untuk kebutuhan itu. Variabel khusus untuk penanda ini disebut semaphore.
15. Semaphore
Semaphore mempunyai dua sifat, yaitu:
1. Semaphore dapat diinisialisasi dengan
nilai non negative.
2. Terdapat dua operasi terhadap
semaphore, yaitu Down dan Up.
Usulan asli yang disampaikan Djikstra
adalah operasi P dan V.
16. Sinkronisasi Perangkat Keras
• 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
17. Solusi Critical Section dengan Locking
do {
acquire lock
critical section
release lock
remainder section
} while (TRUE);
18. Solusi Critical Section dengan Test And Set
• Shared boolean variable lock, initialized to FALSE
• „
Solution:
do {
// Do nothing jika lock = true
while ( TestAndSet (&lock ));
critical section
lock = FALSE; // reset lock to false
remainder section
} while (TRUE);
boolean TestAndSet (boolean *lock)
{
boolean rv = *lock;
// set lock = TRUE, lock the execution
*lock = TRUE;
// return previous lock status
return rv:
}
19. Instruksi Test And Set
• Definisi:
boolean TestAndSet (boolean *lock)
{
boolean rv = *lock;
// set lock = TRUE, means lock the execution
*lock = TRUE;
// return previous lock status
return rv:
}
• Misal ada process Pi dan Pj
• Pi panggil TestAndSet saat parameter lock = False
– Return value = False, process Pi bisa akses critical section-nya
– Pj tidak bisa akses critical sectionnya karena lock=True oleh Pi
• Pi panggil TestAndSet saat parameter lock = True
– Return value = True, process Pi tidak bisa akses critical section-nya (Do Nothing)
– Pi tidak bisa akses critical sectionnya karena sebelumnya lock=True oleh Pj
20. Solusi Critical Section dengan Swap
• Shared Boolean variable lock initialized to FALSE;
• Setiap process punya local variable key
• „Solution:
do {
key = TRUE;
while ( key == TRUE)
Swap (&lock, &key );
// critical section
lock = FALSE;
// remainder section
} while (TRUE);
void Swap (boolean *lock, boolean *key)
{
boolean temp = *lock;
// Swap content
*lock = *key;
*key = temp;
}
21. Instruksi Swap
• 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
22. 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);
23. Mutex (Mutually Exclusion) 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 (dua) fungsi dasar :
– acquire lock : mengunci critical section
– release lock : melepas kunci
24. Solusi Mutex (Mutually Exclusion) Lock
• 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);
25. Pertanyaan & Jawaban
• Apa kelemahan mutex dan sinkronisasi dengan hardware?
• Jawab :
– 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.
26. Larik Memutar (Circular Array)
• Pendahuluan
• Queue (Antrian) adalah suatu bentuk khusus dari List Linier dengan operasi
penyisipan (insertion) hanya diperbolehkan pada salah satu sisi, yang
disebut sisi belakang (REAR), dan operasi penghapusan (deletion) hanya di
perbolehkan pada sisi yang lainnya. Queue merupakan kumpulan data
dengan penambahan data hanya melalui satu sisi, yaitu belakang (tail) dan
penghapusan data hanya melalui sisi depan (head).
• Berbeda dengan stack yang bersifat LIFO maka queue bersifat FIFO
(First In First Out), yaitu data yang pertama masuk akan keluar terlebih dah
ulu dan data yang terakhir masuk akan keluar terakhir.
27. Larik Memutar (Circular Array)
• Hal yang perlu diingat :
• Queue disebut juga antrian dimana
data masuk di satu sisi dan keluar
di sisi yang lain.
• Queue bersifat FIFO (First In First
Out).
Gambar 1. Ilustrasi Queue
Elemen yang pertama kali masuk ke dalam queue disebut elemen depan (front/h
ead of queue), sedangkan elemen yang terakhir kali masuk ke queue disebut
elemen belakang (rear/tail of queue). Perbedaan antara stack dan queue
terdapat pada aturan penambahan dan penghapusan elemen.
28. Larik Memutar (Circular Array)
Pada stack, operasi penambahan dan penghapusan elemen dilakukan di satu
ujung. Elemen yang terakhir kali dimasukkan akan berada paling dekat dengan
ujung atau dianggap paling atas sehingga pada operasi penghapusan, elemen
teratas tersebut akan dihapus paling awal, sifat demikian dikenal dengan LIFO.
Pada queue, operasi tersebut dilakukan di tempat yang berbeda. Penambahan
elemen selalu dilakukan melalui salah satu ujung, menempati posisi di belakang
elemen‐elemen yang sudah masuk sebelumnya atau menjadi elemen paling
belakang. Sedangkan penghapusan elemen dilakukan di ujung yang berbeda,
yaitu pada posisi elemen yang masuk paling awal atau elemen terdepan.
Sifat yang demikian dikenal dengan FIFO.
29. Implementasi Queue dengan Circular Array
Salah satu variasi array adalah array melingkar (circular array), artinya array
dapat diakses mulai dari sembarang indeks (indeks awal) ke arah indeks
terakhir (maksimum array), lalu memutar ke indeks pertama hingga kembali
ke indeks awal. Circular array adalah array yang dibuat seakan‐akan
merupakan sebuah lingkaran dengan titik awal dan titik akhir saling
bersebelahan jika array tersebut masih kosong. Jumlah data yang dapat
ditampung oleh array ini adalah besarnya ukuran array dikurangi 1.
Misalnya besar array adalah 8, maka jumlah data yang dapat ditampung adalah
7. Ide yang paling sederhana adalah dengan mengisi tempat kosong (jika tersedi
a) yang berada pada awal array bila tail telah mencapai posisi pjg_max sehingga
penggunaan tempat menjadi lebih efisien. Jadi seolah-olah array di bawah ini
dibulatkan manjadi sebuah lingkaran seperti digambarkan berikut ini (nama
circular array berasal dari ide array yang dibulatkan).
30. Implementasi Queue dengan Circular Array
Gambar 2. Circular Array
Aturan-aturan dalam queue yang menggunakan circular array adalah:
1. Proses penghapusan dilakukan dengan cara nilai depan (front)
ditambah 1: front=front+1.
2. Proses penambahan elemen sama dengan linear array yaitu nilai
belakang ditambah 1: tail=tail + 1.
3. Jika front = maks dan ada elemen yang akan dihapus, maka nilai
front = 1.
4. Jika tail = maks dan front tidak 1 maka jika ada elemen yang akan
ditambahkan, nilai tail = 1
5. Jika hanya tinggal 1 elemen di queue (front = tail), dan akan
dihapus maka front diisi 0 dan tail diisi dengan 0 (queue kosong).
Front dan Tail akan bergerak maju, jika:
• Untuk penambahan.
• Tail sudah mencapai elemen terakhir array akan memakai
elemen pertama array yang telah dihapus.
• Untuk pngahapusan.
6. Front telah mencapai elemen terakhir array, maka akan menuju el
emen pertama jika antrian masih berisi elemen.
31. Operasi‐operasi queue dengan Circular Array
Dengan circular array, meskipun posisi terakhir telah terpakai, elemen baru tetap dapat ditambahkan pada posisi pertama jika
posisi pertama dalam keadaan kosong.
Jika akhir = MAX dan awal=1, nilai head dan tail mencapai maksimum, maka akan dikembalikan ke posisi awal. Operasi ‐
operasi yang terdapat pada circular array tidak jauh berbeda dengan operasi pada linear array.
1. Create
Procedure Create;
Begin
Head := 1;
Tail := MaxQueue;
End;
2. Empty
Function Empty : Boolean;
Begin
If (Tail Mod Max_Queue ) + 1 = Head then
Empty := true
Else
Empty := False;
End;
3. FULL
Function Full : Boolean;
Var
X : 1 .. Max_queue;
Begin
X := (Tail Mod Max_queue)+1;
If (x Mod Max_queue) + 1 = head then
Full := True;
Else
Full := False;
32. Operasi‐operasi queue dengan Circular Array
4. EnQueue
Procedure EnQueue (Elemen : TypeElemen);
Begin
If Not Full Then
Begin
Tail := (Tail Mod Max_queue) + 1 ;
Queue[Tail] := Elemen;
End;
End;
5. DeQueue
Procedure Dequeue;
Begin
If Not Empty then
Head := (Head Mod Max_queue) + 1;
End;
Queue (antrian) adalah salah satu list linier dari struktur data yang beroperasi denga
n cara First In First Out (FIFO) yaitu elemen pertama yang masuk merupakan elemen
yang pertama keluar. Data-data di dalam antrian dapat bertipe integer, real, record
dalam bentuk sederhana atau terstruktur. Queue dilakukan dengan cara penyisipan
di satu ujung, sedang penghapusan di ujung lain. Ujung penyisipan biasa disebut
rear/tail, sedang ujung penghapusan disebut front/head.
Sebuah queue dalam program setidaknya harus mengandung tiga variabel, yakni:
head untuk penanda bagian depan antrian, tail unttuk penanda bagian belakang antri
an, dan array data untuk menyimpan data-data yang dimasukkan ke dalam queue
tersebut.
Pada queue ada operasi – operasi dasar, yaitu: prosedur create untuk membuat
queue baru yang kosog, fungsi IsEmpty untuk mengecek queue tersebut kosong atau
tidak, fungsi IsFull untuk mengecek queue tersebut penuh atau tidak, prosedur
EnQueue untuk memasukkan data kedalam queue, prosedur DeQueue untuk mengel
uarkan sebuah elemen pada posisi head dari queue, fungsi clear untuk menghapus
elemen queue, dan prosedur tampil untuk menampilakn elemen yang ada pada
queue.
Ada beberapa queue, yaitu: queue dengan linear array yaitu queue yang dibuat
seakan-akan merupakan suatu garis lurus dengan satu pintu masuk dan satu pintu
keluar, queue dengan circular array yaitu queue yang dibuat seakan-akan merupakan
sebuah lingkaran dengan titik awal (head) dan titik akhir (tail) saling bersebelahan
jika array tersebut masih kosong, dan queue dengan linked-list.