• Tidak ada hasil yang ditemukan

Algoritma Tukang Roti

Dalam dokumen Kumpulan Makalah | Blogger Lampung Tengah SO (Halaman 156-161)

Gambar 19.3. Algoritma III

19.5. Algoritma Tukang Roti

Algoritma Tukang Roti adalah solusi untuk masalah critical section pada n-buah proses. Algoritma ini juga dikenal sebagai Lamport's Baker Algorithm. Ide algoritma ini adalah dengan menggunakan prinsip penjadwalan seperti yang ada di tempat penjualan roti. Para pelanggan yang ingin membeli roti sebelumnya harus mengambil nomor urut terlebih dahulu dan urutan orang yang boleh membeli ditentukan oleh nomor urut yang dimiliki masing-masing pelanggan tersebut.

Prinsip algoritma ini untuk menentukan proses yang boleh mengakses critical section sama seperti ilustrasi tukang roti diatas. Proses diibaratkan pelanggan yang jumlahnya n-buah dan tiap proses yang membutuhkan critical section diberi nomor yang menentukan proses mana yang diperbolehkan untuk masuk kedalam critical section. Nomor yang diberikan adalah sekuensial atau terurut, tapi seperti juga nomor urut yang ada di tukang roti, tidak ada jaminan bahwa tiap proses mendapat nomor urut yang berbeda. Untuk mengatasinya digunakan parameter lain yaitu proses ID. Dikarenakan tiap proses memiliki proses ID yang unik dan terurut maka dapat dipastikan hanya satu proses yang dapat mengakses critical section dalam satu waktu. Proses yang dapat mengakses

critical section terlebih dahulu adalah proses yang memiliki nomor urut paling kecil. Apabila ada

beberapa proses yang memiliki nomor yang sama maka proses yang mempunyai nomor ID paling kecil yang akan dilayani terlebih dahulu.

19.6. Rangkuman

Solusi critical section harus memenuhi ketiga syarat berikut: 1. Mutual Exclusion

2. Progress

3. Bounded Waiting

Algoritma I dan II terbukti tidak dapat memecahkan masalah critical section untuk dua proses karena tidak memenuhi syarat progress dan bounded waiting. Algoritma yang dapat menyelesaikan masalah critical section pada dua proses adalah Algoritma III. Sedangkan untuk masalah critical

section pada n-buah proses dapat diselesaikan dengan menggunakan Algoritma Tukang Roti

Rujukan

[Silberschatz2005] Avi Silberschatz, Peter Galvin, dan Grag Gagne. 2005. Operating Systems

Concepts. Seventh Edition. John Wiley & Sons.

[Tanenbaum1997] Andrew S Tanenbaum dan Albert S Woodhull. 1997. Operating Systems Design

and Implementation. Second Edition. Prentice-Hall. Algoritma Tukang Roti

[WikiCS2007] Wikipedia, The Free Encyclopedia. 2007. Critical Section http:// en.wikipedia.org/

wiki/ Critical Section . Diakses 5 Maret 2007. Rangkuman

Bab 20. Perangkat Sinkronisasi

20.1. Pendahuluan

Sinkronisasi adalah proses pengaturan jalannya beberapa proses pada saat yang bersamaan. Tujuan utama sinkronisasi adalah menghindari terjadinya inkonsistensi data karena pengaksesan oleh beberapa proses yang berbeda (mutual exclusion) serta untuk mengatur urutan jalannya proses-proses sehingga dapat berjalan dengan lancar dan terhindar dari deadlock atau starvation. Sinkronisasi umumnya dilakukan dengan bantuan perangkat sinkronisasi. Dalam bab ini akan dibahas beberapa perangkat sinkronisasi, yaitu :TestAndSet(), Semafor, dan Monitor.

20.2. TestAndSet()

Sebagian besar sistem komputer saat ini menyediakan instruksi-instruksi perangkat keras khusus yang mengizinkan kita untuk menguji dan memodifikasi nilai dari sebuah variabel. Instruksi ini disebut instruksi TestAndSet(). Instruksi ini bersifat atomik, yaitu instruksi yang tidak dapat diinterupsi. Kita dapat menggunakan instruksi khusus ini untuk memecahkan masalah critical

section yang sederhana. Contoh instruksiTestAndSet():

Contoh 20.1. TestAndSet()

boolean TestAndSet (boolean *target) { boolean rv = *target;

*target = TRUE; return rv; }

