Anda di halaman 1dari 8

Modul Praktikum Sistem Operasi

2020/2021

BAB 4 - SINKRONISASI

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 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

31
Modul Praktikum Sistem Operasi
2020/2021
• 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

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.

32
Modul Praktikum Sistem Operasi
2020/2021
4.4.1. Mutex
main.c
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
18 void *decrease() {
19 pthread_mutex_lock( &mutex1 );
20 int i;
21 for(i=0; i<99999; i++) {
22 counter--;
23 printf("Counter value: %d\n",counter);
24 }
25 pthread_mutex_unlock( &mutex1 );
26 }
27
28 main() {
29 int rc1, rc2;
30 pthread_t thread1, thread2;
31
32 /* Create independent threads each of which will execute increase */
33 if( (rc1=pthread_create( &thread1, NULL, &increase, NULL)) ) {
34 printf("Thread creation failed: %d\n", rc1);
35 }
36
37 /* Create independent threads each of which will execute decrease */
38 if( (rc2=pthread_create( &thread2, NULL, &decrease, NULL)) ) {
39 printf("Thread creation failed: %d\n", rc2);
40 }
41
42 /* Wait till threads are complete before main continues. Unless we */
43 /* wait we run the risk of executing an exit which will terminate */
44 /* the process and all threads before the threads have completed. */
45 pthread_join( thread1, NULL);
46 pthread_join( thread2, NULL);
47
48 exit(EXIT_SUCCESS);
49 }

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
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?

33
Modul Praktikum Sistem Operasi
2020/2021
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
13 main() {
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, NULL );
20 }
21
22 for(j=1; j <= 100; j++) {
23 pthread_join( thread_id[j], NULL);
24 }
25
26 /* Now that all threads are complete I can print the final result. */
27 /* Without the join I could be printing a value before all the threads */
28 /* have been completed. */
29 printf("Final counter value: %d\n", counter);
30 }

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?
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;
7 pthread_cond_t condition_var = PTHREAD_COND_INITIALIZER;
8
9 // Write numbers 1-3 and 8-10 as permitted by functionCount2()

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

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 perintah pthread_cond_signal.
Kemudian jalankan program tersebut. Apakah semua output yang dihasilkan sama
dengan output pada soal 1?

35
Modul Praktikum Sistem Operasi
2020/2021
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
22 int main(void) {
23 int i;
24 for(i = 0; i < 4; i++)
25 pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
26
27 for(i = 0; i < 4; i++)
28 pthread_join(tid[i], NULL);
29
30 return 0;
31 }

Bila anda berhasil menjalankan kode program tersebut, maka anda akan mendapati output
seperti pada gambar di bawah ini.

36
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.

37
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 for(i = 0; i < 4; i++) {
25 pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
26 pthread_join(tid[i], NULL);
27 }
... ...

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.

38

Anda mungkin juga menyukai