Sinkronisasi Prosesafandi.dosen.ittelkom-pwt.ac.id/wp-content/uploads/sites/... · 2017-12-05 ·...

Post on 03-Jul-2019

222 views 0 download

Transcript of Sinkronisasi Prosesafandi.dosen.ittelkom-pwt.ac.id/wp-content/uploads/sites/... · 2017-12-05 ·...

Sinkronisasi Proses

Pertemuan ke 6

Agenda Hari ini

Masalah Critical Section

Masalah Klasik dalam Sinkronisasi

Semaphores

Latar Belakang

Bersyukur dan berdoaMenurut kepercayaan dan agama masing-masing

(1) Bersyukur masih diberi kesempatan untuk belajar dan berbagi ilmu.

Bersyukur dan berdoaMenurut kepercayaan dan agama masing-masing

(1) Bersyukur masih diberi kesempatan untuk belajar dan berbagi ilmu.

(2) Berdoa, semoga ilmu yang didapat hari ini dapat mudah terserap dengan tetap menjaga sopan satun.

Bersyukur dan berdoaMenurut kepercayaan dan agama masing-masing

(1) Bersyukur masih diberi kesempatan untuk belajar dan berbagi ilmu.

(2) Berdoa, semoga ilmu yang didapat hari ini dapat mudah terserap dengan tetap menjaga sopan satun.

(3)Berdoa, semoga bisa menyelesaikan pendidikan ini tepat waktu dan diwaktu yang tepat

LATAR BELAKANG

LATAR BELAKANG Akses-akses yang dilakukan secara bersama-sama ke

data yang sama, dapat menyebabkan data menjadi tidak konsisten

Untuk menjaga agar data tetap konsisten, dibutuhkan mekanisme-mekanisme untuk memastikan pemintaan ekseskusi dari proses yang bekerja.

Sinkronisasi merupakan “issue” penting dalam rancangan/implementasi OS (shared resources, data, dan multitasking).

Salah satu masalah yang dapat timbul bila tidak menerapkan sinkronisasi adalah Race Condition

Race Condition

※ Race Condition: Situasi yang tidak menentu akibat beberapa proses mengakses dan memanipulasi data secara bersamaan.

※ Nilai terakhir dari data bergantung dari proses mana yang selesai terakhir.

※ Untuk menghindari Race Condition, proses-proses secara bersamaan harus disinkronisasikan.

※ Contoh : Proses Transfer Uang

Critical Section Problem

Critical Section Problem• Sebagai gambaran, sebuah sistem mempunyai n

proses yang saling berbagi data.• Setiap proses punya segmen kode yang disebut

critical section, dimana shared data diakses.• Contoh : ketika producer/consumer mengakses

variabel counter.• Masalah : ketika satu proses menjalankan critical

section-nya, di saat bersamaan process lain tidak boleh mengakses critical-section-nya

Solusi Critical Section Problem• Mutual Exclusion. Jika proses Pi mengekseskusi

critical section nya, maka tidak ada proses lain yang dapat mengeksekusi critical section nya.

• Progress. Jika tidak ada proses yang mengeksekusi critical section nya dan terdapat beberapa proses yang akan memasuki critical section, maka pemilihan proses yang akan memasuki critical section berikutnya tidak dapat ditunda tanpa batas

• Bounded Waiting. Ada batasan waktu tunggu ketika proses diizinkan untuk memasuki critical section setelah proses membuat permintaan untuk memasuki crit ical section dan sebelum permintaan yang diberikan.

Mutual Exclusion• Mutual exclusion (mutex) adalah metode yang

digunakan untuk mencegah terjadinya inkonsitensi data sebagai akibat dari race condition.

• Untuk lebih mudah memahami mutex dan race condition, perhatikan kode berikut

Mutual Exclusion

1. Sintaks #include<pthread.h> pada baris ke-5 adalah file header untuk mengakses POSIX thread library.

2. Baris 24 pthread_create() digunakan untuk membuat thread baru.

3. Function tambah pada baris ke 10 s/d 19 adalah aktifitas dari thread yang barusan dibuat atau thread T0.

