Jawaban Modul 4

5
::Soal 1 Gambar 1a, 1b, 1c Dari hasil percobaan terlihat terjadi perbedaan pada urutan eksekusi pencetakan ke layar dengan fungsi printf antara new thread dan calling thread. Terdapat 4 kasus hasil dari percobaan yang telah dilakukan. a. Pada percobaan 1, 3, 7, dan 9, dua eksekusi pencetakan ke layar dengan fungsi printf dilakukan terlebih dahulu oleh calling thread, setelah itu dilanjutkan dengan eksekusi pencetakan ke layar oleh new thread 1, baru kemudian dilanjutkan dengan new thread 2. b. Pada percobaan 2, 4, 6, 8, 10, dan 11, mirip dengan kasus pertama, dua eksekusi pencetakan ke layar dengan fungsi printf dilakukan terlebih dahulu oleh calling thread, namun setelah itu dilanjutkan terlebih dahulu oleh eksekusi pencetakan ke layar oleh new thread 2, baru kemudian dilanjutkan dengan new thread 1. c. Pada percobaan 5, eksekusi pencetakan ke layar terlebih dahulu dilakukan oleh new thread 1, baru kemudian dilanjutkan oleh dua eksekusi pencetakan ke layar oleh calling thread dan diakhiri oleh pencetakan ke layar oleh new thread 2. d. Pada percobaan 12, disela-sela dua eksekusi pencetakan ke layar oleh calling thread, dilakukan eksekusi pencetakan ke layar oleh new thread 2. Sedangkan eksekusi pencetakan ke layar oleh new thread 1 dilakukan terakhir. Perbedaan urutan eksekusi tersebut dimungkinkan karena proses calling thread dan new thread berjalan secara bersamaan atau paralel sehingga urutan eksekusi tergantung pada kapan proses tersebut berstatus running (proses berjalan atau dieksekusi oleh CPU) yang tentunya bervariasi tergantung pada antrian proses-proses yang berjalan dan kondisi sumber daya yang dibutuhkan proses-proses pada saat itu. ::soal 2 Gambar 2a, 2b, 2c Program sleepthread1 memiliki perbedaan dari program mythread sebelumnya yaitu di dalamnya terdapat perintah sleep, namun dengan nilai parameter 0 yang menunjukkan lama waktu jeda. Sama dengan program mythread pada soal 1, ketika dijalankan maka akan terdapat perbedaan pada urutan eksekusi pencetakan ke layar oleh fungsi printf. Pada saat calling thread masih melakukan loop untuk membuat beberapa new thread, new thread yang telah dibuat dapat saja selesai melakukan tugasnya terlebih dahulu sebelum calling thread selesai melakukan loop. Jika dilihat pekerjaan sederhana yang dilakukan new thread dan pekerjaan loop yang dilakukan calling thread, hal ini dimungkinkan terjadi. Pada hasil percobaan juga terlihat bahwa new thread yang dibuat lebih

Transcript of Jawaban Modul 4

Page 1: Jawaban Modul 4

::Soal 1

Gambar 1a, 1b, 1c

Dari hasil percobaan terlihat terjadi perbedaan pada urutan eksekusi pencetakan ke layar dengan fungsi printf antara new thread dan calling thread. Terdapat 4 kasus hasil dari percobaan yang telah dilakukan.

a. Pada percobaan 1, 3, 7, dan 9, dua eksekusi pencetakan ke layar dengan fungsi printf dilakukan terlebih dahulu oleh calling thread, setelah itu dilanjutkan dengan eksekusi pencetakan ke layar oleh new thread 1, baru kemudian dilanjutkan dengan new thread 2.

b. Pada percobaan 2, 4, 6, 8, 10, dan 11, mirip dengan kasus pertama, dua eksekusi pencetakan ke layar dengan fungsi printf dilakukan terlebih dahulu oleh calling thread, namun setelah itu dilanjutkan terlebih dahulu oleh eksekusi pencetakan ke layar oleh new thread 2, baru kemudian dilanjutkan dengan new thread 1.

c. Pada percobaan 5, eksekusi pencetakan ke layar terlebih dahulu dilakukan oleh new thread 1, baru kemudian dilanjutkan oleh dua eksekusi pencetakan ke layar oleh calling thread dan diakhiri oleh pencetakan ke layar oleh new thread 2.

