Anda di halaman 1dari 9

Bab 26.

Readers/Writers
Achmad Hariyadi Indra Firmancahya Komentar Umum: Secara umum bab ini sudah menjelaskan tentang readers/writers bahwa semafor tetap akan digunakan dalam program readers/writers. Bab ini terdiri dari 5 bab, yaitu Pendahuluan, Penggunaan, Semafor, Program, Penjelasan Program, dan Rangkuman. Bab ini juga membahas tentang penggunaan semafor sebagai penentu thread mana yang akan menulis dan thread mana yang akan membaca. Hal tersebut dimaksudkan untuk sinkronisasi antara thread yang satu dengan thread yang lain yang sedang berjalan bersamaan. Hubungannya dengan bab sebelumnya: Bab sebelumnya, bab 25, menggunakan semafor untuk sinkronisasi konsumen produsen. Sedangkan bab 26 ini menggunakan semafor untuk sinkronisasi readers/writers. Hubungannya adalah kedua bab sama-sama menggunakan semafor. Hubungannya dengan bab selanjutnya: Bab 26 ini berhubungan dengan bab 27 pada bagian semafor. Bab 26 menggunakan semafor untuk melakukan sinkronisasi dengan readers/writers. Sedangkan bab 27 menggunakan semafor untuk sinkronisasi pemain yang melakukan hompimpah. Komentar kelengkapan per bagian: 26.1 Pendahuluan Subbab ini sudah cukup jelas sebagai pengantar bahwa bab 26 akan membahas masalah yang timbul pada readers/writers. Pada bagian ini juga disertakan pengertian tentang apa itu reader/writer serta kondisi yang harus dipenuhi oleh reader/writer agar tidak terjadi korupsi data. 26.2 Penggunaan Semafor Subbab ini sudah cukup jelas bahwa semafor hanya dapat diakses dengan dua method, yaitu: 1. P(porheben) (atau wait(), tunggu(), dan lain-lain).Berfungsi sebagai increment method. 2. V(vendorhen) (atau signal(), sinyal(), dan lain-lain).Berfungsi sebagai decrement method. Pada masing-masing method tersebut telah dilengkapi dengan implementasi dalam kode bahasa Java. 26.3 Program Subbab ini sudah cukup menjelaskan contoh program readers/writers yang menggunakan semafor. Namun pada baris 158 yang berada pada Class Database terdapat dua kali tanda Copyright Sistem Operasi : Silakan merevisi dan memperbanyak materi ini. 0606031433 0606101502

semicolon, walaupun tidak mempengaruhi jalannya program tersebut, sebaiknya satu semicolon saja karena sudah cukup memenuhi sebagai penanda statement. Selain itu, di bagian diberikan contoh output program. Sebaiknya subbab bagian contoh keluaran dicetak tebal dan diberi baris baru di bawahnya untuk menjelaskannya. 26.4 Penjelasan Program Subbab ini sudah cukup menjelaskan statement-statement pada masing-masing class yang ada dalam program readers/writers tersebut. 26.5 Rangkuman Subbab ini sudah merangkum makna dan inti dari bab 26 ini bahwa jika ada suatu thread yang melakukan write, maka thread yang lain tidak dapat melakukan write maupun read. Namun, jika ada suatu thread yang melakukan read, maka thread yang lain pun juga bisa melakukan read.

Usulan Kelengkapan: Bab ini sudah cukup lengkap tentang materi readers/writers. Dan juga bab ini sudah cukup jelas membahas tentang semafor. Usulan kelengkapan untuk tata bahasa sebaiknya mesti diperhatikan lagi seperti kurangnya konjungsi dan untuk kalimat asing dicetak miring.

Copyright Sistem Operasi : Silakan merevisi dan memperbanyak materi ini.

Bab 26. Readers/Writers Pendahuluan