4. Baris 33 yaitu pthread_join() digunakan untuk menunggu thread T0 selesai dieksekusi.

5. Ada variable global bernama bilangan yang awalnya bernilai nol (0).

6. Baris 26 s/d 31 variabel bilangan ditambah satu sampai bilangan bernilai 20.

7. Baris 12 s/d 17 variabel bilangan juga ditambah satu sampai bilangan bernilai 20.

8. Jadi seharusnya variable bilangan bernilai 40. Tetapi mengapa saat dieksekusi variable bilangan hanya bernilai 20 ?

Mutual ExclusionHasil Compile :

Mengapa variable bilangan tidak berjumlah 40 (karena ada 2 buahperulangan FOR LOOP sebanyak 40x) tetapi hanya 20 ?Karena penggunaan thread tersebut secara tidak aman/benar sehingga hasilnya sulit diprediksi. Thread 1 dan thread 2 saling berebut menggunakan variable BILANGAN sehingga hasil akhirnya (BILANGAN) menjadi sulit diprediksi. Kondisi ini disebut RACE CONDITION. Supaya hasilnya benar yaitu bilangan = 40 maka salah satu caranya adalah menggunakan MUTEX.

Mutual ExclusionPada kasus kita, critical section adalah variable BILANGAN, maka untuk mencegah proses/thread berebutan hak akses terhadap variable BILANGAN (critical section) maka kita harus mengatur hak akses tersebut menggunakan mutex.Untuk melindungi bagian critical section terhadap hasil yang tidak dapat diprediksi maka harus digunakan mutex lock seperti ini:

pthread_mutex_t a_lock = PTHREAD_MUTEX_INITIALIZER;

Mutual Exclusion

Mutual ExclusionHasil Compile :

Masalah Klasik Sinkronisasi

Permasalahan Klasik dalam Sinkronisasi

• Ada beberapa permasalahan klasik dalam sinkronisasi– Permasalahan Bounded-Buffer– Permasalahan Dining-Philosophers– Permasalahan Readers and Writers

Bounded-BufferBounded-buffer Producer Consumer• Producer : memproduksi data dan dimasukkan ke

buffer• Consumer : Mengonsumsi/mengambil data dari

buffer• Kapasitas buffer dibatasi• Ada variabel counter pencatat jumlah data

sekarang. Counter bernilai awal 0 yang bertambah ketika data diproduksi dan berkurang jika data dikonsumsi

Bounded-BufferProducer (P)

Costumer (C)

Bounded-Buffer• Q : Jika counter = 5, berapa nilai counter setelah satu kali iterasi secara

concurrent ?

• counter++ dapat diimplementasikan dalam bahasa mesin sbb :– register1 = counter– register1 = register1 + 1– counter = register1

• counter-- dapat diimplementasikan dalam bahasa mesin sbb :– register2 = counter– register2 = register2 - 1– count = register2

Bounded-Buffer• Jika “counter = 5” dan producer-consumer dieksekusi secara concurrent maka urutan eksekusinya bisa jadi :

1. Producer eksekusi : register1 = counter {register1 = 5}2. Producer eksekusi : register1 = register1 + 1 {register1 = 6}3. Consumer eksekusi : register2 = counter {register2 = 5}4. Consumer eksekusi : register2 = register2 - 1 {register2 = 4}5. Producer eksekusi : counter = register1 {counter = 6 }6. Consumer eksekusi : counter = register2 {counter = 4}

• Nilai counter dapat bernilai 4 atau 6. Padahal seharusnya 5• Problem : race condition

Problem Dining Philosopers• Pada tahun 1965, Djikstra menyelesaikan

sebuah masalah sinkronisasi yang beliau sebut dengan dining philisophers problem.

• Dining philosophers dapat diuraikan sebagai berikut :

• Lima orang filosuf duduk mengelilingi sebuah meja bundar. Masing-masing filosof mempunyai sepiring sphagetti. Sphagetti-sphagetti tersebut sangat licin dan membutuhkan dua sumpit untuk memakannya. Diantara sepiring spageti terdapat satu sumpit.

Problem Dining Philosopers

