proses sinkronisasi

53
Proses Proses Sinkronisasi Sinkronisasi

Upload: april

Post on 21-Feb-2016

177 views

Category:

Documents


11 download

DESCRIPTION

Proses Sinkronisasi. Pembahasan. Background Problem Critical-Section Sinkronisasi Hardware Semaphore Problem Klasik Sinkronisasi Monitor. Background. Akses secara bersamaan pada data yang di-sharing mengakibatkan data menjadi inkonsistensi - PowerPoint PPT Presentation

TRANSCRIPT

Proses SinkronisasiProses Sinkronisasi

PembahasanPembahasan

• BackgroundBackground• Problem Critical-SectionProblem Critical-Section• Sinkronisasi HardwareSinkronisasi Hardware• SemaphoreSemaphore• Problem Klasik SinkronisasiProblem Klasik Sinkronisasi• MonitorMonitor

BackgroundBackground• Akses secara bersamaan pada data yang di-sharing Akses secara bersamaan pada data yang di-sharing

mengakibatkan data menjadi inkonsistensimengakibatkan data menjadi inkonsistensi• Maintain data yang konsisten membutuhkan mekanisme Maintain data yang konsisten membutuhkan mekanisme

untuk memastikan bahwa eksekusi proses dari untuk memastikan bahwa eksekusi proses dari cooperating proses dilakukan secara berurutancooperating proses dilakukan secara berurutan

• Shared-memory solution to bounded-butter problem Shared-memory solution to bounded-butter problem (Chapter 4) allows at most n – 1 items in buffer at the (Chapter 4) allows at most n – 1 items in buffer at the same time. A solution, where all N buffers are used is same time. A solution, where all N buffers are used is not simple.not simple.

• Solusi shared-memory pada problem bounded-buffer Solusi shared-memory pada problem bounded-buffer (Consumer-Producer) memungkinkan paling banyak n-1 (Consumer-Producer) memungkinkan paling banyak n-1 item dalam buffer pada waktu yang sama.item dalam buffer pada waktu yang sama.– Misal kita memodifikasi code producer-consumer dengan Misal kita memodifikasi code producer-consumer dengan

menambahkan variabel menambahkan variabel countercounter, diinisialisasi 0 dan di-increment , diinisialisasi 0 dan di-increment setiap ada item baru yang ditambahkan ke dalam buffersetiap ada item baru yang ditambahkan ke dalam buffer

Bounded-Buffer Bounded-Buffer (1)(1)

• Shared dataShared data

#define BUFFER_SIZE 10#define BUFFER_SIZE 10typedef struct {typedef struct {

. . .. . .} item} item;;item buffer[BUFFER_SIZE];item buffer[BUFFER_SIZE];int in = 0;int in = 0;int out = 0;int out = 0;int counter = 0;int counter = 0;

Bounded-Buffer Bounded-Buffer (2)(2)

• Producer process Producer process

item nextProduced;item nextProduced;

while (1) {while (1) {while (counter == BUFFER_SIZE)while (counter == BUFFER_SIZE)

; /* do nothing */; /* do nothing */buffer[in] = nextProduced;buffer[in] = nextProduced;in = (in + 1) % BUFFER_SIZE;in = (in + 1) % BUFFER_SIZE;counter++;counter++;

}}

Bounded-Buffer Bounded-Buffer (3)(3)

• Consumer processConsumer process

item nextConsumed;item nextConsumed;

while (1) {while (1) {while (counter == 0)while (counter == 0)

; /* do nothing */; /* do nothing */nextConsumed = buffer[out];nextConsumed = buffer[out];out = (out + 1) % BUFFER_SIZE;out = (out + 1) % BUFFER_SIZE;counter--;counter--;

}}

Bounded-Buffer Bounded-Buffer (4)(4)

• Statement :Statement :

counter++;counter++;counter--;counter--;

dijalankan secara atomic.dijalankan secara atomic.

• Operasi Operasi atomic atomic adalah operasi yang adalah operasi yang menyelesaikan program didalamnya tanpa menyelesaikan program didalamnya tanpa interupsi.interupsi.

Bounded-Buffer Bounded-Buffer (5)(5)

