Anda di halaman 1dari 18

LAPORAN RESMI PRAKTIKUM SISTEM OPERASI

MODUL 3 PROCESS

Oleh:

Kelompok 39 Cahya Perdana 5109100025 Vika Fitratunnany I. 5109100133

Asisten: KHARISMA MUCHAMMAD 5108100138

JURUSAN TEKNIK INFORMATIKA FAKULTAS TEKNOLOGI INFORMASI INSTITUT TEKNOLOGI SEPULUH NOPEMBER 2010

dan 3 kosong (berkas telah selesai dicetak).Thread tidak memiliki data segment atau heap. 2. namun mereka memasak resep pada halaman yang berbeda-beda. thread adalah bagian dari proses. Ada dua variabel: 1) out (pointer berkas berikutnya. sedangkan multiple threads dalam satu proses memiliki state yang sama karena pada dasarnya. dan pemberhentian yang lebih cepat dari proses Hal ini disebabkan karena “ukuran” thread yang lebih kecil dari proses . . eksekusi. Jelaskan tentang race condition dan beri contoh studi kasusnya ! Race condition adalah suatu kondisi dimana dua atau lebih proses mengakses shared memory/sumber daya pada saat yang bersamaan dan hasil akhir dari data tersebut tergantung dari proses mana yang terakhir selesai dieksekusi sehingga hasil akhirnya terkadang tidak sesuai dengan yang dikehendaki. 5. . dan 2) in (pointer ke slot kosong).Proses memiliki informasi state. .Thread memiliki waktu pembuatan.PENDAHULUAN 1. Masing-masing slot tersebut dapat memuat sebuah nama berkas yang akan dicetak. multiple thread itu seperti banyak koki yang sedang memasak dari satu buku masak yang sama. dan seterusnya. Misalkan slot 0. dan slot 4.Thread adalah bagian dari proses. dan dia tidak bisa hidup tanpa proses Jadi. Jika dianalogikan. sedangkan proses memiliki kode/data/heap dan segmen lain 2. 6 sedang terisi (berisi nama dari berkas yang antre untuk dicetak). 1. Proses A dan B sedang menunjuk ke slot yang sama. 2. sebuah proses memiliki banyak thread (multiple thread) yang menjalankan tugas-tugas untuk membantu proses tersebut. Contoh race condition: Slot-slot spooler direktori diberi nomor 0. Sebutkan dan jelaskan faktor-faktor pembeda antara proses dan thread ! . 1. Situasi seperti ini diperlihatkan oleh gambar di bawah.

sehingga printer daemon tidak akan memberitahukan apa pun yang terjadi. padahal semuanya saling menunggu. Maka proses mati dan melakukan hal lain. Jelaskan tentang deadlock dan berikan contohnya ! Deadlock adalah kondisi dimana dua atau lebih proses menunggu satu sama lain untuk menyelesaikan prosesnya/ melepaskan resource untuk dipakai proses yang lain. Ada 4 kondisi yang bisa menyebabkan deadlock: . Direktori spooler sekarang secara internal konsisten. Kemudian proses A menghitung next_free_slot + 1. sehingga menyimpan nama berkas di slot nomor 7 dan memperbaharui nilai in menjadi 8.No preemption. dan menulis nama berkas di slot nomor 7. Proses B juga membaca in. sehingga tidak satupun proses yang akan selesai. Sebuah clock interrupt terjadi dan CPU memutuskan bahwa proses A berjalan cukup lama. Hal ini terlihat dalam next_free_slot. Akhirnya proses A berjalan lagi. Deadlock adalah kasus umum pada multiprocessing dimana ada banyak proses yang berbagi resource yang sama. sebuah resource tidak bisa dipakai oleh lebih dari satu proses .Proses A membaca in dan menyimpan nilai “7″ di sebuah variabel lokal yang disebut next_free_slot. tidak ada resource yang mungkin dilepaskan oleh proses yang memakainya . proses yang memakai sebuah resource mungkin akan meminta resource lain . dimulai dari tempat di mana proses tersebut mati. Situasi seperti ini.Hold and wait. tetapi poses B tidak akan mengambil output apa pun. sehingga digantikan oleh proses B. 3.Mutual exclusion. menghapus nama berkas yang bau saja diletakkan oleh proses B. dan juga mengambil nilai 7. ditemukan nilai 7 di sana. dimana dua atau lebih proses melakukan proses reading atau writing beberapa shared data dan hasilnya bergantung pada ketepatan berjalan disebut race condition. yang nilainya 8 dan memperbaharui nilai in menjadi 8.

