Anda di halaman 1dari 26

LABORATORIUM PEMBELAJARAN ILMU KOMPUTER

FAKULTAS ILMU KOMPUTER


UNIVERSITAS BRAWIJAYA

NAMA : ZIDANE EL FARUQI


NIM : 195150200111005
MATERI : BAB 4
TANGGAL : 2/11/2020
ASISTEN : HALIMAH SEPTYA MIKAYLA
Modul Praktikum Sistem Operasi
2020/2021

BAB 4
SIKRONISASI

4.1. Tujuan Praktikum


Bab ini bertujuan untuk mengenalkan konsep sinkronisasi dalam praktek
sistem operasi Ubuntu.

4.2. Capaian Praktikum


1. Mahasiswa mampu memahami konsep sinkronisasi.
2. Mahasiswa mampu mempraktekkan konsep sinkronisasi.

4.3. Dasar Teori

4.3.1. Sinkronisasi Thread


• Thread library menyediakan tiga cara untuk mekanisme
sinkronisasi, yaitu:
• Mutex – Mutual Exclusion lock: digunakan untuk mem-blokir
akses suatu variabel dari thread lain. Hal ini memastikan bahwa
suatu variabel dalam suatu waktu hanya bisa dimodifikasi oleh
suatu thread tertentu saja
• Join – Membuat suatu thread hanya berjalan saat ada thread lain
yang sudah selesai (terminate)
• Condition Variable – menggunakan tipe data pthread_cond_t

4.3.2. Mutex
Mutex digunakan untuk menghindari ketidakkonsistenan data
karena sebuah variabel yang dimodifikasi oleh banyak thread dalam
waktu yang bersamaan. Hal ini menyebabkan terjadinya apa yang
disebut dengan race condition. Oleh karena itu, setiap ada variabel
global yang bisa dimodifikasi oleh banyak thread, digunakan mutex
untuk menjaga agar variabel global tersebut dimodifikasi oleh banyak
threads dengan suatu urutan tertentu. Mutex berfungsi seperti lock and
key, di mana jika suatu thread memodifikasi suatu variabel global, maka
variabel tersebut hanya bisa dimodifikasi oleh thread lainnya setelah
thread sebelumnya selesai memodifikasi variabel tersebut. Mutex ini
hanya bisa digunakan oleh thread-thread yang berasal dari satu proses
Modul Praktikum Sistem Operasi
2020/2021

yang sama, tidak seperti semaphore yang dapat digunakan untuk


banyak thread dari proses yang berbeda-beda.
• Pthread_mutex_lock() – digunakan untuk mengunci suatu
variabel. Jika mutex sudah di-lock oleh suatu thread, maka
thread lain tidak bisa memanggil fungsi ini sampai mutex
tersebut sudah di-unlock
• Pthread_mutex_unlock() – digunakan untuk membuka kunci
suatu variabel. Pesan error akan muncul jika suatu thread
memanggil fungsi ini padahal bukan thread tersebut yang
mengunci mutex
Pthread_mutex_trylock() – digunakan untuk mencoba mengunci suatu
mutex dan akan mengembalikan pesan error jika terjadi keadaan busy.
Hal ini berguna untuk mencegah terjadinya deadlock

4.3.3. Join
Sebuah join digunakan jika diinginkan suatu keadaan sebuah thread
baru akan berjalan setelah suatu thread lain selesai dijalankan. Sebuah
thread dapat juga menjalankan suatu rutin yang menciptakan banyak
thread baru di mana thread induk akan dijalankan lagi saat banyak
thread baru tersebut sudah selesai dijalankan.
• Pthread_create() – membuat sebuah thread baru
• Pthread_join() – menunggu termination dari suatu thread lain
• Pthread_self() – mengembalikan nilai identifier dari thread yang
sekarang dijalankan

4.3.4. Condition Variable


