Sabtu, 25 April 2009

MONITOR

Monitor merupakan konsep bahasa pemrograman yang memilki fungsi yang sama seperti semaphore, namun cukup mudah untuk dikontrol. Konsep pemrograman ini telah diimplementasikan di dalam sejumlah bahasa pemrograman, termasuk diantaranya Concurent Pascal,Pascal Plus, Modula-2, dan Modula-3. Terakhir konsep ini diimplementasikan pada program library. Implementasi dari monitor ini memungkinkan orang untuk menaruh kunci monitor pada sembarang objek. Khususnya untuk sesuatu yang berupa linked list. Anda dapat mengunci semua linked list hanya dengan satu buah kunci, atau satu kunci untuk sebuah linked list, atau satu kunci untuk setiap elemen dari sebuah list.

Monitor dan Sinyal
Monitor merupakan modul software yang terdiri dari sebuah procedure atau lebih, sejumlah inisialisasi, dan juga data lokal. Karakteristik utama sebuah sinyal adalah sebagai berikut :
1. Variabel data lokal hanya bisa diakses oleh prosedur monitor dan tidak dapat diproses oleh prosedur eksternal.
2. Suatu proses memasuki sebuah monitor dengan cara memanggil salah satu prosedurnya.
3. Pada suatu saat tertentu hanya sebuah proses yang dapat melakukan eksekusi di dalam monitor. Proses lainnya yang telah memanggil monitor dihentikan, menunggu monitor dapat dilakukan kembali.

Dua karakteristik pertama mirip dengan karakteristik objek dalam Pemrograman Berbasis Objek. Disamping itu sistem operasi atau bahasa pemrograman yang berorientasi objek telah siap untukmengimplementasikan monitor sebagai objek dengan karakteristik khusus.
Dengan menjalankan disiplin satu proses pada suatu saat tertentu, monitor dapat memberikan fasilitas mutual exclusion. Variabel data dalam monitor dapat diakses oleh hanya sebuah proses pada suatu saat tertentu. Jadi struktur databagi-pakai dapat diproteksi dengancara menaruhnya di dalam Monitor. Apabila data di dalam monitor merepresentasikan beberapa sumber daya, monitor menyediakan fasilitas mutual exclusion untuk mengakses sumber daya tersebut.
Agara berguna untuk pengolahan secara konkuren, monitor harus mencakup alat sinkronisasi. Misalnya, anggap sebuah proses memanggil monitor dan pada saat berada di dalam monitor, harus dihentikan sampai beberapa syarat tertentu dipenuhi. Fasilitas yang diperlukan prosesbukan hanya menghentikan namun juga melepaskan monitor sehingga proses lainnya dapat masuk. Kemudian pada saat syarat terpenuhi dan monitor kembali dapat digunakan, maka proses perlu dilanjutkan dan diizinkan masuk kembali kedala m monitor dari posisi penghentiannya.
Monitor mandukung sinkronisasi dengan menggunakan variabel kondisi yang berada di dalam monitor dan hanya dapat diakses didalam monitor. Dua fungsi beroperasi pada variabel kondisi tersebut adalah sebagai berikut :
o cwait (c) : menghentikan eksekusi yang mamanggil pada kondisi c. Sekarang monitor dapat digunakan oleh proses lainnya.
o csignal (c) : melanjutkan eksekusi beberapa proses yang dihentikan setelah cwait pada kondisi yang sama. Apabila terdapat beberapa proses yang seperti itu, pilih salah satu. Apabila tidak tidak ada proses yang seperti itu, maka tidak perlu melakukan apapun.