namun hal ini menyebabkan hasil proses tidak optimal .Circular wait: memberikan penomoran untuk permintaan resource. dimana masing-masing saling menunggu untuk melepaskan resource yang sedang dipakai. Jelaskan tentang multithread dan berikan contoh pengaplikasian multithread ! Multithread adalah sistem yang membolehkan adanya banyak thread dalam satu proses.. dua atau lebih proses membentuk sebuah “circular chain”. 4. Contohnya sebuah web browser mempunyai . hal ini bisa menyebabkan chaos .No preemption: mengambil sumber daya di tengah-tengah proses. namun hambatannya adalah kesulitan untuk memperkirakan di awal dan hal ini tidak optimal .Circular wait.Hold and wait: meminta sumber daya di awal. Contoh dari multithread ini terlihat dalam sebuah aplikasi yang diimplementasi sebagai proses yang terpisah dengan beberapa thread yang berfungsi sebagai pengendali. namun tidak ada penomoran yang bisa memuaskan semua pihak. namun hambatannya adalah. Ilustrasi deadlock tampak seperti gambar di bawah: Cara mencegah deadlock: .Mutal exclusion: memperbolehkan satu resource dipakai oleh lebih dari 1 proses.

Kondisi ini menyebabkan resource komputer hanya bisa dipakai oleh satu proses pada waktu yang sama. sehingga tabrakan data bisa dicegah. pthread_create : Fungsi untuk membuat thread yang baru dan bisa dieksekusi. Jadi. pthread_mutex_destroy. sedangkan semaphore memegang kontrol akses pada lebih dari satu resource untuk dipakai banyak proses. Semaphore adalah salah satu contoh yang menerapkan mutual exclusion. pthread_create. 6. Deadlock dapat terjadi jika dua atau lebih proses tersebut saling menunggu satu sama lain untuk melepaskan resource/ semaphorenya. pthread_detach. Namun perbedaannya. Mengindikasikan bahwa storage yang digunakan untuk thread yang di-detach bisa digunakan kembali ketika thread berakhir. Hal ini dilakukan untuk melindungi resource dari akses proses lain. pthread_detach : Fungsi untuk men-detach thread. pthread_mutex_lock. pthread_mutex_lock : Fungsi yang digunakan suatu thread untuk mendapatkan lock dari suatu variabel mutex. pthread_mutex_unlock. adalah sebuah algoritma yang dimanfaatkan untuk mencegah penggunaan suatu resource komputer secara simultan dengan menggunakan kode program yang disebut “critical sections”. pthread_mutex_unlock : Fungsi untuk membatalkan lock pada suatu thread. Jelaskan apa yang dimaksud dari : pthread_t. Jelaskan apa yang dimaksud dengan mutex. pthread_mutex_t : Digunakan untuk mendeklarasikan variabel mutex. pthread_mutex_t. pthread_cancel : Fungsi untuk membatalkan pengeksekusian sebuah thread. pthread_cancel.         Pthread_t : Digunakan untuk mendeklarasikan variabel thread. sebutkan juga perbedaan dan persamaanya jika dibandingkan dengan semaphore ! Mutex adalah mutual exclusion. penggunaan semaphore memiliki resiko terjadinya deadlock. pthread_mutex_destroy : Fungsi untuk menghapus mutex thread .thread untuk menampilkan gambar atau tulisan sedangkan thread yang lain berfungsi sebagai penerima data dari network. Namun. dimana dua proses atau lebih mendapatkan ijin semaphore untuk mengakses dua resource yang berbeda. persamaan mutex dengan semaphore adalah: mutual exclusion dan semaphore sama-sama membatasi akses proses ke suatu resource. 5. Lock adalah sebuah mekanisme sinkronisasi yang membuat batasan terhadap suatu akses pada thread. mutual exclusion hanya membatasi akses satu proses per satu resource.

