Perangkat Keras dan Semafor

4.3. Perangkat Keras dan Semafor

4.3.1. Peran Perangkat Keras Dalam Proses Sinkronisasi

Sebelum adanya berbagai macam teknik sinkronisasi seperti saat ini, para programmer cenderung menggunakan fasilitas yang disediakan oleh perangkat keras dari komputer untuk melakukan sinkronisasi. Oleh karena itu maka perangkat keras memiliki peranan penting dengan masalah sinkronisasi. Para programmer tidak menggunakan pendekatan perangkat lunak, karena pendekatan tersebut cenderung sulit dan kompleks diimplementasikan. Selain itu dapat menyebabkan turunnya kinerja dari suatu produk yang dibuat.

4.3.2. Metode dalam sinkronisasi perangkat keras

Seperti yang telah kita ketahui bahwa untuk tercapainya sinkronisasi, salah satu syaratnya adalah harus tercipta suatu kondisi yang mutual exclusive, yaitu suatu kondisi dimana hanya ada sebuah proses yang sedang dieksekusi. Pada pendekatan perangkat keras ini ditekankan bagaimana caranya agar kondisi mutual exclusive itu tercapai.

Pendekatan dari sisi perangkat keras dapat dibagi menjadi dua:

1. Processor Synchronous

2. Memory Synchronous

Processor Synchronous

Central Processing Unit (CPU) mempunyai suatu mekanisme yang dinamakan interrupt. Di dalam sistem operasi, mekanisme ini digunakan secara intensif, atau dengan kata lain, banyak Konsep sistem operasi yang menggunakan mekanisme ini. Sebagai contoh: system call, process scheduling, dsb.

Berbicara mengenai sinkronisasi berarti kita mengasumsikan bahwa akan ada dua atau lebih proses yang sedang berjalan di komputer secara concurrent, atau dengan kata lain konsep time-shared sudah diimplementasikan di sistem operasi.

Sistem time-shared yang sering diimplementasikan dengan algoritma RR (Round Robin), memanfaatkan mekanisme interrupt di CPU. Jadi di dalam RR ada suatu satuan waktu yg dinamakan quantum yang mana setiap quantum dibatasi oleh satu software interrupt.

Teknisnya, akan ada suatu interrupt -- yang biasanya adalah timer interrupt -- yang secara berkala akan menginterrupt sistem. Pada saat interrupt dilakukan sistem operasi akan segera melakukan proses pergantian dari proses yang satu ke proses yang lainnya sesuai dengan algoritma.

Seperti yang telah diketahui bahwa untuk menghentikan instruksi tersebut kita memerlukan suatu mekanisme yang terdapat pada sistem operasi (baca mengenai process scheduling). Dan mekanisme tersebut sangat bergantung kepada mekanisme interrupt dari perangkat keras. Sehingga, jika kita dapat menon-aktifkan interrupt pada saat sebuah proses berada di dalam critical section maka permasalahan dari sinkronisasi dapat diselesaikan.

Ternyata para designer komputer melihat celah ini, sehingga saat ini hampir semua komputer yang ada telah mengimplementasikan instruksi mesin yang akan menon-aktifkan serfis interrupt, dan terdapat instruksi mesin lain yang kemudian akan mengaktifkan interrupt tersebut.