• Statement “count++” diimplementasikan dalam bahasa mesin Statement “count++” diimplementasikan dalam bahasa mesin ::

register1 = counterregister1 = counterregister1 = register1 + 1register1 = register1 + 1counter = register1counter = register1

• Statement “count--” diimplementasikan dalam bahasa mesin : Statement “count--” diimplementasikan dalam bahasa mesin :

register2 = counterregister2 = counterregister2 = register2 – 1register2 = register2 – 1counter = register2counter = register2

Bounded-Buffer Bounded-Buffer (6)(6)

• If both the producer and consumer attempt to If both the producer and consumer attempt to update the buffer concurrently, the assembly update the buffer concurrently, the assembly language statements may get interleaved.language statements may get interleaved.

• Interleaving depends upon how the producer Interleaving depends upon how the producer and consumer processes are scheduled.and consumer processes are scheduled.

Bounded-Buffer Bounded-Buffer (7)(7)

• Misal Misal countercounter diinisialisasi 5. Interleaving statemen diinisialisasi 5. Interleaving statemen adalah :adalah :

producer : producer : register1 = counterregister1 = counter ( (register1 = 5register1 = 5))producer : producer : register1 = register1 + 1register1 = register1 + 1 ( (register1 = 6register1 = 6))consumer : consumer : register2 = counterregister2 = counter ( (register2 = 5register2 = 5))consumer : consumer : register2 = register2 – 1register2 = register2 – 1 ( (register2 = 4register2 = 4))producer : producer : counter = register1counter = register1 ( (counter = 6counter = 6))consumer : consumer : counter = register2counter = register2 ( (counter = 4counter = 4))

• Nilai Nilai countercounter bisa 4 atau 6, dimana seharusnya adalah bisa 4 atau 6, dimana seharusnya adalah 5.5.

Race Condition Race Condition (1)(1)

• Race condition Race condition : adalah situasi dimana : adalah situasi dimana beberapa proses mengakses dan beberapa proses mengakses dan memanipulasi data bersama pada saat yang memanipulasi data bersama pada saat yang bersamaan. Nilai akhir dari data bersama bersamaan. Nilai akhir dari data bersama tersebut tergantung pada proses yang terakhir tersebut tergantung pada proses yang terakhir selesai.selesai.

• Untuk mencegah Untuk mencegah race conditionrace condition proses-proses proses-proses yang berjalan bersamaan harus disinkronisasi yang berjalan bersamaan harus disinkronisasi ((synchronizedsynchronized).).

Contoh : Print SpoolerContoh : Print Spooler• Ketika sebuah proses ingin mencetak sebuah Ketika sebuah proses ingin mencetak sebuah

berkas (file), proses tersebut memasukkan berkas (file), proses tersebut memasukkan nama berkas ke dalam spooler direktori nama berkas ke dalam spooler direktori khusus. Proses lain, printer daemon, secara khusus. Proses lain, printer daemon, secara periodik memeriksa untuk mengetahui jika periodik memeriksa untuk mengetahui jika ada banyak berkas yang akan dicetak, dan ada banyak berkas yang akan dicetak, dan jika ada berkas yang sudah dicetak jika ada berkas yang sudah dicetak dihilangkan nama berkasnya dari direktori.dihilangkan nama berkasnya dari direktori.– Out = penunjuk berkas berikutnya untuk dicetakOut = penunjuk berkas berikutnya untuk dicetak– In = menunjuk slot kosong di direktoriIn = menunjuk slot kosong di direktori

Race Condition Race Condition (2)(2)

Problem Critical-SectionProblem Critical-Section• Bagian dari program dimana shared memory Bagian dari program dimana shared memory

diakses disebut diakses disebut critical sectioncritical section atau atau critical regioncritical region• n n proses berkompetisi untuk menggunakan proses berkompetisi untuk menggunakan

shared datashared data• Masing-masing memiliki Masing-masing memiliki code segmentcode segment, ,

dinamakan dinamakan critical sectioncritical section dimana shared data dimana shared data diaksesdiakses

• Problem : bagaimana memastikan satu proses Problem : bagaimana memastikan satu proses dieksekusi dalam dieksekusi dalam critical sectioncritical section, dan tidak ada , dan tidak ada proses lain yang boleh dieksekusi dalam proses lain yang boleh dieksekusi dalam critical critical section section tersebuttersebut

