Praktikum IV Process dan Thread Tujuan Praktikum : 1. Mengerti konsep proses dan thread 2. Mampu membuat proses dan thread 3. Mmampu memanajemen proses
I. Dasar Teori I.1. Proses Proses adalah program yang sedang dieksekusi. Setiap kali menjalankan suatu program, Sistem UNIX melakukan suatu fork(), yaitu melakukan beberapa urutan operasi untuk membuat suatu proses konteks dan kemudian mengeksekusi program tersebut dalam konteks yang sudah dibuat. Setiap proses yang dijalankan akan memiliki PID (Process ID). Kita dapat melihat proses yang sedang berjalan dengan perintah ps. Dengan fork() sistem call akan membuat proses baru yang identik dengan proses induk kecuali proses ID. Proses dicopy ke memory dari proses parent dan strukture proses baru ditangani oleh kernel. Lingkungan, resource limits, umask, controlling terminal, direktori tempat eksekusi, root direktori, signal mask, dan resource proses lainnya digandakan dari proses induk oleh proses fork. I.2. Thread Operasi thread meliputi pembuatan thread, penghentian, sikronisasi, penjadwalan, managemen, dan pengulangan proses. Thread tidak mengatur pembuatan thread lain, atau mengetahui sebuah thread laen telah dibuat. semua thread dengan sebuah proses saling berbagi pakai address space. Thread pada satu proses yang sama saling berbagi pakai: - Process instructions - Most data - open files (descriptors) - signals and signal handlers - current working directory - User and group id setiap thread merupakan unik - Thread ID - set of registers, stack pointer - stack for local variables, return addresses - signal mask - priority - Return value: errno fungsi pthread memberikan nilai #0# jika OK
Modul Praktikum Sistem Operasi Praktikum IV
Contoh membuat dan mengakhiri thread
#include <stdio.h> #include <stdlib.h> #include
void *print_message_function( void *ptr ); main() { pthread_t thread1, thread2; char *message1 = "Thread 1"; char *message2 = "Thread 2"; int iret1, iret2; /* Create independent threads each of which will execute function */ iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1); iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2); /* Wait till threads are complete before main continues. Unless we */ /* wait we run the risk of executing an exit which will terminate */ /* the process and all threads before the threads have completed. */ pthread_join( thread1, NULL); pthread_join( thread2, NULL); printf("Thread 1 returns: %d\n",iret1); printf("Thread 2 returns: %d\n",iret2); exit(0); } void *print_message_function( void *ptr ) { char *message; message = (char *) ptr; printf("%s \n", message); }
Modul Praktikum Sistem Operasi Praktikum IV
II.MATERI PRAKTIKUM 1. Login ke sistem GNU/Linux kemudian buka terminal. 2. Pelajari dan lakukan percobaan terhadap perintah-perintah berikut :
Percobaan 1 : Melihat Memory Komputer $ free -okt
Percobaan 2 : Melihat Keseluruhan Proses yang berjalan $ top
Percobaan 3 : Mejadwalkan Proses dan Pembatalkanya 1. Menggunakan instruksi at : a. $ date b. $ at <waktu yang mendekati waktu saat ini> misal : $ at 17:15 c. Akan muncul prompt 'at' d. dmesg > simpanan e. Tekan ENTER kemudian CTRL+D f. Lihatlah daftar antrian dengan mengetikkan : $at –l 2. Membatalkan proses $ at -d nomorjobid, misal : $at -d 12
Percobaan 4 : Mengecek Proses yang berjalan di sistem $ jobs $ jobs -l
Modul Praktikum Sistem Operasi Praktikum IV
Percobaan 5 : Membuat Background dan Foreground Proses 1. Ketik Sorcode ini lalu simpanlah dengan nama proses.sh #! /bin/sh i=0 while [ true ]; do i=$(($i+1)) done echo $i 2. Ubah hak Aksesnya $ chmod +x proses.sh 3. Eksekusilah program proses.sh $ ./proses.sh 4. Suspend Prosesnya Ketik : CTRL + Z 5. Lihat NomorJOB proses yang kita suspend $ jobs 6. Jalankan Proses di Background $ bg %nomorjobs_padaProses 7. Lihat Apakah proses sudah berjalan lagi $ jobs 8. Jalankan Proses di Foreground $ fg %nomorPIDpadajobs Suspend Prosesnya $ Ketik CTRL + Z 9. Lihat PID proses foreground $ ps 10. Hentikan Proses tersebut $ kill -9
Modul Praktikum Sistem Operasi Praktikum IV
Percobaan 6 : Membuat Fork di dalam Proses #include #include #include #include
<stdio.h> <stdlib.h> <errno.h>
/* /* /* /*
printf, stderr, fprintf */ _exit, fork */ exit */ errno */
int main(void) { pid_t pid; /* Output from both the child and the parent process * will be written to the standard output, * as they both run at the same time. */ pid = fork(); if (pid == 0) { /* Child process: * When fork() returns 0, we are in * the child process. * Here we count up to ten, one each second. */ int j; for (j = 0; j < 10; j++) { printf("child: %d\n", j); sleep(1); } _exit(0); /* Note that we do not use exit() */ } else if (pid > 0) { /* Parent process: * When fork() returns a positive number, we are in the parent process * (the fork return value is the PID of the newlycreated child process). * Again we count up to ten. */ int i; for (i = 0; i < 10; i++) { printf("parent: %d\n", i); sleep(1); } exit(0); } Modul Praktikum Sistem Operasi Praktikum IV
else {
/* Error: * When fork() returns a negative number, an error happened * (for example, number of processes reached the limit ). */ fprintf(stderr, "can't fork, error %d\n", errno); exit(EXIT_FAILURE); } } Untuk Percobaan 6 ikuti langkah – langkah berikut ini : A) B)
Simpan source code dengan nama fork.c Lalu kompile sorce code tersebut dengan perintah $ gcc -o fork fork.c
C)
Running file hasil kompile dengan perintah $ ./fork
III.
TUGAS PRAKTIKUM
A. Tugas Pendahuluan 1.Jelaskan Perbedaan thread dan Proses ? 2.Cari tahu tentang DAEMON, Jelaskan dan berikan Contohnya ? 3.Gambarkan Proses Terjadinya thread ? 4.Cari tahu tentang Fork(), jelaskan fungsinya ?
Modul Praktikum Sistem Operasi Praktikum IV
B. Tugas Praktikum IV 1. Pahamilah contoh kode hello.c sederhana berikut : #include #include <stdio.h> #include <stdlib.h> #define NUM_THREADS
5
void *PrintHello(void *threadid) { long tid; tid = (long)threadid; printf("Hello World! It's me, thread #%ld!\n", tid); pthread_exit(NULL); } int main(int argc, char *argv[]) { pthread_t threads[NUM_THREADS]; int rc; long t; for(t=0;t
}
/* Last thing that main() should do */ pthread_exit(NULL);
Kemudian eksekusi juga dengan beberapa opsi berikut, tuliskan apa yang terjadi. a) icc -pthread -o hello hello.c b) pathcc -pthread -o hello hello.c c) pgcc -lpthread -o hello hello.c d) gcc -pthread -o hello hello.c Modul Praktikum Sistem Operasi Praktikum IV
2. 3. 4. 5.
Buat sebuah program yang menunjukkan pembuatan dan termination sebuah thread. Buat program satu ekseskusi 100 proses/100 thread. Buatlah sebuah daemon pada waktu tertentu menampilkan pesan “hello”. Berikan Kesimpulan dari praktikum ini.
Modul Praktikum Sistem Operasi Praktikum IV