Sebuah condition variable adalah variabel dari pthread_cond_t dan
digunakan sebagai sebuah fungsi untuk menunggu dan melanjutkan
proses eksekusi suatu thread. Menggunakan perintah ini dapat
membuat sebuah thread berhenti dijalankan dan berjalan lagi
berdasarkan suatu kondisi yang memenuhinya.
• Creating/Destroying: pthread_cond_init; pthread_cond_t
• cond=PTHREAD_COND_INITILIZER; pthread_cond_destroy
• Waiting on condition: pthread_cond_wait;
pthread_cond_timewait Waking thread based on condition:
pthread_cond_signal; pthread_cond_broadcast
Modul Praktikum Sistem Operasi
2020/2021

4.4. Langkah Praktikum

Praktikum ini dilakukan dengan terlebih dahulu terhubung dengan


layanan aws educate dengan cara mengaktifkan instance dari halaman
instance summary. Pilih action dan Start untuk mengaktifkan instance.
Lakukan koneksi SSH dengan cara yang sama seperti pada Bab 1.
1. Lakukan percobaan terhadap tiap kode program pada masing-
masing sub bab berikut.
2. Lakukan kompilasi kode program dengan menggunakan perintah
gcc-pthread main.c -o main
3. Jalankan hasil kompilasi menggunakan perintah ./main
4. Capture / Snapshot output-nya dan simpan sebagai laporan.
5. Amati output tiap percobaan dan jawab pertanyaan pada masing-
masing percobaan.
4.4.1. Mutex
main.c
Modul Praktikum Sistem Operasi
2020/2021

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <pthread.h>
4
5 pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
6 int counter = 0;
7
8 void *increase() {
9 pthread_mutex_lock( &mutex1 );
10 int i;
11 for(i=0; i<99999; i++)
12 { counter++;
13 printf("Counter value: %d\n",counter);
14 }
15 pthread_mutex_unlock( &mutex1 );
16 }
17 void *decrease() {
18 pthread_mutex_lock( &mutex1 );
19 int i;
20 for(i=0; i<99999; i++)
21 { counter--;
22 printf("Counter value: %d\n",counter);
23 }
24 pthread_mutex_unlock( &mutex1 );
25 } main()
26 { int rc1,
27 rc2;
28 pthread_t thread1, thread2;
29
30 /* Create independent threads each of which will execute increase
31 */ if( (rc1=pthread_create( &thread1, NULL, &increase, NULL)) )
32 { printf("Thread creation failed: %d\n", rc1);
33 }
34 /* Create independent threads each of which will execute decrease
35 */ if( (rc2=pthread_create( &thread2, NULL, &decrease, NULL)) )
36 { printf("Thread creation failed: %d\n", rc2);
37 }
38 /* Wait till threads are complete before main continues. Unless we */
39 /* wait we run the risk of executing an exit which will terminate
40 */ /* the process and all threads before the threads have
41 completed. */ pthread_join( thread1, NULL);
42 pthread_join( thread2, NULL);
43
44 exit(EXIT_SUCCESS);
45 }

Berdasarkan output dari program tersebut, jawablah pertanyaan berikut:


1. Jalankan program tersebut sebanyak 10 kali. Apakah semua
output yang dihasilkan sama?
Tips: Anda dapat menyimpan output program ke dalam file text
dengan cara menambahkan > namafile.txt di akhir perintah,
misal: ./main > output1.txt
Modul Praktikum Sistem Operasi
2020/2021

2. Hapus kode program pada baris 9, 15, 19, dan 25 yang berisi
perintah pthread_mutex_lock dan pthread_mutex_unlock.
Kemudian jalankan program tersebut sebanyak 10 kali. Apakah
semua output yang dihasilkan sama?
3. Berdasarkan hasil pengamatan anda, simpulkanlah fungsi dari
pthread_mutex_lock dan pthread_mutex_unlock dalam program
tersebut!

4.4.2. Join
main.c
1 #include <stdio.h>
2 #include <pthread.h>
3
4 pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
5 int counter = 0;
6
7 void *thread_function(void *dummyPtr)
8 { pthread_mutex_lock( &mutex1 );
9 counter++;
10 pthread_mutex_unlock( &mutex1 );
11 }
12 main()
13 {
14 pthread_t thread_id[100];
15 int i, j;
16
17 for(i=1; i <= 100; i++)
18 { printf("Create thread %d\n", i);
19 pthread_create( &thread_id[i], NULL, thread_function,
20 NULL ); }
21 for(j=1; j <= 100; j++) {
22 pthread_join( thread_id[j], NULL);
23 }
24 /* Now that all threads are complete I can print the final result. */
25 /* Without the join I could be printing a value before all the threads
26 */ /* have been completed. */
27 printf("Final counter value: %d\n", counter); }