Solusi Problem Critical-Section Solusi Problem Critical-Section (1)(1)

4 kondisi solusi yang baik :4 kondisi solusi yang baik :• Tidak ada dua proses secara bersamaan masuk Tidak ada dua proses secara bersamaan masuk

ke dalam ke dalam critical sectioncritical section• Tidak ada asumsi mengenai kecepatan atau Tidak ada asumsi mengenai kecepatan atau

jumlah CPUjumlah CPU• Tidak ada proses yang berjalan di luar Tidak ada proses yang berjalan di luar critical critical

section section yang dapat mem-blok proses lainyang dapat mem-blok proses lain• Tidak ada proses yang menunggu selamanya Tidak ada proses yang menunggu selamanya

untuk masuk untuk masuk critical sectioncritical section

Solusi Problem Critical-Section Solusi Problem Critical-Section (2)(2)• Mutual ExclusionMutual Exclusion. Jika proses . Jika proses PPii dieksekusi dalam dieksekusi dalam critical critical

sectionsection, maka tidak ada proses lain dapat dieksekusi , maka tidak ada proses lain dapat dieksekusi dalam dalam critical sectioncritical section tersebut. tersebut.

• ProgressProgress. Artinya ketika tidak ada proses yang . Artinya ketika tidak ada proses yang menggunakan menggunakan critical sectioncritical section dan ada proses-proses yang dan ada proses-proses yang ingin menggunakan ingin menggunakan critical sectioncritical section tersebut, maka harus tersebut, maka harus ada proses yang menggunakan critical section tersebut.ada proses yang menggunakan critical section tersebut.

• Bounded WaitingBounded Waiting. Maksud dari Bounded Waiting adalah . Maksud dari Bounded Waiting adalah setiap proses yang menunggu menggunakan critical setiap proses yang menunggu menggunakan critical section, maka proses-proses yang menunggu tersebut section, maka proses-proses yang menunggu tersebut dijamin suatu saat akan menggunakan critical section. dijamin suatu saat akan menggunakan critical section. Dijamin tidak ada thread yang mengalami starvation : Dijamin tidak ada thread yang mengalami starvation : proses seolah-olah berhenti, menunggu request akses ke proses seolah-olah berhenti, menunggu request akses ke critical section diperbolehkan.critical section diperbolehkan.

Komponen Critical SectionKomponen Critical Section

• Entry sectionEntry section : kode yang digunakan untuk : kode yang digunakan untuk masuk ke dalam critical section.masuk ke dalam critical section.

• Critical sectionCritical section : kode dimana hanya ada : kode dimana hanya ada satu proses yang dapat dieksekusi dalam satu proses yang dapat dieksekusi dalam satu waktu.satu waktu.

• Exit sectionExit section : akhir dari critical section, : akhir dari critical section, mengijinkan proses lain.mengijinkan proses lain.

• Remainder sectionRemainder section : kode istirahat setelah : kode istirahat setelah masuk ke critical section.masuk ke critical section.

Aturan Critical-SectionAturan Critical-Section

Solusi yang diberikan harus memenuhi Solusi yang diberikan harus memenuhi permintaan berikut :permintaan berikut :

• Mutual exclusionMutual exclusion• Deadlock freeDeadlock free• Starvation freeStarvation free

Critical RegionCritical Region

Pendekatan Solusi Proses Pendekatan Solusi Proses SinkronisasiSinkronisasi

• Solusi SoftwareSolusi Software– Tanpa sinkronisasiTanpa sinkronisasi– Dengan sinkronisasiDengan sinkronisasi

• Low-level primitif : Low-level primitif : semaphoresemaphore• High-level primitif : High-level primitif : monitorsmonitors

• Solusi HardwareSolusi Hardware

Mutual ExclusionMutual Exclusion

• Tiga kondisi untuk menentukan Tiga kondisi untuk menentukan mutual mutual exclusion exclusion ::– Tidak ada dua proses yang pada saat Tidak ada dua proses yang pada saat

