1.
Jelaskan tentang race condition dan beri contoh study kasusnya !
Race Condition adalah situasi di mana beberapa proses mengakses dan memanipulasi data bersama pada saat besamaan. Nilai akhir dari data bersama tersebut tergantung pada proses yang terakhir selesai. Untuk mencegah race condition, proses-proses yang berjalan besamaan harus di disinkronisasi. Dalam beberapa sistem operasi, proses-proses yang berjalan bersamaan mungkin untuk membagi beberapa penyimpanan umum, masing-masing dapat melakukan proses baca (read) dan prose¶s tulis (write). Penyimpanan bersama (shared storage) mungkin berada di memori utama atau berupa sebuah berkas bersama, lokasi dari memori bersama tidak merubah kealamian dari komunikasi atau masalah yang muncul. Untuk mengetahui bagaimana komunikasi antar proses bekerja, mari kita simak sebuah contoh sederhana, sebuah print spooler. Ketika sebuah proses ingin mencetak sebuah berkas, proses tersebut memasukkan nama berkas ke dalam sebuah spooler direktori yang khusus. Proses yang lain, printer daemon, secara periodik memeriksa untuk mengetahui mengetahui jika ada a da banyak berkas berkas yang akan a kan dicetak, dan jika ada berkas yang sudah dicetak dihilangkan nama berkasnya dari direktori.
Study Kasus : Bayangkan bahwa spooler direktori memiliki slot dengan jumlah yang sangat besar, diberi nomor 0, 1, 2, 3, 4,... masing-masing dapat memuat sebuah nama berkas. Juga bayangkan bahwa ada dua variabel bersama, out, penunjuk berkas berikutnya untuk dicetak, dan in, menunjuk slot kosong di direktori. Dua vaiabel tersebut dapat menamgami sebuah two-word berkas untuk semua proses. Dengan segera, slot 0, 1, 2, 3 kosong (berkas telah selesai dicetak), dan slot 4, 5, 6 sedang terisi (berisi nama dari berkas yang antre untuk dicetak). Lebih atau kurang secara besamaan, proses A dan B, mereka memutuskan untuk antre untuk sebuah berkas untuk dicetak.
Dalam Murphy¶s Law kasus tesebut dapat terjadi. Proses A membaca in dan menyimpan nilai "7" di sebuah variabel lokal yang disebut next_free_slot. Sebuah clock interrupt terjadi dan CPU memutuskan bahwa proses A berjalan cukup lama, sehingga digantika oleh proses B. Proses B juga membaca in, dan juga mengambil nilai 7, sehingga menyimpan nama berkas di slot nomor 7 dan memperbaharui nilai in menjadi 8. Maka proses mati dan melakukan hal lain. Akhirnya proses A berjalan lagi, dimulai dari tempat di mana proses tersebut mati. Hal ini terlihat dalam next_free_slot, ditemukan nilai 7 di sana, dan menulis nama berkas di slot nomor 7, menghapus nama berkas yang bau saja diletakkan oleh proses B. Kemudian proses A menghitung next_free_slot + 1, yang nilainya 8 dan memperbaharui nilai in menjadi 8. Direktori spooler sekarang secara internal konsisten, sehingga printer daemon tidak akan memberitahukan apa pun yang terjadi, tetapi poses B tidak akan mengambil output apa pun. Situasi seperti ini, dimana dua atau lebih proses melakukan proses reading atau writing beberapa shared data dan hasilnya bergantung pada ketepatan berjalan disebut race condition.
2.
Jelaskan tentang deadlock dan berikan contohnya !
Deadlock adalah suatu situasi di mana dua program komputer berbagi sumber daya yang secara efektif akan mencegah satu sama lain dari mengakses sumber daya tersebut, yang
menghasilkan program dari kedua sumber tersebut tidak
dapat mengakses sumber daya tersebut. Kapan sistem operasi komputer yang dijalankan hanya satu program pada waktu yang sama untuk semua sumber daya dari sistem yang tersedia pada satu program tersebut. Bagaimanapun, ketika sistem operasi menjalankan berbagai program dengan segera, menyisipkan antar halaman mereka satu sama lain, program dapat meminta sumber daya dengan dinamis. Hal ini mendorong kearah permasalahan dalam deadlock.
Contoh : Misalkan pada suatu komputer terdapat dua buah program, sebuah tape drive dan sebuah printer. Program A mengontrol tape drive, sementara program B mengontrol printer. Setelah beberapa saat, program A meminta printer, tapi printer masih digunakan. Berikutnya, B meminta tape drive, sedangkan A masih mengontrol tape drive. Dua progra m tersebut memegang kontrol terhadap sumber daya yang dibutuhkan oleh program yang lain. Tidak ada yang dapat melanjutkan proses masing-masing sampai program yang lain memberikan sumber dayanya, tetapi tidak ada yang mengalah. Kondisi inilah yang disebut Deadlock atau pada beberapa buku disebut Deadly EmbraceDeadlock yang mungkin dapat terjadi pada suatu proses disebabkan proses itu menunggu suatu kejadian tertentu yang tidak akan pernah terjadi. Dua atau lebih proses dikatakan berada dalam kondisi deadlock, bila setiap proses yang ada menunggu suatu kejadian yang hanya dapat dilakukan oleh proses lain dala m himpunan tersebut.
3. Salah
satu masalah lain dalam lock file adalah livelock, jelaskan
mengenai apa itu livelock!
Livelock adalah suatu situasi di mana beberapa tahap kritis dari suatu tugas tidak mampu diselesaikan pengolahan nya. Ini adalah disebabkan pengguna (user) dari tugas tertentu ini secara terus-menerus membuat pekerjaan untuk dikerjakan setelah pada tahap yang kritis dari tugas permintaan layanan diberikan untuk nya tetapi sebelum tugas yang diberikan dapat dibersihkan dari antrian permintaan nya. Livelock berbeda dengan deadlock dalam arti bahwa proses tidaklah dihalangi atau menunggu untuk sesuatu pekerjaan tetapi mempunyai hampir tanpa batas jumlah pekerjaan mendesak untuk dikerjakan
dan tidak
pernah dapat menyusul ketinggalan atau menangkap tugas secara keseluruhan. Suatu contoh dari livelock adalah interupsi yang diberikan ke
suatu sistem
operasi yang dikemudikan. Jika terlalu banyak interupsi tiba di sistem operasi kernel dan kemudian melanjut untuk membombardir kernel, sistem operasi tidak akan mampu benar-benar melayani yang manapun interupsi yang diminta karena akan menghabiskan semua dari waktu nya untuk memproses penerimaan interupsi. Dengan kata lain, sistem operasi menjadi sangat sibuk menerima interupsi permintaan sehingga ia tidak bisa melayani yang manapun permintaan tersebut.
4.
Buat sebuah program semaphore !
001 public class Hompimpah 002 { 003 004 private static final int JUMLAH_PEMAIN=6; 005 public static void main(String args[])throws Exception 006 { 007 Gambreng gamserver=new Gambreng(JUMLAH_PEMAIN); 008 Thread[] pemain=new Thread[JUMLAH_PEMAIN]; 009 for (int ii=0; ii
052 for(int ii=0; ii
126 { 127 adaPemenang=true; 128 nomorPemenang=falsePemain; 129 } 130 mutex.buka(); 131 } 132 private void syncPemainBandar() 133 { 134 for(int ii=0; ii
5. Tunjukkan
bagaimana deadlock terjadi pada program multithread !
public class Main { public static void main(String[] args) { final Object resource1 = "resource1"; final Object resource2 = "resource2"; // t1 tries to lock resource1 then resource2 Thread t1 = new Thread() { public void run() { // Lock resource 1 synchronized (resource1) { System.out.println("Thread 1: locked resource 1"); try { Thread.sleep(50); } catch (InterruptedException e) { //do something } synchronized (resource2) { System.out.println("Thread 1: locked resource 2"); } } } }; // t2 tries to lock resource2 then resource1 Thread t2 = new Thread() { public void run() { synchronized (resource2) { System.out.println("Thread 2: locked resource 2"); try { Thread.sleep(50); } catch (InterruptedException e) { //do something } synchronized (resource1) { System.out.println("Thread 2: locked resource 1"); } } } }; // If all goes as planned, deadlock will occur, // and the program will never exit. t1.start(); t2.start(); } }
6.
Buat program satu eksekusi 100 proses / 100 thread!
public class multiThreadTest extends Thread { public static void main (String args[]) { FirstThread first = new FirstThread(); SecondThread second = new SecondThread(); first.start(); second.start(); } } class FirstThread extends Thread { public FirstThread(){ } public void run() { System.out.println("Entering then Sleeping FirstThread"); try { Thread.sleep(6000); } catch (InterruptedException e){} System.out.println("FirstThread Woke up"); System.out.println(""); } } class SecondThread extends Thread { public SecondThread(){} public void run() { for (int i =
1
; i<=100 ;i++)
{ System.out.println("Entering SecondThread #" + i + " then Sleeping"); try{Thread.sleep( 1000);}catch(InterruptedException e){} System.out.println("SecondThread Woke up ..."); System.out.println("");
} } }
7. Jelaskan
tentang daemon dan tahap-tahap yang diperlukan untuk
membuat daemon dan buat contoh sebuah daemon !
Jawab:
Pengertian Daemon
Daemon merupakan background prosess yang didesain agar dapat menjalankan suatu proses secara otomatis kerena tidak memiliki terminal pengontrol, dengan sedikit atau tanpa hubungan lansung dengan pengguna (User Interface). Biasanya daemon bekerja pada waktu yang sangat lama dengan fungsi mendengarkan dan meunggu request dan menjalankan responya berupa proses. Langkah-Langkah Membuat Daemon (Daemonizing) : 1.
Forking
dan
Pembunuhan
Proses
Induk
Langkah pertama dalam pembuatan daemon adalah menspawn proses menjadi induk dan anak dengan melakukan forking, kemudian mematikan proses induk. Proses induk yang mati akan membuat sistem operasi mengir a bahwa proses telah selesai sehingga akan kembali ke terminal user. Dari langkah ini kita telah mendapatkan satu proses yang hampir bekerja di background, yaitu proses anak yang melanjutkan program setelah kita membunuh induknya. 2. Membuat Proses Bekerja Secara Independen Daemon harus bekerja secara independen dari proses lain, termasuk proses yang menjalankannya. Langkah ini dapat dilakukan dengan cara memanggil fungsi setsid(), sehingga proses akan mendapatkan session ID yang baru. 3. Menutup Standard I/O Descriptor yang diwarisi Standard I/O descriptor dan descriptor yang diwarisi dari proses induk
harus ditutup untuk mencegah intervensi dari user serta untuk pengamanan. Ada tiga jenis standar I/O descriptor, yaitu standard input (STDIN), standard output (STDOUT), dan standard error (STDERR). 4. Melakukan Masking pada File Creation Sebagian besar daemon bekerja dalam previlege super user. Untuk alasan keamanan, daemon harus memproteksi setiap file yang dibuat. Fungsi umask() akan mencegah file previleges yang tidak aman dalam setiap pembuatan file. Misalnya: 2 umask (027) akan membatasi mode pembuatan file ke 750 (komplemen dari 027). 5. Running Directory Direktori kerja suatu daemon harus berada pada direktori yang selalu hidup. Bisa saja pada saat starting, working directory berada pada user home. Karena daemon bekerja hingga sistem reboot, maka file system user directory tidak akan pernah bisa di unmount. 6. Mendengarkan Signal Tugas utama dari sebuah daemon sebenarnya adalah mendengarkan request. Maka di dalam daemon harus terdapat pendengar signal yang akan merespon ketika daemon dikirimi signal tertentu. Hal ini dapat dilakukan dengan memanggil fungsi signal() untuk mengintall sebuah signal listener. Perlu diketahui bahwa signal 15 (SIGTERM) dan signal 9 (SIGKILL) tidak dapat ditangkap oleh signal handler. 7. Logging Karena daemon tidak memiliki terminal pengontrol, maka satu-satunya cara untuk mengetahui apa yang terjadi dengan daemon tersebut adalah dengan logging. Logging digunakan untuk menulis suatu pesan dari daemon atau untuk mendebug kesalahan yang terjadi. Logging harus banyak dilakukan oleh daemon untuk menyediakan informasi sebaik-baiknya baik bagi user maupun programmer
Contoh
Sebuah Daemon
// JavaDaemonTest - A test program that can be used as a dummy
daemon
import java.util.Date; import java.text.SimpleDateFormat;
public class JavaDaemonTest {
private static final int shutdownTime = 2;
// shutdown hook
delay time in seconds
public static void main (String[] args) { log ("JavaDaemonTest started"); System.err.println (getTimeStamp()+" This is output to StdErr ..."); Thread runtimeHookThread = new Thread() { public void run() { shutdownHook(); }}; Runtime.getRuntime().addShutdownHook (runtimeHookThread); try { while (true) { Thread .sleep (3000); log ("running"); }} catch (Throwable t) { log ("Exception: "+t .toString()); }}
private static void shutdownHook() { log ("ShutdownHook started"); long t0 = System.currentTimeMillis(); while (true) { try { Thread .sleep (500); } catch (Exception e) { log ("Exception: "+e .toString());
break; } if (System.currentTimeMillis() - t0 > shutdownTime* 1000) break; log ("shutdown"); } log ("ShutdownHook completed"); }
private static void log (String msg) { System.out.println (getTimeStamp()+" "+msg); }
private static String getTimeStamp() { SimpleDateFormat
f
=
HH:mm:ss"); return f .format(new Date()); }
} // end class JavaDaemonTest
new
SimpleDateFormat("yyyy-MM-dd