Berdasarkan output dari program tersebut, jawablah pertanyaan


berikut:
1. Jalankan program tersebut sebanyak 10 kali. Apakah semua
output yang dihasilkan sama?
2. Hapus kode program pada baris 22, 23, dan 24 yang berisi
looping perintah pthread_join. Kemudian jalankan program
tersebut sebanyak 10 kali. Apakah semua output yang dihasilkan
sama?
Modul Praktikum Sistem Operasi
2020/2021

Berdasarkan hasil pengamatan anda, simpulkanlah fungsi dari


pthread_join dalam program tersebut!

4.4.3 Condition Variable


main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <pthread.h>
4
5 int count = 0;
6 pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t
7 condition_var = PTHREAD_COND_INITIALIZER;
8 // Write numbers 1-3 and 8-10 as permitted by functionCount2()
9
Modul Praktikum Sistem Operasi
2020/2021

10 void *functionCount1() { for(;;) {


11 // Lock mutex and then wait for signal to relase mutex
12 pthread_mutex_lock( &count_mutex );
13
14 // Wait while functionCount2() operates on count
15 // mutex unlocked if condition varialbe in functionCount2() signaled.
16 pthread_cond_wait( &condition_var, &count_mutex ); count++;
17 printf("Counter value functionCount1: %d\n",count);
18
19 pthread_mutex_unlock( &count_mutex );
20
21 if(count >= 10) return(NULL);
22 }
23 }
24
25 // Write numbers 4-7 void *functionCount2(){ for(;;) {
26 pthread_mutex_lock( &count_mutex );
27
28 if( count < 3 || count > 6 ) {
29 // Condition of if statement has been met.
30 // Signal to free waiting thread by freeing the mutex.
31 // Note: functionCount1() is now permitted to modify "count".
32 pthread_cond_signal( &condition_var );
33 } else { count++;
34 printf("Counter value functionCount2: %d\n",count); }
35 pthread_mutex_unlock( &count_mutex );
36
37 if(count >= 10) return(NULL);
38 }
39 } main(){
40 pthread_t thread1, thread2;
41 pthread_create( &thread1, NULL, &functionCount1, NULL);
42 pthread_create( &thread2, NULL, &functionCount2, NULL);
43 pthread_join( thread1, NULL); pthread_join( thread2, NULL);
44 printf("Final count: %d\n",count); exit(EXIT_SUCCESS);
45 }

Berdasarkan output dari program tersebut, jawablah pertanyaan


berikut:
1. Jalankan program tersebut. Apakah semua output yang
dihasilkan sama?
2. Hapus kode program pada baris 17 yang berisi perintah
pthread_cond_wait. Kemudian jalankan program tersebut.
Apakah semua output yang dihasilkan sama dengan output pada
soal 1?
3. Kembalikan (undo) kode program seperti saat anda mengerjakan
soal 1, kemudian hapus kode program pada baris 37 yang berisi
Modul Praktikum Sistem Operasi
2020/2021

perintah pthread_cond_signal. Kemudian jalankan program


tersebut. Apakah semua output yang dihasilkan sama dengan
output pada soal 1?
4. Berdasarkan hasil pengamatan anda setelah mengerjakan soal 1
s.d. 3, simpulkanlah fungsi dari pthread_cond_wait dan
pthread_cond_signal dalam program tersebut!

4.5. Tugas