Problem Dining Philosopers• Kehidupan para filosof terdiri dari tiga periode, yaitu berpikir,

lapar dan makan. • Ketika seorang filosof lapar, dia berusaha untuk mendapatkan

sumpit kiri dan sumpit kanan sekaligus. • Dia mengambil sumpitnya satu per satu. Begitu ia mendapat

sebuah sumpit, ia tidak akan melepaskannya. Jika ia hanya berhasil mengambil kurang dari 2 sumpit, maka ia akan menunggu sampai 2 sumpit diambil.

• Begitu dia mendapatkan 2 sumpit, maka dia akan makan mienya untuk sementara waktu dan kemudian meletakkan kedua sumpitnya.

• Kedua sumpit ini kemudian dapat digunakan oleh filusuf-filusuf yang lain.

Problem Dining Philosopers• Pertanyaan kuncinya adalah, dapatkah masing-masing

philosophers tersebut melakukan prosesnya dengan benar dan tidak pernah mengalami kebuntuan. ada dua masalah yang di hadapi dining philosopher yaitu:

1. Deadlock 2. Starvation Philosopher i:

do {

wait(chopstick[i])

wait(chopstick[(i+1) % 5])

… eat

signal(chopstick[i]);

signal(chopstick[(i+1) % 5]);

… think

} while (1);

Problem Dining Philosopers• Solusi yang dilakukan adalah:

– Membolehkan max 4 filosof yang secara bersamaan duduk di meja makan

– Membolehkan filosof mengambil sumpit jika kedua sumpit tersedia

– Menggunakan penyelesaian asimetris. Filosof ganjil mengambil sumpit di kirinya baru kemudian yang kanan. Sementara filosof genap dengan cara sebaliknya.

Permasalahan Readers and Writers

• TUGAS– Jelaskan mengenai Permasalahan Readers

and Writers– Jelaskan apa masalahnya ?– Bagaimana solusinya ?– Solusi boleh dituliskan dalam bentuk

algoritma• Kerjakan di kertas A4

Semaphore

Semaphore

• Semaphore adalah counter atau penanda yang digunakan mengatur sinkronisasi saat proses atau thread sedang berbagi sumber daya yang sama pada saat yang sama.

• Semaphore memiliki 2 buah operasi :– Operasi Wait (nama lainnya: P (Proberen) atau Down atau Lock)– Operasi Signal (nama lainya: V (Verhogen) atau Up atau Unlock

atau Post)

Semaphore

Cara Kerja :

• Saat Wait maka nilai counter berkurang 1. Jika counter bernilai negative maka proses/thread ini akan dipaksa berhenti (sleep). Proses/thread yang diberi operasi Wait akan dipaksa berhenti sampai proses/thread tersebut diberi tanda Signal. Jadi kalo counter lebih kecil dari 0 maka akan proses/thread akan diblok.

• Saat Signal maka nilai counter bertambah 1. Proses/thread yang diberi operasi/tanda Signal akan running dan harus berhenti jika diberi tanda Wait. Kalo proses/thread lebih besar atau sama dengan nol maka akan running (unblock)

Semaphore

Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana kedua proses men-berbagi sumber daya yang sama (variable bilangan). Jika tidak dilakukan sinkronisasi antara proses maka nilai variable bilangan menjadi tidak pasti (tidak stabil), misalnya: berapa nilai variable bilangan pada Gambar di bawah ini ?? Bilangan = 20 atau 40 ??

Semaphorejika program di atas diimplementasi TANPA MENGGUNAKAN SEMAPHORE maka hasilnya tampak seperti Gambar di bawah ini

SEKARANG DICOBA MENGGUNAKAN SEMAPHORE !!!Dengan menggunakan semaphore maka anda dapat mengatur thread mana yang harus running terlebih dahulu sehingga kedua thread tidak berebutan menggunakan variable bilangan. Gambar sebelumnya dimodifikasi dengan menambahkan semaphore, hasilnya seperti gambar di bawah ini.

Semaphore

SEKARANG DICOBA MENGGUNAKAN SEMAPHORE !!!