Namun kerugiannya: kernel memperlakukan proses multithread sebagai kontrol thread tunggal. b. Satu thread akan dipetakan sebagai satu thread di level kernel. Namun hal ini mengakibatkan adanya resiko context switching. dimana sistem operasi akan memetakan semua thread dalam proses multithread ke satu kesatuan eksekusi. operasi thread didukung dan diatur secara langsung oleh sistem operasi. Jelaskan permodelan thread dilihat dari levelnya a. Kernel Level Pada kernel level. Threads disediakan oleh kernel namun diatur tanpa dukungan kernel. proses sinkronisasi berjalan di luar kernel sehingga dapat menghindari adanya context switches. User level threading menerapkan many-to-one thread mapping. operasi threading terjadi di space user dan diciptakan oleh runtime library. Keuntungannya: Userlevel library bisa menjadwalkan pengeksekusian thread sehingga bisa mengoptimalkan peforma.7. sehingga thread tidak bisa mengeksekusi instruksi/ kernel primitive secara langsung. Selain itu. . User Level Pada user level. sehingga kernel-level thread bukanlah selalu menjadi solusi yang paling optimal untuk aplikasi yang menggunakan multithread. kernel level akan menciptakan thread baru di kernel tiap ada thread pengguna. sehingga tidak praktis dan memberatkan kerja aplikasi. sehingga performa menjadi tidak optimal jika prosesnya menggunakan I/O dan multithread tidak bisa berjalan secara parallel dalam sistem multiprosesor. Selain itu. sehingga disebut menerapkan one-on-one thread mapping.