Tugas 1
Jalankan kode program berikut!
soal.c
1 #include<stdio.h>
2 #include<string.h>
3 #include<pthread.h>
4 #include<stdlib.h>
5 #include<unistd.h>
6
7 int counter = 0;
8 pthread_t tid[4];
9
10 void* doSomeThing(void *arg) {
11 printf("\n Thread %d started, please wait...\n", counter);
12 counter++;
13
14 unsigned long i = 0;
15 for(i=0; i<(0xFFFFFFFF);i++);
16
17 printf("\n Thread %d finished\n", counter);
18
19 return NULL;
20 }
21 int main(void)
22 { int i;
23 for(i = 0; i < 4; i++)
24 pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
25
26 for(i = 0; i < 4; i++)
27 pthread_join(tid[i], NULL);
28
29 return 0;
30 }

Bila anda berhasil menjalankan kode program tersebut, maka anda akan
mendapati output seperti pada gambar di bawah ini.
Modul Praktikum Sistem Operasi
2020/2021

Jawablah pertanyaan berikut ini:


1. Mengapa perintah printf pada baris 11 pada masing-masing
thread menampilkan nilai counter yang berbeda?
2. Mengapa pada semua thread perintah printf pada baris 17
menampilkan nilai Thread 4 finished?
3. Apa fungsi for pada baris 14? Berapa kali looping yang dilakukan
oleh perintah for tersebut?
Tugas 2
Modifikasilah kode program pada Tugas 1 dengan menambahkan
pthread_mutex_lock dan pthread_mutex_unlock. Sehingga
menghasilkan output seperti pada gambar di bawah ini.
Modul Praktikum Sistem Operasi
2020/2021

Jawablah pertanyaan berikut ini:


1. Jelaskan kode program hasil modifikasi anda? Jelaskan pula
alasan penempatan pthread_mutex_lock dan
pthread_mutex_unlock pada kode program hasil modifikasi anda!
2. Dari segi waktu eksekusi, bagaimanakah perbandingan
kecepatan eksekusi kode program pada Tugas 1 dengan kode
program hasil modifikasi anda pada Tugas 2? Jelaskan
alasannya!

Tugas 3
Modifikasilah kode program pada Tugas 1 pada baris 24 s.d. 28 menjadi
soal.c
... 24 ...
25 for(i = 0; i < 4; i++) {
26 pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
27 ... pthread_join(tid[i], NULL); } ...

Jawablah pertanyaan berikut ini:


1. Tampilkan output kode program tersebut! Jelaskan dampak dari
modifikasi tersebut!
2. Dari segi waktu eksekusi, bagaimanakah perbandingan kecepatan
eksekusi kode program pada Tugas 1, kode program hasil modifikasi
anda pada Tugas 2, dan kode program pada Tugas 3? Jelaskan
alasannya!

4.6. Kesimpulan

Jelaskan kesimpulan dari hasil percobaan pada Bab 4 ini.

UNTUK DIPERHATIKAN

Setiap selesai melakukan praktikum, jangan lupa menonaktfikan instance


agar billing kuota tidak terus berjalan. Lakukan dengan cara memilih
button Action pada Instance Summary. Pilih Stop sebagai perintah yang
harus dijalankan.
LABORATORIUM PEMBELAJARAN ILMU KOMPUTER
FAKULTAS ILMU KOMPUTER
UNIVERSITAS BRAWIJAYA

NAMA : ZIDANE EL FARUQI


NIM : 195150200111005
MATERI : BAB 4
TANGGAL : 2/11/2020
ASISTEN : HALIMAH SEPTYA MIKAYLA

4.4.1 Mutex
1. Langkah 1
Modul Praktikum Sistem Operasi
2020/2021

Saat program dijalankan dengan ./main, maka tampilan


keluarannya akan seperti screenshoot diatas.

2. Langkah 2
Modul Praktikum Sistem Operasi
2020/2021

Ketika programnya dijalankan setelah melakukan beberapa


modifikasi seperti yang diperintahkan, maka setiap eksekusi
outputnya akan berbeda

3. Langkah 3

Dari hasil pengamatan program yang telah dibuat, pada Langkah