Perlu diingat bahwa operasi wait / sinyal monitor berbeda dengan operasi wait / signal pada semaphore. Apabila suatu proses di dalam monitor mengeluarkan sinyal dan tidak ada task yang menunggu variable kondisi, sinyal tersebut akan hilang.
Walaupun proses dapat memasuki monitor dengan cara memanggil prosedur, kita dapat menganggap monitor sebagai sebuah pintu masuk yang dijaga sehingga hanya sebuah proses yang dapat masuk ke dalam monitor pada suatu saat. Poses lainnya yang berusaha memasuki monitor berkumpul di dalam antrian proses yang dihentikan untuk menunggu monitor ke dalam keadaan siap digunakan kembali. Sekali berada di dalam monitor, proses dapat berhenti sendiri pada kondisi x dengan menentukan cwait(x); hal ini ditempatkan pada antrian proses menunggu untuk masuk kembali ke monitor apabila kondisi berubah.
Apabila suatu proses yang sedang melakukan eksekusi di dalam monitor mengetahui adanya perubahan variable kondisi x, proses tersebut mengeluarkan csignal (x),yang memperingatkan antrian kondisi bahwa kondisi telah berubah.
Modul monitor , boundedbuffer , mengontrol buffer yang digunakan untuk menyimpan dan mencari karakter – karakter. Monitor itu terdiri dari dua variable kondisi : karakter ke dalam buffer dan notempty adalah benar apabila terdapat sedikitnya sebuah karakter di dalam buffer.
Producer dapat menambah karakter ke buffer hanya dengan menggunakan producer append yang berada di dalam monitor; producer tidak memiliki akses langsung ke buffer. Pertama – tama prosedur memeriksa kondisi notfull untuk menentukan apabila terdapat ruang kosong yang bisa digunakan di dalam buffer. Apabila tidak terdapat ruangan, maka proses yang sedang melakukan eksekusi monitor akan dihentikan pada kondisi itu. Proses lainnya (producer atau consumer) sekarang dapat masuk ke dalam monitor. Setelah itu, pada saat buffer tidak penuh, proses yang dihentikan dapat dikeluarkan dari antrian, diaktivasi lagi dan melanjutkan pengolahan. Setelah menempatkan karakter di dalam buffer, proses mengeluarkan sinyal kondisi notempty. Penjelasan yang sama dapat dilakukan bagi fungsi consumer.
Contoh ini akan menjelaskan pembagian tanggung jawab pada monitor bila dibandingkan dengan semaphore. Paa kasus monitor, konsep monitor itu sendiri menjalankan mutual exclusion, jadi tidaklah mungkin consumer dan producer mengakses buffer secara simultan. Akan tetapi, pemrograman harus menaruh primitive cwait dan csignal yang tepat di dalam monitor untuk mencegah proses agar tidak menyimpan item di dalam buffer yang telah penuh atau mengambil item dari buffer yang telah kosong. Pada kasus semaphore, mutual exclusion dan sinkronisasi merupakan tanggung jawab pemrogram.
Suatu proses keluar dari monitor segera setelah pengeksekusian fungsi csignal. Apabila csignal tidak terjadi pada akhir prosedur , maka di dalam proposal Hoare, proses yang mengeluarkan signal akan ditunda agar monitor dapat digunakan dan ditaruh di antrian sampai monitor berada dalam keadaan bebas. Salah satu kemungkinan di sini adalah menempatkan proses yang telah dihentikan pada pintu masuk antrian, sehingga proses tersebut akan bersaing untuk mendapatkan akses dengan proses lainnya yang belum memasuki monitor. Namun, karena proses yang dihentikan pada fungsi csignal telah melaksanakan sebagian tugasnya di dalam monitor, akan beralasan apabila memberikan kesempatan terlebih dahulu terhadap proses tersebut dibandingkan dengan memberikan kesempatan kepada proses – proses yang baru masuk dengan membuat antrian urgent yang terpisah. Sebuah bahasa yang menggunakan monitor, Concurrent Pascal, mengharuskan bahwa csignal hanya akan muncul pada operasi yang terakhir dieksekusi oleh procedure monitor.
Apabila tidak ada proses yang menunggu pada kondisi x, eksekusi csignal (x) tidak akan berpengaruh.
Seperti halnya dengan semaphore , mungkin saja terjadi kesalahan pada fungsi sinkronisasi monitor. Misalnya, apabila salah satu fungsi csignal di dalam monitor boundedbuffer diabaikan, proses yang memasuki antrian kondisi yang terkait akan terputus selamanya. Kelebihan monitor dibandingkan dengan semaphore adalah bahwa seluruh fungsi sinkronisasinya terikat pada monitor. Karena itu, akan lebih mudah untuk mengetahui bahwa sinkronisasi telah dilakukan dengan benar dan untuk mendeteksi adanya bug. Selain itu, apabila monitor telah diprogram dengan benar, akses ke sumber daya yang diproteksi adalah benar bagi akses dari seluruh prosesnya. Sebaliknya, akses sumber daya adalah benar hanya apabila semua proses yang mengakses sumber daya telah diprogram dengan benar.






Monitor dengan Notify dan Broadcast