Karakteristik penting dari instruksi ini adalah pengeksekusian instruksi secara atomik. Jadi, jika dua instruksi TestAndSet() dijalankan secara serentak, kedua instruksi tersebut akan dieksekusi secara sekuensial. Dengan mendeklarasikan variabel lock, kita dapat mengimplementasikan

mutual exclusion seperti pada contoh berikut ini:

Contoh 20.2. TestAndSet() dengan mutual exclusion

do {

while (TestAndSetLock (&lock)) ; // do nothing

// critical section lock = FALSE;

// remainder section } while (TRUE);

Walaupun algoritma di atas memenuhi persyaratan mutual exclusion, algoritma tersebut belum memenuhi persyaratan bounded waiting.

InstruksiTestAnd Set()di bawah ini sudah memenuhi semua persyaratan critical section.

Contoh 20.3. TestAndSet() yang memenuhi critical section

do {

waiting[i] = TRUE; key = TRUE;

while (waiting[i] && key) key = TestAndSet (&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);

Sebelumnya kita harus meginisialisasikan dua variabelboolean.

boolean waiting[n]; boolean lock;

Kedua variabel tersebut diinisialisasikan menjadi false. Untuk membuktikan bahwa persyaratan

mutual exclusion terpenuhi, proses Pidapat memasuki critical section-nya hanya jikawaiting[i] == false atau key == false. Nilai dari key menjadi false hanya jika

TestAndSet()dieksekusi. Proses pertama yang mengeksekusi TestAndSet() akan menemukan key == false sehingga proses lain harus menunggu. Variabel waiting[i]

menjadi false hanya jika proses lain meninggalkan critical section-nya. Untuk menjaga persyaratan mutual exclusion terpenuhi, hanya ada satuwaiting[i]yang disetfalse.

Untuk membuktikan persyaratan progress terpenuhi, kita lihat pembuktian untuk mutual exclusion. Sebuah proses keluar dari critical section-nya pada saat lock diset false atau waiting[j]

diset false. Keduanya mengizinkan sebuah proses yang sedang menunggu untuk masuk ke

critical section.

Untuk membuktikan persyaratan bounded waiting terpenuhi, kita perhatikan bahwa ketika sebuah proses meninggalkan critical section-nya, proses tersebut melihat array of waiting dalam urutan siklus (i + 1, i + 2, ..., n - 1, 0, ..., i - 1). Proses pertama yang berada dalam enter section

(waiting[j] == true)adalah proses selanjutnya yang akan memasuki critical section.

20.3. Semafor

Dalam kehidupan nyata, semafor adalah sistem sinyal yang digunakan untuk berkomunikasi secara

visual. Dalam software, semafor adalah sebuah variabel bertipe integer yang selain saat inisialisasi, hanya dapat diakses melalui dua operasi standar, yaitu increment dan decrement. Semafor digunakan untuk menyelesaikan masalah sinkronisasi secara umum. Berdasarkan jenisnya, semafor hanya bisa memiliki nilai 1 atau 0, atau lebih dari sama dengan 0. Konsep semafor pertama kali diajukan idenya oleh Edsger Dijkstra pada tahun 1967.

Operasi standar pada semafor (dalam bahasa pemrograman C):

void kunci(int sem_value) { while(sem_value <= 0); sem_value--;

}

void buka(int sem_value) { sem_value++;

}

Nama asli dari operasi tersebut sebenarnya adalah Proberen (test) dan Verhogen (increment). Namun, sebutan untuk 2 method ini sangat beragam, antara lain sering dikenal dengan nama :release dan acquire, P dan V , serta kunci dan buka. Dalam buku ini akan digunakan istilahbukadankunci. Fungsiwaitdipanggil ketika thread akan memasuki critical section-nya atau ketika thread akan memakai resource yang tersedia. Jika sem_value kurang dari sama dengan 0, thread tersebut harus menunggu sampai thread lain memanggil fungsi buka. Fungsi

bukadipanggil ketika thread meningggalkan critical section-nya atau ketika melepaskan resource yang telah digunakannya. Tentu saja kedua operasi tersebut harus bersifat atomik karena

sem_valuedapat diakses oleh beberapa proses (shared resource). Semafor memiliki dua jenis, yaitu:

1. Binary semaphore. Semafor ini hanya memiliki nilai 1 atau 0. Sering juga disebut sebagai semafor primitif

2. Counting semaphore. Semafor ini memiliki nilai 0, 1, serta integer lainnya. Banyak sistem operasi yang tidak secara langsung mengimplementasikan semafor ini, tetapi dengan memanfaatkan binary semaphore

Dalam dokumen Kumpulan Makalah | Blogger Lampung Tengah SO (Halaman 156-161)