ke 2 jika kita menghilangkan mutex lock dan unlock maka
counternya akan berantakan dan tidak berurutan seperti output
pada Langkah 1. Hal ini terjadi karena banyaknya race condition
dimana 2 atau lebih thread memodifikasi variable global yang
sama. UNutk menghindari hal seperti ini maka kita menggunakan
mutex lock pada critical section kode program ini agar thread tidak
berebut mengakses san memodifikasi variabel global
Modul Praktikum Sistem Operasi
2020/2021

4.4.2 Join
1. Langkah 1

Saat program dijalankan, maka setiap setiap output yang akan


ditampilkan sama yaitu membuat 100 buah thread dan setelah
terbuat 100 thread maka final counter value yang di increment oleh
masing masing thread akan ditampilkan
Modul Praktikum Sistem Operasi
2020/2021

2. Langkah 2

Ketika programnya dijalankan setelah melakukan beberapa


modifikasi sesuai perintah soal maka program ini akan
mengeluarkan output yang sama pada setiap eksekusinya seperti
Langkah 1. Yang menjadi pembedanya adalah final counter value
nya akan berbeda karena mungkin value nya di print sebelum
semua thread selesai dijalankan
Modul Praktikum Sistem Operasi
2020/2021

3. Langkah 3

Dari hasil pengamatan program yang telah dibuat, maka kita bisa
menarik kesimpulan yaitu pada Langkah 2 jika kita menghilangkan
metode join maka setiap thread akan berjalan bersama dan hanya
mengantri pada critical section karena adanya mutex lock
sehingga final couner value yang di print bukan 100. Jika mutex
lock dihilangkan maka program juga akan berantakan

4.4.3 Condition Variable


1. Langkah 1
Modul Praktikum Sistem Operasi
2020/2021

Ketika berhasil dijalankan, maka program ini akan menampilkan


output yang sama yaitu orint angka 1-3 dengan menggunakan
functionount1 lalu berganti menggunakan functioncount2 untuk
angka 4-7 dan berganti lagi ke fuctioncount1 untuk print anga 8-10
lalu settelah itu program final count akan di print

2. Langkah 2
Modul Praktikum Sistem Operasi
2020/2021

Ketika program dijalankan setelah melakukan beberapa


modifikasi, output yang dikeluarkan sama, hanya saja semuanya
dikerjakan dan diprint oleh functioncount1.

3. Langkah 3
Modul Praktikum Sistem Operasi
2020/2021

Saat fungsi signal dihilangkan pada Langkah ini, maka output yang
dikeluarkan hanya looping yang kosong tanpa ada output yang di
print dan prosesnya harus di hentikan.

4. Langkah 4

Hasil dari pengamatan Langkah Langkah yang telah dikerjakan,


maka kita dapat menyimpulkan bahwa fungsi cond_wait dan
cond_signal bekerja sama agar terjadi sinkronisasi. Fungsi
cond_wait berfungsi untuk menunda program berjalan sampai ada
input dari cond_signal yang memerintah cond_wait untuk
melanjutkan program berjalan.
Modul Praktikum Sistem Operasi
2020/2021

4.5 Tugas

Tugas 1
Modul Praktikum Sistem Operasi
2020/2021

1. Mengapa perintah printf pada baris 11 pada masing-masing thread


menampilkan nilai counter yang berbeda?
Saat kita menggunakan join, maka thread akan berjalan bergantian dan
increment pada counter akan dilakukan di masing masing thread

2. Mengapa pada semua thread perintah printf pada baris 17


menampilkan nilai Thread 4 finished?
Karena, increment akan langsung dilakukan pada setiap thread setelah
perintah joind dan semua thread selesai saat keempat thread telah
melakukan increment terhadap counter. Sehingga ketika thread selesai
nilai yang akan ditunjukkan pada variable counter itu adalah 4

3. Apa fungsi for pada baris 14? Berapa kali looping yang dilakukan oleh
perintah for tersebut?
Penggunaan looping yang ada disini diugnakan untuk memastikan
apakah thread dalam kondisi running sampai thread lainnya terbentuk

Tugas 2
Modul Praktikum Sistem Operasi
2020/2021

1. Jelaskan kode program hasil modifikasi anda? Jelaskan pula alasan