Sebagai contoh sederhana, kita akan melihat contoh program dari prosesor Atmel ARM tm (contoh ini diambil karena prosesor ini mudah didapatkan dan harganya tidak terlalu mahal, serta memiliki dev-kit, silahkan merujuk ke http://www.atmel.com (http://www.atmel.com)).

Gambar 4-7. Critical Section

mainModul: 00 CLI

’ masuk ke Critical Section dengan cara ’ men-disable interrupt

01 ADD r1,r2

’ Critical Section

’ Critical Section

03 SBI ’ pergi dari Critical Section dengan cara ’ meng-enable interrupt

’ Remainder Section

Pada baris ke 0, prosesor akan menon-aktifkan interrupt, yang menyebabkan instruksi-instruksi berikutnya tidak akan terganggu oleh interrupt. Kemudian setelah setelah baris 03 dieksekusi maka proses akan keluar dari critical section , yang menyebabkan prosesor mengaktifkan kembali interrupt dan mekanisme scheduling di sistem operasi dapat berjalan kembali.

Terlihat bahwa dengan mekanisme ini kita sudah cukup mengatasi isu yang ada. Tetapi ternyata mekanisme ini tidak dapat diterapkan dengan baik di lingkungan multiprocessor. Hal ini disebabkan jika kita menon-aktifkan Terlihat bahwa dengan mekanisme ini kita sudah cukup mengatasi isu yang ada. Tetapi ternyata mekanisme ini tidak dapat diterapkan dengan baik di lingkungan multiprocessor. Hal ini disebabkan jika kita menon-aktifkan

Memory Synchronous

Dilihat dari nama mekanismenya, maka kita sudah dapat memprediksi bahwa mekanisme ini menggunakan jasa dari memori. Hal tersebut benar adanya, mekanisme memory synchronous memakai suatu nilai yang disimpan di dalam memori, dan jika suatu proses berhasil mengubah nilai ini, maka proses tersebut akan meneruskan ke instruksi selanjutnya. Tetapi jika tidak, maka proses ini akan berusaha terus untuk mengubah nilai tersebut.

Jika dilihat dari paragraf di atas, mekanisme ini lebih cocok dikategorikan sebagai pendekatan dari perangkat lunak. Tetapi, jika kita perhatikan lebih lanjut, ternyata mekanisme ini memerlukan jasa dari perangkat keras. Mekanisme ini memiliki suatu syarat yang harus dipenuhi agar dapat berjalan sesuai dengan yang diinginkan yaitu perlunya perangkat keras mempunyai kemampuan untuk membuat suatu instruksi dijalankan secara atomik . Pengertian dari instruksi atomik adalah satu atau sekelompok instruksi yang tidak dapat diberhentikan sampai instruksi tsb selesai. Detil mengenai hal ini akan dibicarakan di bagian-bagian selanjutnya.

Sebagai contoh, kita dapat memperhatikan contoh program Java tm yang ada di bawah ini:

Gambar 4-8. testANDset

00 boolean testAndSet( boolean variable[] ) 01 { 02 boolean t = variable[0];

03 variable[0] = true; 04 return t; 05 } ..... 56 while (testAndSet(lock)) { /* do nothing */ } 57 // Critical Section

58 Lock[0] = false; 59 // Remainder Section

Metoda testAndSet haruslah bersifat atomik, sehingga method ini dianggap sebagai satu instruksi mesin. Perhatikan pada baris 56 dimana method ini dipakai. Pada baris ini proses berusaha untuk mengubah nilai dari variable reference lock. Jikalau ia tidak berhasil maka akan terus mencoba, tapi jika berhasil maka proses akan masuk ke bagian kritis dan setelah ini proses akan mengubah nilai dari lock sehingga memberikan kemungkinan proses lain untuk masuk.

Janganlah bingung dengan lock, boolean[], yang terkesan aneh. Hal ini bukanlah bagian dari sinkronisasi tetapi hanyalah suatu bagian dari konsep pass-by-reference dan pass-by-value dari Java tm , untuk lebih lanjut mengenai konsep ini dapat dibaca buku-buku programming Java tm . Satu catatan di sini adalah, contoh ini hanyalah sebuah ilustrasi dan tidak dapat dicompile dan dijalankan, karena Java tm konsep instruksi atomik di Java tm bersifat transparan dari sisi programmer (akan dijelaskan pada bagian-bagian selanjutnya).

Keunggulan dari memory synchronous adalah pada lingkungan multiprocessor, semua processor akan terkena dampak ini. Jadi semua proses yang berada di processor, yang ingin mengakses critical section, meskipun berada di processor yang berbeda-beda, akan berusaha untuk mengubah nilai yang dimaksud. Sehingga semua processor akan tersinkronisasi.

4.3.3. Instruksi Atomik

Seperti yang telah dijelaskan pada bagian sebelumnya, instruksi atomik adalah satu atau sekelompok instruksi yang tidak dapat diberhentikan sampai instruksi tersebut selesai. Kita telah memakai instruksi ini pada method testAndSet.

Instruksi yang dimaksud di sini adalah instruksi-instruksi pada high-level programming, bukanlah pada tingkat instruksi mesin yang memang sudah bersifat atomik. Sebagai contoh: i++ pada suatu bahasa pemrograman akan diinterpertasikan beberapa instruksi mesin yang bersifat atomik sebagai berikut:

00 Load R1,i ’ load nilai i ke register 1 01 Inc R1

’ tambahkan nilai register 1 dengan angka 1 02 Store i,R1 ’ simpan nilai register 1 ke i

Instruksi baris 00-02 bersifat atomik, tetapi i++ tidak bersifat atomik, mengapa? Sebagai contoh kasus, katakanlah sekarang processor baru menyelesaikan baris 01, dan ternyata pada saat tersebut interrupt datang, dan menyebabkan processor melayani interrupt terlebih dahulu. Hal ini menyebabkan terhentinya instruksi i++ sebelum instruksi ini selesai. Jikalau instruksi ini (i++) bersifat atomik, maka ketiga instruksi mesin tsb tidak akan diganggu dengan interrupt.

Perlu diketahui bahwa instruksi ini bukanlah seperti pada processor synchronous yang mana akan mematikan interrupt terlebih dahulu, tetapi instruksi ini sudah build-in di processor.

Designer processor dapat mengimplementasi konsep ini dengan dua cara yaitu:

1. mengimplementasi instruksi yang build-in

2. mengimplementasi processor mampu membuat suatu instruksi menjadi atomik.

Intel Pentium ternyata memakai cara yang kedua, yaitu dengan adanya suatu perintah LOCK-Assert. Dengan perintah ini maka semua instruksi dapat dijadikan atomik. Sedangkan SPARC dan IBM mengimplementasikan suatu rutin yang bersifat atomik seperti swap dan compareAndSwap.

4.3.4. Semafor

Telah dikatakan di atas bahwa pada awalnya orang-orang memakai konsep-konsep sinkronisasi yang sederhana yang didukung oleh perangkat keras, seperti pemakaian interrupt atau pemakaian rutin-rutin yang mungkin telah diimplementasi oleh perangkat keras.

Pada tahun 1967, Djikstra mengajukan suatu konsep dimana kita memakai suatu variable integer untuk menghitung banyaknya proses yang sedang aktif atau yang sedang tidur. Jenis variabel ini disebut semafor.

Tahun-tahun berikutnya, semafor banyak dipakai sebagai primitif dari mekanisme sinkronisasi yang lebih tinggi dan kompleks lagi. Sebagai contoh: monitor dari Java tm . Selain untuk hal tersebut, kebanyakkan semafor juga digunakan untuk sinkronisasi dalam komunikasi antar device perangkat keras.

Konsep semafor yang diajukan oleh Djikstra terdiri dari dua subrutin yang bernama P dan V. Nama P dan V berasal dari bahasa Belanda yang berarti Naik dan Turun atau Wait dan Signal. Untuk pembahasan kali ini, kita akan memakai Wait dan Signal.

Sub-rutin wait akan memeriksa apakah nilai dari semafor tersebut di atas 0. Jika ya, maka nilainya akan dikurangi dan akan melanjutkan operasi berikutnya. Jika tidak maka proses yang menjalankan wait akan menunggu sampai ada proses lain yang menjalankan subrutin signal.

Satu hal yang perlu diingat adalah subrutin wait dan signal haruslah bersifat atomik. Di sini kita lihat betapa besarnya dukungan perangkat keras dalam proses sinkronisasi.

Nilai awal dari semaphore tersebut menunjukkan berapa banyak proses yang boleh memasuki critical section dari suatu program. Biasanya untuk mendukung sifat mutual exclusive, nilai ini diberi 1.

Perlu ditekankan di sini, bahwa semafor bukan digunakan untuk menyelesaikan masalah critical section saja, melainkan untuk menyelesaikan permasalahan sinkronisasi secara umum.

4.3.5. Wait dan Signal

Seperti yang telah dikatakan di atas, bahwa di dalam subrutin ini, proses akan memeriksa harga dari semafor, apabila harganya 0 atau kurang maka proses akan menunggu, sebaliknya jika lebih dari 0, maka proses akan mengurangi nilai dari semaphore tersebut dan menjalankan operasi yang lain.

Arti dari harga semafor dalam kasus ini adalah hanya boleh satu proses yang dapat melewati subrutin wait pada suatu waktu tertentu, sampai ada salah satu atau proses itu sendiri yang akan memanggil signal.

Bila kita perhatikan lebih kritis lagi, pernyataan "menunggu" sebenarnya masih abstrak. Bagaimanakah cara proses tersebut menunggu, adalah hal yang menarik. Cara proses menunggu dapat dibagi menjadi dua:

1. spinlock waiting

2. non-spinlock waiting

Spinlock waiting berarti proses tersebut menunggu dengan cara menjalankan perintah-perintah yang tidak ada artinya. Dengan kata lain proses masih running state di dalam spinlock waiting. Keuntungan spinlock pada lingkungan multiprocessor adalah, tidak diperlukan context switch. Tetapi spinlock yang biasanya disebut busy waiting ini menghabiskan cpu cycle karena, daripada proses tersebut melakukan perintah-perintah yang tidak ada gunanya, sebaiknya dialihkan ke proses lain yang mungkin lebih membutuhkan untuk mengeksekusi perintah-perintah yang berguna.

Berbeda dengan spinlock waiting, non-spinlock waiting, memanfaatkan fasilitas sistem operasi. Proses yang melakukan non-spinlock waiting akan memblock dirinya sendiri dan secara otomatis akan membawa proses tersebut ke dalam waiting queue. Di dalam waiting queue ini proses tidak aktif dan menunggu sampai ada proses lain yang membangunkan dia sehingga membawanya ke ready queue.

Maka marilah kita lihat listing subrutin dari kedua versi wait.

Gambar 4-9. waitSpinLock

00 void waitSpinLock(int semaphore[] ) 01 {

02 while(semaphore[0] <= 0) { .. Do nothing .. } // spinlock 03 semaphore[0]--;

04 } 10 void synchronized

waitNonSpinLock( int semaphore [])

12 while(semaphore[0] <= 0) 13 {

14 wait(); // blocks thread 15 } 16 semaphore[0]--;

Perbedaan dari kedua subrutin ini adalah terletak pada aksi dari kondisi nilai semafor kurang atau sama dengan dari 0 (nol). Untuk spinlock, disini kita dapat melihat bahwa proses akan berputar-putar di while baris 02 (maka itu disebut spinlock atau menunggu dengan berputar). Sedangkan pada non-spinlock, proses dengan mudah memanggil perintah wait, setelah itu sistem operasi akan mengurus mekanisme selanjutnya.

Jangan bingung dengan kata synchronized pada baris 10. Kata ini ada karena memang konsep dari Java tm , apabila sebuah proses ingin menunggu, maka proses tersebut harus menunggu di suatu objek. Pembahasan mengenai hal ini sudah diluar dari konteks buku ini, jadi untuk lebih lanjut silahkan merujuk kepada buku Java tm pegangan anda.

Karena subrutin wait memiliki dua versi maka hal ini juga berpengaruh terhadap subrutin signal. Subrutin signal akan terdiri dari dua versi sesuai dengan yang ada pada subrutin wait.

Marilah kita lihat listing programnya

Gambar 4-10. signalSpinLock

00 void signalSpinLock( int semaphore []) 01 {

02 semaphore[0]++;

03 } 10 void synchronized 11 signalNonSpinLock( int semaphore []) 12 {

13 semaphore[0]++; 14 notifyAll(); // membawa waiting thread

15 // ke ready queue

Letak perbedaan dari kedua subrutin di atas adalah pada notifyAll. NotifyAll berarti membangunkan semua proses yang sedang berada di waiting queue dan menunggu semaphore yang disignal.

Perlu diketahui di sini bahwa setelah semaphore disignal, proses-proses yang sedang menunggu, apakah itu spinlock waiting ataukah non-spinlock waiting, akan berkompetisi mendapatkan akses semafor tersebut. Jadi memanggil signal bukan berarti membangunkan salah satu proses tetapi memberikan kesempatan proses-proses untuk berkompetisi.

4.3.6. Macam-macam Semafor

Ada 2 macam semafor yang cukup umum, yaitu:

1. Binary semaphore

2. Counting semaphore

Binary semaphore adalah semafor yang bernilai hanya 1 dan 0. Sedangkan Counting semaphore adalah semafor yang dapat bernilai 1 dan 0 dan nilai integer yang lainnya.

Banyak sistem operasi yang hanya mengimplementasi binary semaphore sebagai primitif, sedangkan counting semaphore dibuat dengan memakai primitif ini. Untuk lebih rinci mengenai cara pembuatan counting semaphore dapat dilihat pada bagian berikutnya.

Ada beberapa jenis counting semaphore, yaitu semafor yang dapat mencapai nilai negatif dan semafor yang tidak dapat mencapai nilai negatif (seperti yang telah dicontohkan pada bagian sebelumnya).

4.3.7. Semafor Menyelesaikan Masalah Critical Section

Seperti yang telah dikatakan di atas bahwa semafor tidak hanya digunakan untuk menyelesaikan masalah critical section saja, tetapi menyelesaikan masalah sinkronisasi yang lainnya. Bahkan tidak jarang semafor dijadikan primitif untuk membuat solusi dari masalah sinkronisasi yang lebih kompleks.

Kita telah lihat bagaimana penggunaan semafor untuk menyelesaikan masalah sinkronisasi dengan memakai contoh pada masalah critical section. Pada bagian ini, kita akan melihat lebih dekat lagi apa dan seberapa besar sebenarnya peran dari semafor itu sendiri sebagai solusi dalam memecahkan masalah critical section.

Lihatlah pada kode-kode di bagian demo. Telitilah, bagian manakah yang harus dieksekusi secara mutual exclusive , dan bagian manakah yang tidak. Jika diperhatikan lebih lanjut anda akan menyadari bahwa akan selalu ada satu pasang instruksi wait dan signal dari suatu semafor.

Perintah wait digunakan sebagai pintu masuk critical section dan perintah signal sebagai pintu keluarnya. Mengapa semafor dapat dijadikan seperti ini? Hal ini disebabkan dengan semafor ketiga syarat utama sinkronisasi dapat dipenuhi.

Seperti yang telah dijelaskan pada bagian sebelumnya, agar critical section dapat terselesaikan ada tiga syarat yaitu:

1. Mutual exclusive

2. Make progress

3. Bounded waiting

Sekarang marilah melihat lagi listing program yg ada di bagian sebelumnya mengenai wait dan signal. Jika nilai awal dari semafor diberikan 1, maka artinya adalah hanya ada satu proses yang akan dapat melewati pasangan wait-signal. Proses-proses yang lainnya akan menunggu. Dengan kata lain, mekanisme semaphore dengan policy nilai diberikan 1, dapat menjamin syarat yang pertama, yaitu mutual exclusive.

Bagaimana dengan syarat yang kedua, make progress? Sebenarnya pada waktu proses yang sedang berada di dalam critical section keluar dari bagian tersebut dengan memanggil signal, proses tersebut tidak memberikan akses ke critical section kepada proses tertentu yang sedang menunggu tetapi, membuka kesempatan bagi proses lain untuk berkompetisi untuk mendapatkannya. Lalu bagaimana jika ada 2 proses yang sedang menunggu dan saling mengalah? mekanisme semafor memungkinkan salah satu pasti ada yang masuk, yaitu yang pertama kali yang berhasil mengurangi nilai semaphore menjadi 0. Jadi di sini semafor juga berperan dalam memenuhi syarat kedua.

Untuk syarat yang ketiga, jelas tampak bahwa semafor didefinisikan sebagai pasangan wait-signal. Dengan kata lain, setelah wait, pasti ada signal. Jadi proses yang sedang menunggu pasti akan mendapat giliran, yaitu pada saat proses sedang berada di critical section memanggil signal.

Contoh suatu potongan program critical section yang memakai semaphore dapat dilihat di bawah ini. Catatan bahwa program di bawah ini hanyalah pseudo code.

00 wait(semaphoreVar) 01 // critical section 02 signal(semaphoreVar)

Baris 00 dan 02 menjamin adanya mutual exclusive. Sedangkan mekanisme semaphore menjamin kedua syarat yang lainnya.

4.3.8. Semafor Menyelesaikan Masalah Sinkronisasi antar Proses

Kadangkala kita ingin membuat suatu proses untuk menunggu proses yang lain untuk menjalankan suatu perintah. Isu yang ada di sini adalah bagaimana caranya suatu proses mengetahui bahwa proses yang lain telah menyelesaikan instruksi tertentu. Oleh karena itu digunakanlah semafor karena semafor adalah solusi yang cukup baik dan mudah untuk mengatasi hal tersebut.

Nilai semaphore diset menjadi 0 Proses 1

Proses 2

56 print "satu" 17 wait(semaphoreVar) 57 signal(semaphoreVar)

18 print "dua"

siapapun yang berjalan lebih cepat, maka keluarannya pasti "satu" kemudian diikuti oleh "dua". Hal ini disebabkan karena jika proses 2 berjalan terlebih dahulu, maka proses tersebut akan menunggu (nilai semafor =

0) sampai proses 1 memanggil signal. Sebaliknya jika proses 1 berjalan terlebih dahulu, maka proses tersebut akan memanggil signal untuk memberikan jalan terlebih dahulu kepada proses 2.

4.3.9. Solusi Pembuatan Counting Semaphore dari Binary Semaphore.

Pembuatan counting semaphore banyak dilakukan para programmer untuk memenuhi alat sinkronisasi yang sesuai dengannya. Seperti yang telah dibahas di atas, bahwa counting semaphore ada beberapa macam. Pada bagian ini, akan dibahas counting semaphore yang memperbolehkan harga negatif.

Listing program di bawah ini diambil dari buku Silberschatz. 00 binary-semaphore S1,S2;

01 int C;

Subrutin waitC dapat dilihat di bawah ini: 02 wait (S1);

03 C--; 04 if ( C < 0 ) {

05 signal (S1); 06 wait (S2);

07 } 08 signal (S1);

subrutin signalC dapat dilihat di bawah ini: 09 wait (S1);

10 C++; 11 if (C <= 0)

12 signal (S2); 13 else

14 signal (S1);

Kita memerlukan dua binary semaphore pada kasus ini, maka pada baris 00 didefinisikan dua binary semaphore. Baris 01 mendefinisikan nilai dari semafor tersebut. Perlu diketahui di sini bahwa waitC adalah wait untuk counting semaphore , sedangkan wait adalah untuk binary semaphore.

Jika diperhatikan pada subrutin waitC dan signalC di awal dan akhir diberikan pasangan wait dan signal dari binary semaphore . Fungsi dari binary semaphore ini adalah untuk menjamin critical section (instruksi wait dan signal dari semafor bersifat atomik, maka begitu pula untuk waitC dan signalC, jadi kegunaan lain semafor adalah untuk membuat suatu subrutin bersifat atomik).

Binary semaphore S2 sendiri digunakan sebagai tempat menunggu giliran proses-proses. Proses-proses tersebut menunggu dengan cara spinlock atau non-spinlock tergantung dari implementasi binary semaphore yang ada.

Perhatikan baris 03 dan 04. Baris ini berbeda dengan apa yang sudah dijabarkan pada bagian sebelumnya. Karena baris ini maka memungkinkan nilai semafor untuk menjadi negatif. Lalu apa artinya bagi kita? Ternyata nilai negatif mengandung informasi tambahan yang cukup berarti bagi kita yaitu bila nilai semafor negatif, maka absolut dari nilai tersebut menunjukkan banyaknya proses yang sedang menunggu atau wait. Jadi arti baris 11 menyatakan bahwa bila ada proses yang menunggu maka semua proses dibangunkan untuk berkompetisi.

Mengapa pada baris 05 dilakukan signal untuk S1? Alasannya karena seperti yang telah kita ketahui bahwa semaphore menjamin ketiga sifat dari critical section. Tetapi adalah tidak relevan bila pada saat waktu menunggu, waitC masih mempertahankan mutual exclusivenya. Bila hal ini terjadi, proses lain tidak akan dapat masuk, sedangkan proses yang berada di dalam menunggu proses yang lain untuk signal. Dengan kata lain deadlock terjadi. Jadi, baris 05 perlu dilakukan untuk menghilangkan sifat mutual exclusive pada saat suatu proses menunggu.

Pada baris 12 hanya menyatakan signal untuk S2 saja. Hal ini bukanlah merupakan suatu masalah, karena jika signal S2 dipanggil, maka pasti ada proses yang menunggu akan masuk dan meneruskan ke instruksi 07 kemudian ke instruksi 08 di mana proses ini akan memanggil signal S1 yang akan mewakili kebutuhan di baris

4.3.10. Pemrograman Windows

Win32API (Windows 32 bit Application Programming Interface), menyediakan fungsi-fungsi yang berkaitan dengan semafor. Fungsi-fungsi yang ada antara lain adalah membuat semaphore dan menambahkan semafor.

Hal yg menarik dari semaphore yang terdapat di Windows tm adalah tersedianya dua jenis semafor yaitu, Binary semaphore dan counting semaphore. Pada Windows tm selain kita dapat menentukan nilai awal dari semafor, kita juga dapat menentukan nilai maksimal dari semafor. Setiap thread yang menunggu di semafor pada Windows tm menggunakan metode antrian FIFO (First In First Out.)

4.3.11. Pemrograman Java tm

Seperti yang telah kita ketahui bahwa satu-satunya alat sinkronisasi yang disediakan oleh Java tm untuk programmer adalah kata kunci synchronized. Sebenarnya kata kunci ini diilhami dari konsep monitor.

Sedikit mengulang, monitor, konsep sinkronisasi yang sudah sangat kompleks, adalah konsep di mana potongan program ikut di dalamnya. Dalam konsep ini biasanya menggunakan semafor sebagai primitif.

Jadi dengan kata lain, secara implisit Java tm telah menyediakan semafor bagi kita, namun seperti layaknya Thread Event Dispatcher di Java tm yang bersifat transparan bagi programmer maupun end-user, semaphore juga tidak dapat diraba dan diketahui oleh kita di Java tm ini. Hanya pengetahuan mengenai semafor dan monitorlah yang dapat menyimpulkan bahwa Java tm sebenarnya memakai semafor untuk alat sinkronisasinya.

4.3.12. Masalah Umum yang Berkaitan dengan Sinkronisasi

Secara garis besar ada 3 masalah umum yang berkaitan dengan sinkronisasi yang dapat diselesaikan dengan menggunakan semafor, ketiga masalah itu adalah:

1. Masalah Bounded Buffer (Producer/Consumer)

2. Masalah Readers/Writers

3. Masalah Dining Philosophers Latar belakang dan solusi dari ketiga permasalahan di atas akan kita pahami lebih lanjut di bab-bab berikutnya.

Dokumen yang terkait

ANALISIS EFISIENSI PEMASARAN DAN PENDAPATAN USAHATANI ANGGUR (Studi Kasus di Kecamatan Wonoasih Kotamadya Probolinggo)

52 472 17

Studi Kualitas Air Sungai Konto Kabupaten Malang Berdasarkan Keanekaragaman Makroinvertebrata Sebagai Sumber Belajar Biologi

23 176 28

ANALISIS KOMPARATIF PENDAPATAN DAN EFISIENSI ANTARA BERAS POLES MEDIUM DENGAN BERAS POLES SUPER DI UD. PUTRA TEMU REJEKI (Studi Kasus di Desa Belung Kecamatan Poncokusumo Kabupaten Malang)

23 307 16

PENILAIAN MASYARAKAT TENTANG FILM LASKAR PELANGI Studi Pada Penonton Film Laskar Pelangi Di Studio 21 Malang Town Squere

17 165 2

Analisis Sistem Pengendalian Mutu dan Perencanaan Penugasan Audit pada Kantor Akuntan Publik. (Suatu Studi Kasus pada Kantor Akuntan Publik Jamaludin, Aria, Sukimto dan Rekan)

136 695 18

DOMESTIFIKASI PEREMPUAN DALAM IKLAN Studi Semiotika pada Iklan "Mama Suka", "Mama Lemon", dan "BuKrim"

133 700 21

PEMAKNAAN MAHASISWA TENTANG DAKWAH USTADZ FELIX SIAUW MELALUI TWITTER ( Studi Resepsi Pada Mahasiswa Jurusan Tarbiyah Universitas Muhammadiyah Malang Angkatan 2011)

59 326 21

STRATEGI KOMUNIKASI POLITIK PARTAI POLITIK PADA PEMILIHAN KEPALA DAERAH TAHUN 2012 DI KOTA BATU (Studi Kasus Tim Pemenangan Pemilu Eddy Rumpoko-Punjul Santoso)

119 459 25

STRATEGI PUBLIC RELATIONS DALAM MENANGANI KELUHAN PELANGGAN SPEEDY ( Studi Pada Public Relations PT Telkom Madiun)

32 284 52

FAKTOR-FAKTOR PENYEBAB ORANG TUA MENIKAHKAN ANAK PEREMPUANYA PADA USIA DINI ( Studi Deskriptif di Desa Tempurejo, Kecamatan Tempurejo, Kabupaten Jember)

12 105 72