bersamaan berada dalam bersamaan berada dalam critical regioncritical region– Tidak ada proses yang berjalan diluar Tidak ada proses yang berjalan diluar critical critical

regionregion yang bisa menghambat proses lain yang bisa menghambat proses lain– Tidak ada proses yang tidak bisa masuk ke Tidak ada proses yang tidak bisa masuk ke

critical regioncritical region

Cara Pemecahan MasalahCara Pemecahan Masalah

• Hanya dua proses , Hanya dua proses , PP00 and and PP11

• Struktur umum dari proses adalah Struktur umum dari proses adalah PPii (proses lain (proses lain PPjj))dodo { {entry sectionentry sectioncritical sectioncritical sectionexit sectionexit sectionreminder sectionreminder section} } while (1)while (1);;

• Proses-proses dapat share variabel untuk Proses-proses dapat share variabel untuk sinkronisasisinkronisasi

Algoritma 1Algoritma 1• Shared variabel : Shared variabel :

– int turnint turn;;initially initially turn = 0turn = 0

– turn = iturn = i PPii dapat masuk ke dalam critical section dapat masuk ke dalam critical section• Process Process PPii

dodo { {while (turn != i) while (turn != i) ;;critical sectioncritical sectionturn = jturn = j;;reminder sectionreminder section} } while (1)while (1);;

• Memenuhi mutual exclusion, tapi tidak menuhi progresMemenuhi mutual exclusion, tapi tidak menuhi progres

Algoritma 2 Algoritma 2 (1)(1)

• Menggunakan Menggunakan flag flag untuk setiap proses dan untuk setiap proses dan memeriksa memeriksa flag flag proses yang lain dan tidak proses yang lain dan tidak akan masuk critical section bila ada proses akan masuk critical section bila ada proses lain yang sedang masuk.lain yang sedang masuk.

Algoritma 2 Algoritma 2 (2)(2)

• Shared variabel :Shared variabel :– boolean flag[2]boolean flag[2];;

initially initially flag [0] = flag [1] = false.flag [0] = flag [1] = false.– flag [i] = trueflag [i] = true PPii siap untuk masuk ke dalam critical siap untuk masuk ke dalam critical

sectionsection• Process Process PPii

do {do {flag[i] := true;flag[i] := true;while (flag[j]) ;while (flag[j]) ; critical sectioncritical sectionflag [i] = false;flag [i] = false;remainder sectionremainder section} while (1);} while (1);

• Memenuhi mutual exclusion, tapi tidak menuhi progresMemenuhi mutual exclusion, tapi tidak menuhi progres

Algoritma 3 Algoritma 3 (1)(1)

• Flag untuk meminta ijin masukFlag untuk meminta ijin masuk– Setiap proses menge-set sebuah flag untuk Setiap proses menge-set sebuah flag untuk

meminta ijin masuk. Lalu setiap proses men-meminta ijin masuk. Lalu setiap proses men-toggle bit untuk mengijinkan proses yang lain toggle bit untuk mengijinkan proses yang lain untuk yang pertamauntuk yang pertama

• Kombinasi shared variabel algoritma 1 & 2Kombinasi shared variabel algoritma 1 & 2

Algoritma 3 Algoritma 3 (2)(2)

• Process PProcess Pii

dodo { {flag [i]:= true;flag [i]:= true;turn = j;turn = j;while (flag [j] and turn = j) ;while (flag [j] and turn = j) ;

critical sectioncritical sectionflag [i] = false;flag [i] = false;

remainder sectionremainder section} } while (1);while (1);

• Memenuhi ketiga persyaratan, memecahkan Memenuhi ketiga persyaratan, memecahkan masalah masalah critical-section critical-section untuk kedua proses.untuk kedua proses.

Algoritma Bakery Algoritma Bakery (1)(1)

• Sebelum masuk ke dalam Sebelum masuk ke dalam critical sectioncritical section, proses , proses menerima sebuah nomor. Pemegang nomor yang menerima sebuah nomor. Pemegang nomor yang terkecil masuk ke terkecil masuk ke critical sectioncritical section..