penempatan pthread_mutex_lock dan pthread_mutex_unlock pada kode
program hasil modifikasi anda!
Setelah program berhasil dimodifikasi dan telah ditambahkan mutex
lock, maka output yang keluar adalah seperti screenshoot diatas, bisa
dilihat bahwa setiap thread menjalankan fungsi doSomeThing sampai
selesai baru thread lain bisa menjelankan fungsi tersebut. Ini dikarenaan
dalam fungsi tersebut ada mutex_lock dari sebelum thread printf thread
started sampai setelah printf thread finished supaya counter dan printf
tidak bisa diakses oleh thread yang lain

2. Dari segi waktu eksekusi, bagaimanakah perbandingan kecepatan


eksekusi kode program pada Tugas 1 dengan kode program hasil
modifikasi anda pada Tugas 2? Jelaskan alasannya!
Dilihat dari waktu eksekusinya, program tugas 2 lebih lambat dari yang
tugas 1 ini karena pada tugas 1 setiap thread bersamaan menjalankan
fungsi doSomeThing sedangkan pada tugas 2 setiap thead bergantian
untuk menjalankan fungsi dari doSomeThing
Modul Praktikum Sistem Operasi
2020/2021

Tugas 3

1 Tampilkan output kode program tersebut! Jelaskan dampak dari


modifikasi tersebut!
Output dari program tugas 3 dengan program tugas 2 tidak ada
perbedaan diantaranya, karena pada tugas 3, kita hanya mengganti
looping pada methode main dengan menggabungkan pthread_create
dan pthread_join dalam satu loop.
Modul Praktikum Sistem Operasi
2020/2021

2. Dari segi waktu eksekusi, bagaimanakah perbandingan kecepatan


eksekusi kode program pada Tugas 1, kode program hasil modifikasi anda
pada Tugas 2, dan kode program pada Tugas 3? Jelaskan alasannya!
Dilihat dari waktu eksekusinya, program tugas 1 tetap yang paling cepat,
sedangkan tugas 3 dan tugas 3 tidak berbeda jauh karena tugas 3
hanya mengubah looping sehingga setiap thread dibuat langsung
disusul dengan join. Berbeda dengan program tugas 2 yang membuat
semua thread dulu lalu melakukan join terhadap thread thread tersebut.
LABORATORIUM PEMBELAJARAN ILMU KOMPUTER
FAKULTAS ILMU KOMPUTER
UNIVERSITAS BRAWIJAYA

NAMA : ZIDANE EL FARUQI


NIM : 195150200111005
MATERI : BAB 4
TANGGAL : 2/11/2020
ASISTEN : HALIMAH SEPTYA MIKAYLA

Jelaskan kesimpulan dari hasil percobaan pada Bab 4 ini.

Dari laporan di bab ini, kita telah mempelajari tentang


sinkronsisasi. Sinkronisasi bisa dilakukan dengan 3 cara yaitu mutex,
join, dan condition variable. Mutex digunakan untuk menghindari
ketidakkonsistenan data karena sebuah variabel yang dimodifikasi
oleh banyak thread dalam waktu yang bersamaan. Hal ini
menyebabkan terjadinya apa yang disebut dengan race condition.
Oleh karena itu, setiap ada variabel global yang bisa dimodifikasi oleh
banyak thread, digunakan mutex untuk menjaga agar variabel global
tersebut dimodifikasi oleh banyak threads dengan suatu urutan
tertentu. Sebuah join digunakan jika diinginkan suatu keadaan sebuah
thread baru akan berjalan setelah suatu thread lain selesai dijalankan.
Sebuah thread dapat juga menjalankan suatu rutin yang menciptakan
banyak thread baru di mana thread induk akan dijalankan lagi saat
banyak thread baru tersebut sudah selesai dijalankan. Sebuah
condition variable adalah variabel dari pthread_cond_t dan digunakan
sebagai sebuah fungsi untuk menunggu dan melanjutkan proses
eksekusi suatu thread. Menggunakan perintah ini dapat membuat
sebuah thread berhenti dijalankan dan berjalan lagi berdasarkan suatu
kondisi yang memenuhinya.

Anda mungkin juga menyukai