Masalah Readers-Writers merupakan masalah klasik dalam sinkronisasi. Solusi dari masalah ini diperlukan untuk dapat menjaga konsistensi data. Banyak thread bisa berbagi sumber daya penyimpanan yang sama. Ada thread yang membaca, ada juga yang menulis. Thread yang membaca disebut readers (pembaca), sedangkan yang menulis disebut writers (penulis). Jika lebih dari satu thread mengakses data yang sama pada satu waktu, bisa terjadi korupsi data. Kondisi yang harus dipenuhi agar tidak terjadi korupsi data adalah : 1. Sebuah objek data bisa dibaca oleh beberapa thread secara simultan. . 2. Sebuah objek data yang sedang ditulis oleh sebuah thread tidak dapat dibagi aksesnya kepada thread yang lain baik pembaca maupun penulis. Writer harus memiliki akses yang eksklusif terhadap suatu objek data, sehingga tidak boleh ada proses lain yang mengakses sebuah objek yang sedang diakses oleh writer.

Penggunaan Semafor
Semaphore adalah sebuah variabel bertipe integer yang selain saat inisialisasi, hanya dapat diakses melalui dua method, yaitu : 1. P() (atau wait(), tunggu(), dan lain-lain). Berfungsi sebagai increment method 2. V() (atau signal(), sinyal(), dan lain-lain). Berfungsi sebagai decrement method. Jika method P() dipanggil, thread yang memanggilnya akan melakukan wait() (yang ada di dalam method P()) sampai di-notify(). notify() itu sendiri berada di dalam method V(), sehingga thread akan bisa mulai melakukan sesuatu pada objek data jika method V() telah dipanggil. Pada program Reader/Writer, Semaphore digunakan untuk sinkronisasi antar readers atau antar writers atau antar readers dengan writers. Implementasinya dalam kode bahasa Java
public synchronized void P() { while (value <= 0) { try { wait(); } catch (InterruptedException e) { } } value--; } public synchronized void V() { ++value; notify(); }

Copyright Sistem Operasi : Silakan merevisi dan memperbanyak materi ini.