• Jika ada dua proses atau lebih (Pi and Pj) Jika ada dua proses atau lebih (Pi and Pj) menerima nomor sama, maka proses dengan menerima nomor sama, maka proses dengan indeks terkecil (i < j) yang dilayani lebih dulu untuk indeks terkecil (i < j) yang dilayani lebih dulu untuk masuk ke masuk ke critical sectioncritical section. Misal Pi dilayani lebih . Misal Pi dilayani lebih dulu, baru kemudian Pj.dulu, baru kemudian Pj.

• Skema penomoran selalu naik secara berurut, Skema penomoran selalu naik secara berurut, contoh : 1,2,3,3,3,3,4,5...contoh : 1,2,3,3,3,3,4,5...

Critical section untu Critical section untu n n proses :proses :

Algoritma Bakery Algoritma Bakery (2)(2)

• Shared dataShared databoolean choosing[n];boolean choosing[n];int number[n];int number[n];

Struktur data masing-masing diinisialisai Struktur data masing-masing diinisialisai false false dan 0.dan 0.

Algoritma Bakery Algoritma Bakery (3)(3)

• AlgoritmaAlgoritmado { do {

choosing[i] = true;choosing[i] = true;number[i] = max(number[0], number[1], …, number [n – 1])number[i] = max(number[0], number[1], …, number [n – 1])+1;+1;choosing[i] = false;choosing[i] = false;for (j = 0; j < n; j++) {for (j = 0; j < n; j++) {while (choosing[j]) ; while (choosing[j]) ; while ((number[j] != 0) && (number[j,j] < number[i,i])) ;while ((number[j] != 0) && (number[j,j] < number[i,i])) ;}}critical sectioncritical sectionnumber[i] = 0;number[i] = 0;remainder sectionremainder section

} while (1);} while (1);

Sinkronisasi HardwareSinkronisasi Hardware• Disabling Interrupt : hanya untuk uniprosesor sajaDisabling Interrupt : hanya untuk uniprosesor saja• Atomic test and set : mengembalikan parameter Atomic test and set : mengembalikan parameter

dan menge-set parameter ke atomicdan menge-set parameter ke atomic• Test and modify the content of a word atomicallyTest and modify the content of a word atomically

boolean TestAndSet(boolean &target) {boolean TestAndSet(boolean &target) {boolean rv = target;boolean rv = target;tqrget = true;tqrget = true;

return rv;return rv;}}

Semaphore Semaphore (1)(1)

• Semaphore adalah pendekatan yang Semaphore adalah pendekatan yang diajukan oleh Djikstradiajukan oleh Djikstra

• Prinsipnya dua proses atau lebih dapat Prinsipnya dua proses atau lebih dapat bekerjasama dengan menggunakan bekerjasama dengan menggunakan penanda-penanda sederhana.penanda-penanda sederhana.

• Variabel khusus untuk penanda disebut Variabel khusus untuk penanda disebut semaphoresemaphore

Semaphore Semaphore (2)(2)

• Sifat-sifat semaphoreSifat-sifat semaphore– Dapat diinisialisasi dengan nilai non-negatifDapat diinisialisasi dengan nilai non-negatif– Terdapat dua operasi : Down (Wait) dan Up Terdapat dua operasi : Down (Wait) dan Up

(Signal)(Signal)• Operasi Down dan Up adalah atomic, tak Operasi Down dan Up adalah atomic, tak

dapat diinterupsi sebelum diselesaikan.dapat diinterupsi sebelum diselesaikan.

Semaphore – Operasi Down Semaphore – Operasi Down (Wait) (Wait)

• Operasi ini menurunkan menilai Operasi ini menurunkan menilai semaphoresemaphore– Jika nilai semaphore menjadi non-positif Jika nilai semaphore menjadi non-positif

maka proses yang mengeksekusinya di-blockmaka proses yang mengeksekusinya di-block

Semaphore – Operasi Up Semaphore – Operasi Up (Signal)(Signal)

• Operasi ini menaikkan menilai semaphoreOperasi ini menaikkan menilai semaphore– Jika satu proses atau lebih di-block pada Jika satu proses atau lebih di-block pada

semaphore tidak dapat menyelesaikan semaphore tidak dapat menyelesaikan operasi Down, maka salah satu dipilih oleh operasi Down, maka salah satu dipilih oleh sistem dan menyelesaikan operasi Down-nya. sistem dan menyelesaikan operasi Down-nya. Pemilihan proses dilakukan secara acak.Pemilihan proses dilakukan secara acak.