Dengan menggunakan semaphore maka anda dapat mengatur thread mana yang harus running terlebih dahulu sehingga kedua thread tidak berebutan menggunakan variable bilangan. Gambar sebelumnya dimodifikasi dengan menambahkan semaphore, hasilnya seperti gambar di bawah ini.

Semaphore

Pada kasus ini, thread A & B mengetahui adanya semaphore "afandi" dan mau diatur oleh semaphore afandi. Mula-mula B akan dipaksa berhenti karena ada operasi Wait (nilai afandi yang awalnya bernilai nol akan dikurangi 1 sehingga = -1) sedangkan thread A langsung bekerja. Saat thread A selesai maka Sinyal(&afandi) akan membuat nilai "afandi" sama dengan 0 karena Sinyal membuat counter "afandi" bertambah 1 (sebelumnya bernilai -1). Setelah afandi bernilai 0, maka thread B akan bekerja.

Pada gambar, semaphore yang bernama "afandi" di inisial isasi (INIT(&afandi, 0) dengan memberi nilai nol. Semaphore "afandi" ini dishare antara kedua thread. Artinya thread A & B sama2 mengetahui semaphore ini dan penggunaannya.

PENTING !!!: Semaphore harus dishare diantara proses/thread yang terlibat dalam komunikasi kalo tidak maka anda tidak dapat melakukan sinkronisasi antar proses/thread tersebut

implementasi semaphore#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

#include<errno.h>

#include<pthread.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <sys/sem.h>

#include <string.h>

int bilangan = 0; // VARIABEL GLOBAL YANG DISHARE BERSAMA ANTARA

// THREAD 1 DAN THREAD TAMBAH

pthread_t T0;

int afandi; /* variabel semaphore */

// FUNCTION DARI SEMAPHORE

void sem_p(int id, int value){ // untuk ganti nilai semaphore dengan -1 atau 1

struct sembuf sem_b;

int v;

sem_b.sem_num = 0;

sem_b.sem_op = -1; /* P() */

sem_b.sem_flg = SEM_UNDO;

if (semop(id, &sem_b, 1) == 1)

fprintf(stderr, "\nError...Semaphore P Decrement Gagal");

}

void sem_v(int id, int value){ // untuk ganti nilai semaphore dengan -1 atau 1

struct sembuf sem_b;

int v;

sem_b.sem_num = 0;

sem_b.sem_op = 1; /* V() */

sem_b.sem_flg = SEM_UNDO;

if(semop(id, &sem_b, 1) == -1)

fprintf(stderr, "\nError...Semaphore V Increment Gagal");

}

void sem_create(int semid, int initval){

int semval;

union semun {

int val;

struct semid_ds *buf;

unsigned short *array;

} s;

s.val = initval;

if((semval = semctl(semid, 0, SETVAL, s)) < 0)

fprintf(stderr,"\nsemctl error....");

}

void sem_wait(int id){ // Decrement P

int value = -1;

sem_p(id, value);

}

void sem_signal(int id){ // Increment V

int value = 1;

sem_v(id, value);

}

// END FUNCTION SEMAPHORE

// THREAD

void *tambah(void *a) {

int i,j;

sem_wait(yosua);

for (i = 0; i < 20; i++) {

j = bilangan;

j++;

sleep(1);

bilangan = j;

}

return NULL;

}

int main() {

int i,j;

printf("Nilai Bilangan Awal = %i\n", bilangan);

// BUAT SEMAPHORE "afandi"

if((yosua = semget(IPC_PRIVATE, 1, 0666|IPC_CREAT)) == -1){

printf("\nError... Tidak bisa buat semaphore afandi");

exit(1);

}

sem_create(afandi, 0);

if(pthread_create(&T0, NULL, tambah, NULL)==-1)

error("thread tidak bisa dibuat");

// THREAD INI YANG RUNNING DULUAN KEMUDIAN THREAD TAMBAH

for ( i=0; i<20; i++) {

j = bilangan;

j++;

sleep(1);

bilangan = j;

}

sem_signal(afandi);void* result;pthread_join(T0, &result);printf("Nilai Bilangan Akhir = %i\n", bilangan);return 0;}