Program
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 /*_______________________________________________________*/ /*class ReaderWriterServer_______________________________*/ /*_______________________________________________________*/ public class ReaderWriterServer { public static void main(String args[]) { Database server = new Database(); Reader[] readerArray = new Reader[NUM_OF_READERS]; Writer[] writerArray = new Writer[NUM_OF_WRITERS]; for (int i = 0; i < NUM_OF_READERS; i++) { readerArray[i] = new Reader(i, server); readerArray[i].start(); } for (int i = 0; i < NUM_OF_WRITERS; i++) { writerArray[i] = new Writer(i, server); writerArray[i].start(); } } private static final int NUM_OF_READERS = 3; private static final int NUM_OF_WRITERS = 2; } /*_______________________________________________________*/ /*class Reader___________________________________________*/ /*_______________________________________________________*/ class Reader extends Thread { public Reader(int r, Database db) { readerNum = r; server = db; } public void run() { int c; while (true) { Database.napping(); System.out.println("reader " " wants to read."); c = server.startRead(); System.out.println("reader " " is reading. Reader Count = Database.napping(); System.out.print("reader " + " is done reading. "); c = server.endRead(); } } private Database server; private int readerNum; }

+ readerNum + + readerNum + " + c); readerNum +

/*_______________________________________________________*/

Copyright Sistem Operasi : Silakan merevisi dan memperbanyak materi ini.

060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120

/*class Writer___________________________________________*/ /*_______________________________________________________*/ class Writer extends Thread { public Writer(int w, Database db) { writerNum = w; server = db; } public void run() { while (true) { System.out.println("writer " " is sleeping."); Database.napping(); System.out.println("writer " " wants to write."); server.startWrite(); System.out.println("writer " " is writing."); Database.napping(); System.out.println("writer " " is done writing."); server.endWrite(); } } private Database server; private int writerNum; }

+ writerNum + + writerNum + + writerNum + + writerNum +

/*_______________________________________________________*/ /*class Semaphore________________________________________*/ /*_______________________________________________________*/ final class Semaphore { public Semaphore() { value = 0; } public Semaphore(int v) { value = v; } public synchronized void P() { while (value <= 0) { try { wait(); } catch (InterruptedException e) { } } value--; } public synchronized void V() { ++value; notify(); } private int value;

Copyright Sistem Operasi : Silakan merevisi dan memperbanyak materi ini.

121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175

} /*_______________________________________________________*/ /*class Database_________________________________________*/ /*_______________________________________________________*/ class Database { public Database() { readerCount = 0; mutex = new Semaphore(1); db = new Semaphore(1); } public static void napping() { int sleepTime = (int) (NAP_TIME * Math.random() ); try { Thread.sleep(sleepTime*1000); } catch(InterruptedException e) {} } public int startRead() { mutex.P(); ++readerCount; if (readerCount == 1) { db.P(); } mutex.V(); return readerCount; } public int endRead() { mutex.P(); --readerCount; if (readerCount == 0) { db.V(); } mutex.V(); System.out.println("Reader count = " + readerCount); return readerCount; } public void startWrite() { db.P(); } public void endWrite() { db.V(); } private int readerCount; Semaphore mutex; Semaphore db; private static final int NAP_TIME = 15; }

Copyright Sistem Operasi : Silakan merevisi dan memperbanyak materi ini.

Contoh keluaran. Contoh keluaran tidak mutlak seperti ini, bisa bervariasi, penyebab dari hal ini akan dijelaskan pada bagian Penjelasan Program.
writer writer writer writer reader writer reader writer reader reader reader reader reader reader reader reader reader writer writer reader reader reader reader writer writer writer writer writer writer reader reader reader reader writer reader reader reader reader writer reader writer reader reader reader writer writer writer writer writer reader reader reader reader writer reader 1 0 0 0 2 0 2 0 2 0 0 1 1 1 0 2 2 0 1 1 1 2 1 0 0 0 1 1 1 0 0 1 1 0 2 2 2 0 1 1 0 2 0 1 0 0 1 1 1 2 0 1 2 0 0 is sleeping. is sleeping. wants to write. is writing. wants to read. is done writing. is reading. Reader Count = 1 is sleeping. is done reading. Reader count = 0 wants to read. is reading. Reader Count = 1 wants to read. is reading. Reader Count = 2 is done reading. Reader count = 1 is done reading. Reader count = 0 wants to read. is reading. Reader Count = 1 wants to write. wants to write. wants to read. is reading. Reader Count = 2 is done reading. Reader count = 1 is done reading. Reader count = 0 is writing. is done writing. is sleeping. is writing. is done writing. is sleeping. wants to read. is reading. Reader Count = 1 wants to read. is reading. Reader Count = 2 wants to write. wants to read. is reading. Reader Count = 3 is done reading. Reader count = 2 is done reading. Reader count = 1 wants to write. is done reading.Reader count = 0 is writing. wants to read. wants to read. wants to read. is done writing. is sleeping. is writing. is done writing. is sleeping. is reading. Reader Count = 1 is reading. Reader Count = 2 is reading. Reader Count = 3 is done reading. Reader count = 2 wants to write. is done reading. Reader count = 1

Copyright Sistem Operasi : Silakan merevisi dan memperbanyak materi ini.

Penjelasan Program
Pada program readers/writers diatas, ada 5 class: ReaderWriterServer (baris 5-25). Kelas ini merupakan kelas yang memuat method main(). Kelas ini membuat 5 objek, 3 objek reader dan 2 objek writer serta menjalankan semua objek-objek tadi. Reader (baris 31-57) . Kelas ini berfungsi sebagai thread yang membaca data. Kelas ini sebelum mulai membaca akan mencetak "reader ... wants to read." terlebih dahulu kemudian memanggil method startRead() untuk mulai membaca, jika tidak ditahan pada salah satu semaphore (di kelas Database) akan ada output "reader ... is reading..."; kemudian setelah waktu yang acak (oleh Database.napping()) akan tercetak "reader ... is done reading..." dan memanggil method endRead() pada kelas Database untuk berhenti membaca. Writer (baris 63-90) . Kelas ini berfungsi sebagai thread yang menulis data. Kelas ini sebelum mulai akan tidur terlebih dahulu, lalu akan mencetak "writer ... wants to write." terlebih dahulu kemudian memanggil method startWrite() untuk mulai menulis, jika tidak ditahan pada semaphore db(di kelas Database) akan ada output "writer ... is writing..."; kemudian setelah waktu yang acak (oleh Database.napping()) akan tercetak "writer ... is done writing." dan memanggil method endWrite() pada kelas Database untuk berhenti menulis. Semaphore (baris 96-121) . Seperti yang sudah dijelaskan pada bagian sebelumnya, pada program ini, Semaphore digunakan untuk sinkronisasi antar readers atau antar writers atau antar readers dengan readers. Method yang ada pada kelas ini adalah method P() yang akan mencoba mengurangi nilai variabel value, variabel tersebut akan bisa dikurangi jika variabel tersebut bernilai lebih dari nol. Jika variabel value sama dengan atau kurang dari nol maka thread yang memanggil method ini akan memanggil method wait() yang membuatnya menunggu. Method ini berfungsi untuk menghalangi thread untuk tidak masuk ke dalam critical section. Method P() memanggil method wait() yang akan menyebabkan thread-thread yang akan memasuki critical section menunggu. Selain itu pada kelas ini terdapat method V() yang di dalamnya menambahkan nilai value sehingga nilainya tidak nol lagi, serta memanggil method notify(). Method notify() akan membangunkan salah satu thread yang sedang menunggu secara acak. Database (baris 127-176) . Kelas ini mengimplementasi semua pekerjaan yang dilaksanakan oleh kelas Writer dan kelas Reader. Kelas Database ini mempunyai 5 method yaitu napping(), startRead(), endRead(), startWrite(), dan endWrite(). Method napping() berfungsi membuat thread yang mengaksesnya akan memanggil method sleep() sehingga thread tersebut 'tertidur'. Waktu tidur tersebut acak dan tidak mutlak, hal ini menyebabkan output dari program akan bervariasi, tapi tetap memenuhi ketentuan. Method kedua adalah startRead(). Method ini mereturn sebuah int merepresentasikan jumlah reader yang sedang mengakses database pada saat itu. Dia hanya mengijinkan hanya satu reader pada satu waktu yang dapat mengakses readerCount dengan mengunci Semaphore mutex (dengan mutex.P()). Bila jumlah reader == 1 maka reader tersebut akan menutup Semaphore db (dengan db.P()) sehingga writer tidak diijinkan masuk untuk mengakses data. Method selanjutnya adalah endRead(). Method ini diakses oleh reader yang telah selesai mengakses data. Untuk mengurangi readerCount maka reader tersebut harus mengakses Semaphore mutex kembali. Jika nilai readerCount == 0, yang berarti sudah tidak ada lagi reader yang sedang mengakses data, maka reader memanggil method V() untuk membuka Semaphore db, sehingga writer yang sedang mengantri dapat masuk untuk mengakses data. Method selanjutnya adalah startWrite(). Method ini hanya memanggil satu method yaitu mengunci Semaphore db Copyright Sistem Operasi : Silakan merevisi dan memperbanyak materi ini.

(dengan db.P()). Hal ini dimaksudkan bila ada writer yang sedang mengakses data, maka tidak ada writer lain atau reader yang diperbolehkan masuk untuk mengakses data. Method endWrite() dipanggil oleh kelas writer yang telah selesai mengakses database. Method ini memanggil method V() untuk membuka Semaphore db sehingga reader atau writer lain dapat masuk untuk mengakses data.

Rangkuman
Readers/Writers merupakan sebuah masalah klasik dalam contoh sinkronisasi untuk menjaga validitas data. Jika reader sedang mengakses data, reader-reader yang lain boleh ikut mengakses data, tapi writer harus menunggu sampai data tidak diakses siapapun. Jika writer sedang mengakses data, tidak boleh ada thread lain yang mengakses data. Semaphore digunakan untuk sinkronisasi antar thread (baik readers maupun writers).

Rujukan
[Silberschatz2005] Avi Silberschatz, Peter Galvin, dan Grag Gagne. 2005. Operating Systems Concepts. Seventh Edition. John Wiley & Sons. [WEBWiki2007] From Wikipedia, the free encyclopedia. 2007. Readers-writers_problem http://en.wikipedia.org/wiki/Readers-writers_problem . Diakses 21 Maret 2007.

Copyright Sistem Operasi : Silakan merevisi dan memperbanyak materi ini.

Anda mungkin juga menyukai