Definisi Klasik Wait & SignalDefinisi Klasik Wait & Signal

Wait(S) Wait(S) {{

while S <= 0 do noop; /* busy wait! */while S <= 0 do noop; /* busy wait! */S = S – 1;S = S – 1; /* S >= 0 */ /* S >= 0 */

}}

Signal (S)Signal (S){{

S = S + 1;S = S + 1;}}

Implementasi Blocking pada Implementasi Blocking pada SemaphoreSemaphore

• Semaphore S memiliki nilai (S.val), dan suatu Semaphore S memiliki nilai (S.val), dan suatu thread list (S.list).thread list (S.list).

WaitWait (S) / Down(S) (S) / Down(S)S.val = S.val - 1S.val = S.val - 1If S.val < 0If S.val < 0 /* negative value of S.val *//* negative value of S.val */

{ { add calling thread to S.list; /* is # waiting threads */add calling thread to S.list; /* is # waiting threads */

block;block; /* sleep *//* sleep */}}

SignalSignal (S) / Up(S) (S) / Up(S)S.val = S.val + 1S.val = S.val + 1If S.val <= 0If S.val <= 0

{ { remove a thread T from S.list;remove a thread T from S.list;

wakeup (T);wakeup (T);}}

Problem Klasik pada SinkronisasiProblem Klasik pada Sinkronisasi

• Ada tiga hal yang selalu menjadi masalah Ada tiga hal yang selalu menjadi masalah pada sinkronisasi :pada sinkronisasi :– Problem Problem Bounded BufferBounded Buffer– Problem Problem Dining PhilosopherDining Philosopher– Problem Problem Sleeping BarberSleeping Barber– Problem Problem Readers and WritersReaders and Writers

Problem Bounded BufferProblem Bounded Buffer

Producer and consumerProducer and consumerare separate threadsare separate threads

8 Buffers

InP

OutP

Consumer

Producer

Permasalahan : bagaimana jika dua proses Permasalahan : bagaimana jika dua proses berbeda, yaitu produsen dan konsumen, berbeda, yaitu produsen dan konsumen, berusaha mengakses buffer tersebut dalam berusaha mengakses buffer tersebut dalam waktu bersamaan.waktu bersamaan.