Definisi monitor dari Hoare [HOAR74] mengharuskan bahwa apabila terdapat sedikitnya sebuah proses di dalam antrean kondisi, proses yang berasal dari antrean itu akan segera beroperasi apabila proses lainnya mengeluarkan csignal untuk kondisi itu. Jadi, proses yang mengeluarkan csignal harus segera keluar dari monitor atau dihentikan di monitor.
Terdapat beberapa kelemahan pendekatan ini:
1. Apabila proses yang mengeluarkan csignal tidak dikerjakan dengan monitor, maka diperlukan dua peralihan proses tambahan: satu peralihan untuk menunda proses tersebut dan peralihan lainnya untuk melanjutkannya kembali apabila monitor sudah dapat digunakan lagi.
2. Penjadwalan proses yang berkaitan dengan sinyal harus sangat reliabel. Pada saat csignal dikeluarkan, proses dari antrian kondisi tertentu harus segera diaktivasi dan scheduler harus menjamin bahwa tidak ada proses lainnya yang akan masuk masuk ke dalam monitor sebelum pengaktifan itu. Apabila tidak ada csignal yang dikeluarkan, kondisi dimana proses telah diaktivasi tidak akan berubah.
Lampson dan Redell membuat definisi monitor yang berbeda bagi bahasa Mesa [LAMP80]. Pendekatan yang mereka buat dapat mengatasi maslah-masalah dan memiliki kelebihan-kelebihan lainnya. Mesa juga digunakan pada bahasa pemograman sistem Modula-3 [NELS91]. Dalam Mesa, primitive-primitive csignal diganti dengan cnotify.
Pernyataan if diganti oleh loop while.jadi organisasi ini akan mengakibatkan sedikitnya sebuah evalusi ekstra terhadap variabel kondisi. Akan tetapi, tidak terdapat peralihan proses tambahan dan tidak ada halangan pada saat proses yang sedang menunggu harus mengejar cnotify.
Dengan aturan bahwa proses diperingatkan dan bukannya diaktivasi secara paksa, maka dimungkinkan untuk menambahkan primitive broadcast ke repertoire. Broadcast akan mengakibatkan seluruh proses yang sedang menunggu suatu kondisi akan ditempatkan pada keadaan Ready. Dalam hal ini, apabila producer menambahkan suatu blok karakter ke buffer, producer tidak perlu mengetahui jumlah karakter yang akan diambil oleh setiap consumer yang sedang menunggu.
Disamping itu, broadcast dapat digunakan pada saat proses akan menemukan kesulitan dalam mengatasi secara tepat proses mana yang akan diaktivasi. Sebagai contoh memori manager. Manager memiliki j byte yang berada dalam keadaan bebas; suatu proses akan membebaskan k byte lagi, namun tidak mengetahui proses yang sedang menunggu yang akan melanjutkan tugasnya dengan total k + j byte; karena itu proses tersebut menggunakan broadcast, dan semua proses akan memeriksanya sendiri apakah tersedia memori yang mencukupi.


Beritahu dengan syarat dan Kondisi Broadcast petunjuk digunakan untuk bangun menunggu proses pada kondisi variabel. J memberitahu bergerak entri pertama pada kondisi antrian ke antrian siap. J siaran membuat semua entri pada antrian siap.
NC Notify Condition NC Beritahu Kondisi

NC: PROCEDURE = NC: PROSEDUR =
BEGIN BEGIN
c: LONG POINTER TO Condition = Popbong[]; c: LONG Pointer UNTUK Kondisi Popbong = [];
cond: Condition; MinimalStack[]; cond: Kondisi; MinimalStack [];
CleanupCondition[c]; CleanupCondition [c];
cond cond Fetch[c] Fetch [c] ; ;
IF cond.tail # PsbNull THEN JIKA cond.tail # PsbNull LALU
BEGIN BEGIN
WakeHead[c]; WakeHead [c];
Reschedule[]; Reschedule [];
END; END;
END; END;

Jika kondisi antrian kosong, yang telah memberitahu tidak berpengaruh kecuali untuk membersihkan antrian.
BC Broadcast Condition BC Broadcast Kondisi

BC: PROCEDURE = BC: PROSEDUR =
BEGIN BEGIN
c: LONG POINTER TO Condition = PopLong[]; c: LONG Pointer UNTUK Kondisi PopLong = [];
requeue: BOOLEAN; requeue: Boolean;
MinimalStack[]; MinimalStack [];
CleanupCondition[c]; CleanupCondition [c];
FOR cond: Condition UNTUK cond: Kondisi Fetch[c] Fetch [c] , cond , Cond Fetch[c] Fetch [c]
WHILE con.dtail # PsbNull DO SAAT con.dtail # DO PsbNull
WakeHead[c]; WakeHead [c];
requeue requeue TRUE; TRUE;
ENDLOOP; ENDLOOP;
IF requeue THEN Reschedule[]; JIKA requeue LALU Reschedule [];
END; END;

Sebelumnya rutin melakukan sama dengan yang Beritahu pada setiap proses pada kondisi antrian. WakeHead digunakan untuk menghapus ketua antrian setiap waktu sekitar lingkaran. Jika kondisi antrian kosong, yang disiarkan tidak memiliki efek kecuali cleanup antrian.
Berikut ini rutin digunakan oleh Beritahu petunjuk dan broadcast, dan rutin NotifyWakeup.