d. Pada percobaan 12, disela-sela dua eksekusi pencetakan ke layar oleh calling thread, dilakukan eksekusi pencetakan ke layar oleh new thread 2. Sedangkan eksekusi pencetakan ke layar oleh new thread 1 dilakukan terakhir.

Perbedaan urutan eksekusi tersebut dimungkinkan karena proses calling thread dan new thread berjalan secara bersamaan atau paralel sehingga urutan eksekusi tergantung pada kapan proses tersebut berstatus running (proses berjalan atau dieksekusi oleh CPU) yang tentunya bervariasi tergantung pada antrian proses-proses yang berjalan dan kondisi sumber daya yang dibutuhkan proses-proses pada saat itu.

::soal 2

Gambar 2a, 2b, 2c

Program sleepthread1 memiliki perbedaan dari program mythread sebelumnya yaitu di dalamnya terdapat perintah sleep, namun dengan nilai parameter 0 yang menunjukkan lama waktu jeda. Sama dengan program mythread pada soal 1, ketika dijalankan maka akan terdapat perbedaan pada urutan eksekusi pencetakan ke layar oleh fungsi printf.

Pada saat calling thread masih melakukan loop untuk membuat beberapa new thread, new thread yang telah dibuat dapat saja selesai melakukan tugasnya terlebih dahulu sebelum calling thread selesai melakukan loop. Jika dilihat pekerjaan sederhana yang dilakukan new thread dan pekerjaan loop yang dilakukan calling thread, hal ini dimungkinkan terjadi.

Page 2: Jawaban Modul 4

Pada hasil percobaan juga terlihat bahwa new thread yang dibuat lebih dulu tidak selalu menyelesaikan tugasnya lebih dahulu juga. Hal ini dimungkinkan karena waktu antar iterasi loop for pada calling thread sangat singkat.

Dibandingkan dengan program mythread pada soal 1 yang mana calling thread cenderung menyelesaikan tugasnya terlebih dahulu dibandingkan dengan new thread, pada program sleepthread1 cenderung beberapa new thread menyelesaikan tugasnya terlebih dahulu dibandingkan dengan calling thread. Seperti yang telah dijelaskan sebelumnya, hal ini berkaitan dengan operasi loop yang dilakukan pada calling thread membutuhkan waktu eksekusi yang lebih lama daripada operasi yang dilakukan oleh calling thread pada program mythread.

::soal 3

Gambar 3a, 3b, 3c

Pada sleepthread2 diterapkan waktu delay 4 detik oleh calling thread setelah selesai melakukan loop pembuatan new thread sedangkan new thread menerapkan delay 2 detik setelah menampilkan thread id miliknya ke layar sebelum akhirnya melakukan pencetak ke layar kembali setelah sleep selesai dilakukan.

Terlihat bahwa akibat delay 4 detik yang dijalankan calling thread setelah loop pembuatan thread, calling thread selalu selesai setelah semua new thread selesai. Dan delay 2 detik yang dijalankan new thread mengakibatkan new thread - new thread menampilkan thread id nya terlebih dahulu sebelum kemudian menyelesaikan sleepnya pada waktu hampir bersamaan walaupun dengan urutan tertentu. Yang menarik bahwa urutan new thread menampilkan thread id nya ke layar belum tentu sama dengan urutan new thread - new thread tersebut menyelesaikan tugasnya. Terlihat pemindahan eksekusi thread oleh CPU berlangsung pada waktu yang cukup cepat.

Hal ini berbeda dengan hasil ketika program sleepthread1 dijalankan, yang mana calling thread tidak selalu selesai paling akhir(pada 6 kali percobaan hanya terjadi pada kasus terakhir). Perbedaan juga terletak pada new thread - new thread yang sleepnya berakhir secara berurutan pada sleepthread2, sedangkan pada sleepthread1, cenderung pesan sleep selesai yang ditampilkan oleh new thread ditampilkan langsung setelah thread id miliknya ditampilkan ke layar.

::soal 4

Gambar 4a, 4b, 4c