developer harus membatasi jumlah thread yang dibuat. Jika thread memenuhi syarat kondisi preemptive. Seteah thread dibuat.c. Sedangkan pada model one-to-one. Hybrid Hybrid adalah kombinasi dari user-level dan kernel-level thread. maka dari running state. bisa lebih sedikit). sebuah thread berpindah menuju salah satu dari empat non-runnable state. dimana developer bisa membuat banyak thread dan kernel bisa menjalankan multiprocessing. biasanya dari running state. yaitu waiting. Thread memasuki state waiting ketika thread tersebut menunggu sebuah kejadian (event) tertentu sebelum bisa diproses lagi. . setelah mendapatkan giliran. atau blocked. thread tersebut bisa langsung kembali ke ready state. Ketika event yang ditunggu selesai berlangsung. Dua model sebelumnya: model many-to-one memungkinkan developer menciptakan thread sebanyak yang diinginkan. dimana multithread dalam user space akan dipetakan pada beberapa thread di kernel space (jumlahnya tidak perlu sama. 8. thread itu bisa kembali ke ready state. Kemudian. Jelaskan gambar dibawah ini : Gambar di atas menunjukkan daur hidup sebuah thread. ia akan masuk ke ready state (menunggu gilirannya untuk memasuki prosesor). namun parallel processing tidak dapat dilaksanakan kernel hanya bisa menjalankan satu thread per satuan waktu. Namun. Metode ini menerapkan many-to-many thread mapping. thread memasuki running state (thread sedang dieksekusi). dead. Model many-to-many bisa mengatasi kelemahan di atas. sleeping.

kemudian kembali ke ready state. namun keduanya ternyata bergeser kea rah yang sama.h> <time. Pada sleeping state. thread akan kembali ke ready state. Buat program yang menunjukan perbedaan antara pendekatan multi process dan multi threading dengan menyelesaikan problem ini: -setiap program membuat 10 proses atau 10 thread(1 program 10 thread saja atau 10 proses saja) -setiap thread ataupun proses menyelesaikan fungsi f(n). 9. dan 100 thread atau proses. meskipun mereka terus bergeser selamanya. Masing-masing menawarkan yang lain untuk lewat duluan dengan bergeser ke sebelah. Jika sudah menerima input/output tersebut.h> <stdlib.c #include #include #include #include #include <sys/types. Salah satu masalah lain dalam lock file adalah livelock. Contoh ilustrasi dari livelock adalah saat dua orang berpapasan di sebuah koridor.h> <stdio. f(n)=fibonaci ke-n dimana n adalah nomor thread atau nomor proses ulangi (buat program lain) yang membuat 50. sehingga thread tersebut memasuki dead state. dan tidak akan ada progress yang terjadi. sehingga sistem akan berulang-ulang namun tidak memiliki efek yang berarti.c/ 50process. Kondisi ini mengakibatkan task tidak akan dapat diselesaikan karena thread seperti terus-menerus dibebani oleh tugas baru yang tidak mungkin dikejar. Dari dead state tersebut. maksudnya buat: 1 program yang membuat 50 thread 1 program yang membuat 50 proses 1 program yang membuat 100 thread 1 program yang membuat 100 proses 1. CPU menentukan sebuah waktu kuantum dan thread tersebut berada dalam sleeping state hingga waktu kuantum itu selesai.h> <sys/stat. Pilihan terakhir sebuah thread setelah keluar dari running state adalah blocked state. pemrosesan thread yang dimaksud bisa saja telah selesai. thread mungkin bisa dimasukkan ke sleeping state.h> . jelaskan mengenai apa itu livelock! Livelock adalah kondisi dimana thread (atau beberapa thread) berjalan dalam loop tanpa mempunyai progress apapun. Dari running state.c/ 100processs.Jika tidak memasuki waiting state setelah running state. thread sudah tidak bisa berjalan lagi (berpindah state). Suatu thread diblok ketika thread tersebut membutuhkan sebuah input atau output sebelum bisa diproses lebih lanjut. Membuat 10/ 50/ 100 proses untuk menghitung angka fibonaci ke-n 10processs. Hal ini mengakibatkan mereka tidak akan selesai melewati koridor. 10.

} else // parent process dari child { wait(NULL).h> <string. k<MAX. } void fibonaci() { if(i>1) { fibo[i] = fibo[i-1]+fibo[i-2].#include #include #include #include #include #include #include <fcntl. int i=0.h> <signal. i++.h> <unistd. } else { fibo[i] = 1. k). } else if (pid==0) // child process { printf("Fork ke = %d --> ". fibonaci(). if (pid < 0) { exit(EXIT_FAILURE). pid_t pid. fibo[i]). } } return 0. } printf("%d\n". nilai MAX harus dirubah void fibonaci().h> <syslog. exit(EXIT_SUCCESS).h> #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 #define MAX 10 // untuk membuat 50/ 100 proses. int fibo[MAX]. int main(void) { int k.h> <termios. for (k=0.h> <errno. k++) { pid = fork(). .