WakeHead: PROCEDURE [c: LONG POINTER TO Condition] = WakeHead: PROSEDUR [c: LONG Pointer UNTUK Condition] =
BEGIN BEGIN
cond: Condition = Fetch[c] cond: Kondisi fetch = [c] ; ;
link: Psbtink = Fetch[@PDA.block[cond.tail].link] link: Psbtink = fetch [@ PDA.block [cond.tail]. link] ; ;
flags: PsbFlags flag: PsbFlags Fetch[@PDA.block[link.next].flags] Fetch [PDA.block @ [link.next]. Flag] ; ;
flags.waiting flags.waiting FALSE; FALSE;
Store[@PDA.block[link.next].flags] Toko [@ PDA.block [link.next]. Flag] + flags; + Flag;
Store[@PDA.block[link.next].timeout] Toko [@ PDA.block [link.next]. Timeout] +O; + O;
Requeue[src: c, dst: @PDA.ready, psb: link.next]; Requeue [src: c, dst: @ PDA.ready, psb: link.next];
END; END;

WakeHead juga membersihkan nilai timeout di proses, sehingga tidak akan keluar sementara waktu berjalan.

void append (char x) {
while (count == N) /*buffer is full; avoid overflow*/
cwait (notfull);
buffer [nextin] = x;
nextin = (nextin+1) % N;
count++; /*one more item in buffer*/
cnotify (notempty); /*notify any waiting consumer*/
}

void take (char x) {
while (count ==0)
cwait (notempty); /*buffer is empty; avoid underflow*/
x=buffer [nextout];
nexout = (nextout+1) % N;
count--; /*one fewer item in buffer*/
cnotify (notfull); /*notify any waiting producer*/
}
Kelebihan monitor dari Lompson/ Redell dibandingkan dengan monitor dari Hoare adalah :
1. Pendekatan Lompson/ Redell lebih tahan tehadap adanya kesalahan.
Pada pendekatan Lampson/ Redell , setiap prosedur memeriksa variable monitor setelah diberi sinyal, dengan menggunakan konsep while, suatu proses dapat memberikan sinyal/ broadcast secara salah tanpa menyebabkan eror dalam program yang diberi sinyal. Program yang diberi sinyal akan memeriksa variable yang relevan dan apabila kondisi yang diinginkan tidak dipenuhi, maka akan dilanjutkan.
2. Monitor Lompson/ Redell mengandalkan pendekatan yang lebih modular bagi konstruksi programnya.
Pada implementasi buffer allocator, terdapat dua tingkat kondisi yang perlu dipenuhi untuk kooperasi proses sekuential, yaitu :
a. Struktur data yang konsisten
Monitor melaksanakan mutual exclusion dan menyelesaikan operasi input dan output sebelum mengizinkan operasi lainnya pada buffer.
b. Level 1
Memori yang mencukupi agar proses ini dapat menyelesaikan permintaan alokasinya.
Pada monitor Hoare, setiap sinyal membawa kondisi tingkat 1, tetapi juga mengandung pesan implisit. Dimana sinyal implicit ini membawa kondisi tingkat 2. Bila kemudian program mengubah definisi kondisi tingkat 2, maka diperlukan ppembuatan ulang seluruh program proses pensignalan. Bila program akan mengubah asumsi yang dibuat oleh proses tertentu yang sedang menunggu, mungkin perlu pembuatan ulang seluruh program proses pensignalan. Cara ini tidak modular dan mudah menyebebkan eror sinkronasi (misalnya wake up by mistake) pada saat kode dimodifikasi. Pemrograman perlu mengingat perubahan semua proses setiap kali perubahan dilakukan terhadap kondisi tingkat 2.
Dengan menggunakan monitor Lompson/ Redell, broadcast akan menjamin kondisi tingkat 1 dan membawa suatu isyarat bahwa tingkat 2 dapat dipertahankan (setiap proses perlu memeriksa kondisi tingkat 2 itu sendiri). Bila perubahan dilakukan di tingkat 2 baik waiter maupun signaler, tidak ada kemungkinan erroneous wake up karena setiap prosedur memeriksa kondisi tingkat 2 miliknya sendiri. Sehingga tingkat 2 dapat disembunyikan di dalam setipa prosedur.
Pada monitor Hoare, kondisi tingkat 2 harus dibawa dari waiter ke dalam kode setiap proses pensignalan, yang melanggar prinsip abstraksi data dan prinsip modularitas antar prosedur.
//tambahan