Pada sleepthread3, waktu delay 4 detik yang diterapkan pada new thread dan waktu delay 2 detik yang diterapkan pada calling thread mengakibatkan calling thread selesai terlebih dahulu, baru setelah itu new thread - new thread menyelesaikan tugasnya pada waktu yang hampir bersamaan walaupun dengan urutan tertentu. Hal ini dapat juga berarti selang waktu saat new thread pertama dibuat sampai saat new thread terakhir dibuat tidak sampai 2 detik.

Page 3: Jawaban Modul 4

Hal ini berbeda dengan proses sleepthread2 pada soal sebelumnya yang mana calling thread nya selalu selesai paling akhir akibat delay 4 detik yang dilakukannnya walaupun new thread - new thread yang dibuat juga selesai dalam waktu yang hampir bersamaan akibat durasi delay yang sama yaitu 2 detik.

::soal 5

Gambar 5a, 5b, 5c

Saat pthread_exit dijalankan oleh sebuah thread, thread tersebut akan melakukan terminasi namun process-shared resource (seperti mutex, condition variable, semaphore, dan file descriptor) tidak dilepas. Process-shared resource pada suatu proses baru akan dilepas setelah thread terakhir dalam proses tersebut diterminasi. Sehingga rutin pthread_exit yan dijalankan pada proses sleepthread1, sleepthread2, dan sleepthread3 pada soal sebelumnya menjamin semua new thread telah melakukan tugasnya sebelum proses tersebut diterminasi.

Hal ini berbeda dengan proses pada sleepthread4, sleepthread5, dan sleepthread6 yang tidak menggunakan rutin pthread_exit sehingga ketika calling thread telah menyelesaikan tugasnya, maka process-shared resource akan dilepas sehingga new thread yang belum menyelesaikan tugasnya akan diterminasi juga secara otomatis.

Gambar 5a1, 5a2, 5a3

Ketika dilakukan percobaan terhadap proses sleepthread4, berbeda dengan proses sleepthread1, pada percobaan ke 4 dan 5, terlihat new thread 4 belum sempat menyelesaikan tugasnya saat calling thread diterminasi. Seperti yang dijelaskan sebelumnya, hal ini dikarenakan shared-resource yang diperlukan oleh new thread4 tersebut telah dilepas saat callign thread diterminasi terlebih dahulu.

Gambar 5b1, 5b2, 5b3

Ketika dilakukan percobaan terhadap proses sleepthread5, delay 4 detik pada calling thread ternyata memberikan waktu yang cukup bagi new thread - new thread untuk menyelesaikan tugasnya. Sehingga hasil eksekusi secara umum dapat dikatakan sama dengan hasil eksekusi dari program sleepthread2. Perbedaan hanya terletak pada urutan new thread - new thread dieksekusi oleh CPU.

Gambar 5c1, 5c2, 5c3

Perubahan yang mencolok terlihat pada proses sleepthread6. Pada semua percobaan terlihat bahwa delay 4 detik yang dilakukan new thread memastikan calling thread yang melakukan delay 2 detik menyelesaikan tugasnya lebih dahulu sebelum new thread menyelesaikan delaynya. Hal ini mengakibatkan new thread terlebih dahulu diterminasi sebelum sempat menyelesaikan delaynya. Hal ini berbeda dengan proses sleepthread3 yang mana ketika calling thread telah menyelesaikan tugasnya, process-shared resource masih tersedia untuk digunakan oleh

Page 4: Jawaban Modul 4

new thread ketika terbangun dari delaynya.

::Soal 6

Gambar 6a, 6b, 6c

ketika program jointhread dijalankan, terlihat semua percobaan memberikan hasil keluaran yang pada dasarnya sama. Perbedaan hanya terletak pada thread id dari new thread yang dibuat. Dalam satu percobaan, seluruh new thread mendapat thread id yang sama.