printf("Fibonaci: "). unsigned long fibo[MAX]. int iret. main() { pthread_t thread.h> #include <stdlib. Membuat 10/ 50/ 100 thread untuk menghitung angka fibonaci ke-n 10thread.h> #define MAX 10 // untuk membuat 50/ 100 thread.c #include <stdio. .h> #include <pthread. int i=0.c/ 100thread. nilai MAX harus dirubah void *make( void *ptr ).} Screenshot: 2.c/ 50thread.

} printf("\n"). j++) { iret = pthread_create( &thread. } // } void *make( void *ptr ) { if(i>1) { fibo[i] = fibo[i-1]+fibo[i-2]. exit(0). NULL). } printf("%lu ". i++.iret1). j<MAX. NULL. fibo[i]). Screenshot: . printf("Thread 1 returns: %d\n". make. pthread_join( thread. NULL).int j. for(j=0. } else { fibo[i] = 1.

i. jumlah = a.1.&c).SHIFT 1 1.b=0. FILE *file = fopen("hasiljumlah. jumlah = 0."%d". jumlah.&b.&a.jumlah). scanf ("%d%c". } int main() { int a. Hasil akan disimpan dalam file.&a). for (i=0. shift1.h> #include <stdio. Misal : Input thread : 2 Operasi thread 1 : 5 * 2 Operasi thread 2 : 3 * 2 * 7 No 1.d." %c %d"."w").i<a. scanf ("%d".h> void *thread_f(void *parameter) { FILE *file = (FILE *)parameter. Program akan meminta input berupa jumlah thread.txt". Buatlah sebuah program yang mensimulasikan komputasi paralel sederhana. dimana program akan menjumlahkan hasil komputasi dari tiap operasi matematika pada tiap thread. else if (d=='*') jumlah*= b. int a. } return (void *)jumlah. if (d=='+' ) jumlah+= b.&c). else if (d=='/') jumlah/= b.a). if (c == '\n') fprintf(file. fprintf (file. char c. printf ("masukkan jumlah operasi : ").c #include <pthread. fprintf (file.i++) .b).d. dan operasi matematika pada tiap thread. while (c!='\n') { d=c." = %d\n". scanf ("%d%c". else if (d=='-') jumlah-= b.

txt” yang berisi operasi dan hasilnya. } Screenshot: Hasil operasi akan disimpan di file “hasiljumlah. return 0.(void *)&jumlah). pthread_create(&thr. .&thread_f. } fclose(file).NULL.{ pthread_t thr.file). pthread_join(thr.

} void start() { char folder[100].c #include #include #include #include #include #include #include #include #include <dirent. isinya | >> a. // let's dance :) pthread_t threadid.h> <sys/stat. b. dimana program meminta input berupa direktori yang akan ditelusuri.txt.2. . char searchpath[100].h> <string. yaitu file dengan nama home yang berisi a. main() { start(). scanf("%s". dan aku. printf("Masukkan PATH folder yang akan di-traverse!\nPath: ").txt >>b. char path[100]. getcwd(folder.h> <unistd.h> <sys/param. Program akan menghasilkan output berupa file dengan nama file berupa direktori yang ditemukan dan isi filenya berupa daftar nama file dan direktori yang ditemukan. 100). kemudian program akan menelusuri isinya dan tiap kali menemukan suatu direktori.h> <stdlib.txt Maka akan dibuat 2 file.h> void start(). dan file dengan nama aku yang berisi c.txt No.h> <sys/types. void *travdir( void * ).txt >>/aku | >> c. Buatlah contoh program simulasi penelusuran direktori.txt.h> <stdio. program akan membuat thread baru untuk menelusuri direktori tersebut. int super. searchpath).2 satu. printf("--------------------------------------\n"). printf("Anda sedang berada di folder: %s\n". folder).h> <pthread. Contoh : /home -> ini yang ditelusuri. exit(0).

} void *travdir( void *file ) { chdir(file). strcat(ha. pthread_join( threadid. // ciptakan .txt untuk list file FILE *hasil. k++) { if(k>=j) { tambahan[in] = ha[k]. in++." ). printf("--------------------------------------\n"). NULL). . tambahan). printf(" Output: %s\n". ha). strcpy(ha. char ha[100]. } } char txtname[100]. } } int j. strcat(ha. travdir. for (i = 0. i++) { if (ha[i]==47) { count++. count > 0. file). for (k = 0. } } char tambahan[100]. hasil = fopen(ha. struct dirent *dir. strcpy(txtname. strcat(txtname. int count = 0. int in = 0. d = opendir( ". NULL. DIR *d. k < 100. "/").txt"). txtname). i < 100. (void *)searchpath ). int k.super = pthread_create( &threadid. ". for (j = 0. j++) { if (ha[j]==47) { count--. int i. "w").

. // tutup file } . "%s\n". } else // jika bukan folder { if(strcmp(dir->d_name. } // jika yang dibuka itu folder // maka ciptakan thread dan telusuri folder itu if( dir->d_type == DT_DIR ) { // list nama foldernya di file output fprintf(hasil." ) == 0 ) { continue. travdir. // tutup dir fclose(hasil). int dirthread. 100). // menyimpan path folder tersebut char file[100].if( d == NULL ) { return. dir->d_name). // balik ke folder atasnya chdir( ". ". (void *)file ). } } } closedir( d ). "%s\n". txtname) != 0) { // list filenya di file output fprintf(hasil. NULL. getcwd(file. pthread_join( childthread." ) == 0 || strcmp( dir->d_name. NULL). // masuk folder itu chdir( dir->d_name ).. dir->d_name). dirthread = pthread_create( &childthread. // let's make some recursive thread :) pthread_t childthread." ). ". } while((dir = readdir(d))) { if( strcmp( dir->d_name.

File .txt.Screenshots: Path yang dimasukkan adalah: /home/vikachew/Documents/Sisop Pada folder tersebut terdapat satu subfolder. File . sehingga akan dibuat 2 file .txt untuk folder itu sendiri 2.txt untuk subfolder “Coba program” . yaitu 1.

txt” yang berisi daftar file-file yang ada di folder tersebut.Pada folder /home/vikachew/Documents/Sisop/ terdapat file “Sisop. Pada folder /home/vikachew/Documents/Sisop/”Coba program”/ terdapat file “Coba program.txt” yang berisi daftar file-file yang ada di folder tersebut. .

searchpath). // let's dance :) pthread_t threadid. printf("--------------------------------------\n"). exit(0). NULL. NULL). printf("Anda sedang berada di folder: %s\n". } void start() { char folder[100]. printf("Masukkan PATH folder yang akan di-traverse!\nPath: "). getcwd(folder. 100). int super. (void *)searchpath ). } . travdir. scanf("%s". folder). char searchpath[100]. pthread_join( threadid. super = pthread_create( &threadid.main() { start(). printf("--------------------------------------\n").

file). for (i = 0. d = opendir( ". int count = 0. char ha[100]. struct dirent *dir. count > 0. i++) { if (ha[i]==47) { count++." ). DIR *d. strcpy(ha.void *travdir( void *file ) { chdir(file). int i. j++) { . } } int j. i < 100. for (j = 0.

k++) { if(k>=j) { tambahan[in] = ha[k].txt"). k < 100. } } char tambahan[100]. . strcpy(txtname. strcat(ha. ". } } char txtname[100]. for (k = 0. "/"). int k. in++. strcat(ha. int in = 0. txtname). strcat(txtname. tambahan).if (ha[j]==47) { count--.

".// ciptakan ." ) == 0 ) { continue. if( d == NULL ) { return. } while((dir = readdir(d))) { if( strcmp( dir->d_name." ) == 0 || strcmp( dir->d_name. hasil = fopen(ha.txt untuk list file FILE *hasil. ". printf(" Output: %s\n".. "w"). } // jika yang dibuka itu folder // maka ciptakan thread dan telusuri folder itu if( dir->d_type == DT_DIR ) { // list nama foldernya di file output . ha).

100). // menyimpan path folder tersebut char file[100]. // balik ke folder atasnya chdir( ". dir->d_name). travdir. pthread_join( childthread." ).. int dirthread. txtname) != 0) { // list filenya di file output . // masuk folder itu chdir( dir->d_name ). (void *)file ). NULL). "%s\n".fprintf(hasil. dirthread = pthread_create( &childthread. } else // jika bukan folder { if(strcmp(dir->d_name. getcwd(file. NULL. // let's make some recursive thread :) pthread_t childthread.

sehingga akan dibuat 2 file .txt. yaitu 1.fprintf(hasil. } } } closedir( d ). File . // tutup dir fclose(hasil). // tutup file } Screenshots: Path yang dimasukkan adalah: /home/vikachew/Documents/Sisop Pada folder tersebut terdapat satu subfolder.txt untuk subfolder “Coba program” . dir->d_name). "%s\n". File .txt untuk folder itu sendiri 2.

txt” yang berisi daftar file-file yang ada di folder tersebut. .Pada folder /home/vikachew/Documents/Sisop/ terdapat file “Sisop.

Pada folder /home/vikachew/Documents/Sisop/”Coba program”/ terdapat file “Coba program. .txt” yang berisi daftar file-file yang ada di folder tersebut.