Is this a valid solution?Is this a valid solution?thread producer {thread producer {

while(1){while(1){ // Produce char c// Produce char c while (count==n) {while (count==n) { no_opno_op }} buf[InP] = cbuf[InP] = c InP = InP + 1 mod nInP = InP + 1 mod n count++count++}}

}}

thread consumer {thread consumer {while(1){while(1){ while (count==0) {while (count==0) { no_opno_op }} c = buf[OutP]c = buf[OutP] OutP = OutP + 1 mod nOutP = OutP + 1 mod n count--count-- // Consume char// Consume char}}

}}

0

1

2

n-1

Global variables:Global variables: char buf[n]char buf[n] int InP = 0 // place to addint InP = 0 // place to add int OutP = 0 // place to getint OutP = 0 // place to get int countint count

Solusi Menggunakan SemaphoreSolusi Menggunakan Semaphore

0 thread producer {0 thread producer {11 while(1){while(1){22 // Produce char c...// Produce char c...33 down(empty_buffs)down(empty_buffs)44 buf[InP] = cbuf[InP] = c55 InP = InP + 1 mod nInP = InP + 1 mod n66 up(full_buffs)up(full_buffs)7 }7 }8 }8 }

0 thread consumer {0 thread consumer {11 while(1){while(1){22 down(full_buffs)down(full_buffs)33 c = buf[OutP]c = buf[OutP]44 OutP = OutP + 1 mod nOutP = OutP + 1 mod n55 up(empty_buffs)up(empty_buffs)66 // Consume char...// Consume char...77 }}8 }8 }

Global variablesGlobal variables semaphore full_buffs = semaphore full_buffs = 00;; semaphore empty_buffs = semaphore empty_buffs = nn;; char buff[n];char buff[n]; int InP, OutP;int InP, OutP;

Problem Dining PhilosophersProblem Dining Philosophers• Lima filosof duduk dalam satu mejaLima filosof duduk dalam satu meja• Satu garpu terletak diantara Satu garpu terletak diantara

masing-masing filosofmasing-masing filosof• Saat makan membutuhkan 2 garpuSaat makan membutuhkan 2 garpu• Bagaimana mencegah deadlock ?Bagaimana mencegah deadlock ?

while(TRUE) {while(TRUE) { Think();Think(); Grab first fork;Grab first fork; Grab second fork;Grab second fork; Eat();Eat(); Put down first fork;Put down first fork; Put down second fork;Put down second fork;}}

Each philosopher ismodeled with a thread

Is this a valid solution?Is this a valid solution?

#define N 5#define N 5

Philosopher() {Philosopher() { while(TRUE) {while(TRUE) { Think();Think(); take_fork(i);take_fork(i); take_fork((i+1)% N);take_fork((i+1)% N); Eat();Eat(); put_fork(i);put_fork(i); put_fork((i+1)% N);put_fork((i+1)% N); }}}}

Procedure Mengambil GarpuProcedure Mengambil Garpu

// only called with mutex set!// only called with mutex set!

test(int i) {test(int i) { if (state[i] == HUNGRY &&if (state[i] == HUNGRY && state[LEFT] != EATING &&state[LEFT] != EATING && state[RIGHT] != EATING){state[RIGHT] != EATING){ state[i] = EATING;state[i] = EATING; signal(sem[i]);signal(sem[i]); }}}}

int state[N]int state[N]semaphore mutex = 1semaphore mutex = 1semaphore sem[i]semaphore sem[i]

take_forks(int i) {take_forks(int i) { wait(mutex);wait(mutex); state [i] = HUNGRY;state [i] = HUNGRY; test(i);test(i); signal(mutex);signal(mutex); wait(sem[i]);wait(sem[i]);}}

Procedure Meletakkan GarpuProcedure Meletakkan Garpu

// only called with mutex set!// only called with mutex set!

test(int i) {test(int i) { if (state[i] == HUNGRY &&if (state[i] == HUNGRY && state[LEFT] != EATING &&state[LEFT] != EATING && state[RIGHT] != EATING){state[RIGHT] != EATING){ state[i] = EATING;state[i] = EATING; signal(sem[i]);signal(sem[i]); }}}}

int state[N]int state[N]semaphore mutex = 1semaphore mutex = 1semaphore sem[i]semaphore sem[i]

put_forks(int i) {put_forks(int i) { wait(mutex);wait(mutex); state [i] = THINKING;state [i] = THINKING; test(LEFT);test(LEFT); test(RIGHT);test(RIGHT); signal(mutex);signal(mutex);}}

Problem Sleeping Barber Problem Sleeping Barber (1)(1)

Problem Sleeping Barber Problem Sleeping Barber (2)(2)

• Barber :Barber :– Ketika ada orang yang menunggu untuk potong Ketika ada orang yang menunggu untuk potong

rambut, letakkan satu orang ke kursi, dan rambut, letakkan satu orang ke kursi, dan memotong rambutmemotong rambut

– Jika sudah selesai, pindah ke pelanggan berikutnyaJika sudah selesai, pindah ke pelanggan berikutnya– Jika tidak ada pelanggan maka tidur, sampai ada Jika tidak ada pelanggan maka tidur, sampai ada

pelanggan yang datangpelanggan yang datang

• Customer :Customer : – Jika tukang potong rambut tidur, bangunkan barberJika tukang potong rambut tidur, bangunkan barber– Jika ada orang yang sedang potong rambut, tunggu Jika ada orang yang sedang potong rambut, tunggu

barber dengan duduk di kursi tunggubarber dengan duduk di kursi tunggu– Jika kursi tunggu penuh, tinggalkan tokoJika kursi tunggu penuh, tinggalkan toko

Design SolusiDesign Solusi

• Bagaimana kita memodelkan barber dan Bagaimana kita memodelkan barber dan customer ?customer ?

• What state variables do we need?What state variables do we need?• Variabel keadaan seperti apa yang kita butuhkan Variabel keadaan seperti apa yang kita butuhkan

??– .. dan yang mana di-share ?.. dan yang mana di-share ?– ……. dan bagaimana kita akan memproteksinya ?. dan bagaimana kita akan memproteksinya ?

• Bagaimana membuat barber tidur ?Bagaimana membuat barber tidur ?• Bagaimana membuat barber bangun ?Bagaimana membuat barber bangun ?• Bagaimana membuat customer menunggu ?Bagaimana membuat customer menunggu ?• What problems do we need to look out for?What problems do we need to look out for?

Is this a good solution?Is this a good solution?

Barber Thread:Barber Thread: while truewhile true Wait(customers)Wait(customers) Lock(lock)Lock(lock) numWaiting = numWaiting-1numWaiting = numWaiting-1 Signal(barbers)Signal(barbers) Unlock(lock)Unlock(lock) CutHair()CutHair() endWhileendWhile

Customer Thread:Customer Thread: Lock(lock)Lock(lock) if numWaiting < CHAIRSif numWaiting < CHAIRS numWaiting = numWaiting+1numWaiting = numWaiting+1 Signal(customers)Signal(customers) Unlock(lock)Unlock(lock) Wait(barbers)Wait(barbers) GetHaircut()GetHaircut() else else -- give up & go home-- give up & go home Unlock(lock)Unlock(lock) endIfendIf

const CHAIRS = 5const CHAIRS = 5var customers: Semaphorevar customers: Semaphore barbers: Semaphorebarbers: Semaphore lock: Mutexlock: Mutex numWaiting: int = 0numWaiting: int = 0

Problem Readers and WritersProblem Readers and Writers• Banyak reader dan writer ingin mengakses suatu Banyak reader dan writer ingin mengakses suatu

database yang sama (masing-masing satu thread)database yang sama (masing-masing satu thread)• Banyak reader dapat diproses secara bersamaanBanyak reader dapat diproses secara bersamaan• Writer harus di-sinkronisasi dengan reader dan Writer harus di-sinkronisasi dengan reader dan

writer yang lainwriter yang lain– Hanya satu writer pada satu waktu !Hanya satu writer pada satu waktu !– Ketika seseorang ingin menulis, harus tidak ada reader !Ketika seseorang ingin menulis, harus tidak ada reader !

Tujuan :Tujuan :– Memaksimumkan Memaksimumkan concurrencyconcurrency..– Mencegah Mencegah starvationstarvation..

Design SolusiDesign Solusi• Bagaimana membuat model readers dan Bagaimana membuat model readers dan

writers ?writers ?• Bagaimana variabel keadaan yang kita Bagaimana variabel keadaan yang kita

perlukan ?perlukan ?– .. dan yang mana di-share ?.. dan yang mana di-share ?– ……. dan bagaimana kita akan memproteksinya ?. dan bagaimana kita akan memproteksinya ?

• Bagaimana membuat writers menunggu ?Bagaimana membuat writers menunggu ?• Bagaimana membuat writer bangun ?Bagaimana membuat writer bangun ?• Bagaimana membuat readers menunggu ?Bagaimana membuat readers menunggu ?• Bagaimana membuat readers bangun ?Bagaimana membuat readers bangun ?

Is this a valid solution to readers & Is this a valid solution to readers & writers?writers?

Reader Thread:Reader Thread:

while truewhile true Lock(mut)Lock(mut) rc = rc + 1rc = rc + 1 if rc == 1if rc == 1 Wait(db)Wait(db) endIfendIf Unlock(mut)Unlock(mut) ... Read shared data...... Read shared data... Lock(mut)Lock(mut) rc = rc - 1rc = rc - 1 if rc == 0if rc == 0 Signal(db)Signal(db) endIfendIf Unlock(mut)Unlock(mut) ... Remainder Section...... Remainder Section... endWhileendWhile

var var mut: Mutex = unlockedmut: Mutex = unlocked db: Semaphore = 1db: Semaphore = 1 rc: int = 0rc: int = 0

Writer Thread:Writer Thread:

while truewhile true ...Remainder Section......Remainder Section... Wait(db)Wait(db) ...Write shared data......Write shared data... Signal(db)Signal(db) endWhileendWhile

SEKIAN ...SEKIAN ...