Hal ini dikarenakan penggunaan rutin pthread_join untuk sinkronisasi. Calling thread dalam setiap loop for melakukan pembuatan new thread. Jika pembuatan new thread sukses, maka calling thread akan menunggu new thread yang dibuat tersebut sampai selesai melakukan tugasnya dan melakukan terminasi. Barulah setelah itu calling thread melanjutkan loop untuk melakukan pembuatan new thread berikutnya. Hal ini berbeda dengan program-program sebelumnya yang mana calling thread sebelum melanjutkan loop tidak menunggu terlebih dahulu new thread untuk menyelesaikan tugasnya. Hal ini menjelaskan mengapa dalam setiap percobaan yang dilakukan pada proses jointhread selalu menghasilkan keluaran yang pada dasarnya sama.

Dalam setiap loop, sebelum melanjutkan ke loop berikutnya, calling thread menunngu new thread yang telah dibuat hingga menyelesaikan tugasnya. Hal ini memungkinkan thread id dalam thread pool yang telah selesai digunakan pada loop sebelumnya digunakan kembali pada pembuatan new thread pada loop sesudahnya. Sehingga seluruh new thread dalam proses tersebut memiliki thread id yang sama.

::Soal 7

Gambar 7a1, 7a2, 7a3

Dalam percobaan 1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 19, 23, dan 24 pada program sinkronisasi1, hasil akhir counter bernilai 1, walaupun terdapat perbedaan urutan eksekusi antara new thread 1 dan new thread 2.

Sedangkan dalam percobaan 6, 7, 8, 9, 18, 20, 21, 22, 25, 26, dan 27 pada program sinkronisasi1, hasil akhir counter sesuai yang diharapkan yaitu bernilai 2 walaupun terdapat perbedaan urutan eksekusi antara new thread 1 dan new thread 2. Terdapat beberapa kasus dimana salah satu new thread yang melakukan increment lebih dahulu pada variabel counter namun menampilkan pesan belakangan pada layar.

Nilai variabel counter yang tidak diinginkan diakibatkan oleh terjadinya race condition. Race condition terjadi saat new thread 1 dan new thread 2 mengakses dan memanipulasi variabel counter secara bersamaan.

Gambar 7b1, 7b2, 7b3

Page 5: Jawaban Modul 4

Dalam seluruh percobaan eksekusi program sinkronisasi2, terlihat dihasilkan keluaran yang sama. Urutan eksekusi antara new thread 1 dan 2 juga sama.

Hal ini terjadi karena pemindahan posisi pthread_join pada calling thread. Tidak seperti pada program sinkronisasi1, pada program sinkronisasi2 posisi pthread_join masing-masing terletak setelah pembuatan new thread 1 dan new thread 2. Pada proses sinkronisasi1 tidak dijamin bahwa hanya satu thread yang mengakses variabel counter pada suatu waktu sehinnga race condition seperti pada percobaan dapat terjadi. Namun proses sinkronisasi2 menjamin new thread 1 menyelesaikan tugasnya terlebih dahulu sebelum calling thread melakukan pembuatan new thread 2. Jadi pada suatu waktu hanya satu new thread yang mengakses dan memanipulasi variabel counter sehingga race conditionpun dapat dihindari.

::Soal 8

Gambar 8a1, 8a2, 8a3

Pada seluruh percobaan proses sinkronisasi3 terlihat bahwa hasil akhir variabel counter sesuai dengan yang diharapkan yaitu 2. Urutan eksekusi antara new thread 1 dan new thread 2 dapat bervariasi seperti pada proses sinkronisasi1 namun kali ini hanya satu new thread yang dapat mengakses variabel counter karena diterapkannya mekanisme thread synchronization dengan mutual exclusion. Sehingga new thread manapun yang melakukan manipulasi pertama terhada variabel counter, nilai akhir variabel counter akan tetap 2.

Gambar 8b1, 8b2, 8b3

Berbeda dengan proses sinkronisasi3, hasil dari proses sinkronisasi4 menjamin bahwa new thread 1 selesai dijalankan terlebih dahulu sebelum new thread 2 dibuat.

Proses sinkronisasi4 tidak memiliki perbedaan terhadap hasil dari proses sinkronisasi2 sebelumnya yang belum menerapkan mutual exclusion. Dapat dikatakan dalam kasus ini dengan atau tanpa mutual exclusion pun, proses sinkronisasi4 telah menjamin bahwa pada suatu waktu hanya satu new thread yang dapat mengakses variabel counter sehingga nilai akhir variabel counter yang diharapkan selalu tercapai.