Selasa, 23 November 2010

Sistem Operasi : Proses pada LINUX

Abstract : Apa yang ada dalam tulisan ini merupakan suatu konsep dasar proses pada sistem operasi khususnya sistem operasi linux seperti identifikasi proses, pembuatan proses dan komunikasi proses menggunakan signal. Setelah membaca tulisan ini diharapkan pembaca memiliki gambaran yang cukup jelas tentang konsep dasar proses pada sistem operasi linux.

1.Pendahuluan
Sebelum kita memasuki konsep proses dalam linux, alangkah lebih baiknya kita mengenal dahulu apa itu proses. Proses merupakan konsep pokok pada sistem operasi, karena salah satu tugas utama sistem operasi adalah bagaimana mengatur proses-proses yang berjalan di sistem. Sebenarnya apakah proses itu ?
Inilah beberapa definisi proses pada sistem operasi :
a.Program yang sedang dalam keadaan dieksekusi
b.Unit kerja terkecil yang secara individu memiliki sumber daya dan dijadwalkan oleh sistem operasi.
Sistem operasi mengolah seluruh proses yang ada di sistem dan bertugas mengalokasikan sumber daya – sumber daya ke proses yang membutuhkan sesuai dengan kebijaksanaan tertentu. Sumber daya yang dibutuhkan proses diantaranya CPU, memori, file serta I/O device.

2.Keadaan Proses
Keadaan proses disebut sebagai status proses yang terdiri dari :
a.Status New yaitu status dimana proses sedang dibuat.
b.Status Ready yaitu status dimana proses dieksekusi tetapi CPU belum tersedia karena sedang mengerjakan prses lain.
c.Status Waiting yaitu status dimana proses sedang menunggu suatu kejadian tertentu.
d.Status Running yaitu status dimana proses dieksekusi. Pada status ini CPU sedang mengeksekusi intruksi-intruksi pada proses.
e.Status Terminated yaitu status dimana proses diakhiri.

3.Konsep Pembuatan Proses
Konsep pembuatan Proses pada sistem operasi linux :
a.Setiap proses diberi nomor khusus sebagai identifikasi yang disebut process identification atau PID berupa angka integer unik.
b.Jika proses selesai maka semua sumber daya yang digunakan termasuk PID dibebaskan kembali.
c.Proses dibuat menggunakan sistem call fork() yang sering disebut forking proses.
d.System call fork() mengkopi proses pemanggil sehingga akan terdapat 2 proses yaitu:
•Proses pemanggil disebut PARENT
•Proses hasil kopian disebut CHILD
e.Proses CHILD identik dengan proses PARENT-nya tetapi memiliki PID yang berbeda.
f.Setelah proses baru berhasil dibuat eksekusi dilanjutkan secara normal di masing-masing proses pada baris setelah pemanggilan call fork().
g.Proses pemanggil dapat melakukan forking proses lebih dari satu kali sehingga memnugkinkan terdapat banyak proses CHILD yang dieksekusi.
h.Proses CHILD dapat melakukan forking proses seperti halnya PARENT sehingga dapat terbentuk struktur pohon proses.

4.Identifikasi Proses
Untuk melihat PID setiap proses di sistem, dapat digunakan perintah ps seperti
terlihat pada gambar berikut:













Gambar 1. Output ps
Pustaka GNU C telah menyediakan beberapa tipe dan fungsi untuk membaca ID proses, diantaranya:
-Tipe Data : pid_t
Tipe yang merepresentasikan ID proses, tipe data pid_t merupakan signed integer, dalam pustaka GNU tipe ini adalah int.
-Fungsi : pid_t getpid (void)
Fungsi 'getpid' mengembalikan ID proses aktif dan tidak membutuhkan argumen
-Fungsi : pid_t getppid (void)
Fungsi `getppid' (get parent pid) mengembalikan ID parent proses aktif dan tidak membutuhkan argumen
Untuk menggunakan tipe data dan fungsi diatas perlu disertakan file header types.h dan unistd.h Berikut contoh program yang yang membaca ID proses aktif dan ID proses parent-nya.
/* contoh1.c */
#include /* standard I/O */
#include /* getpid(), getppid() */
#include /* pid_t */
main() {
pid_t mypid, myparentpid; /* deklarasi variabel penampung */
mypid=getpid(); /* ambil ID proses ini */
myparentpid=getppid(); /* ambil ID parent proses ini */
/* tampilkan ID proses ini */
printf("PID Saya = %d\n",mypid);
/* tampilkan ID parent */
printf("PID PARENT Saya = %d\n",myparentpid);
}

Lakukan proses kompilasi dan Link program contoh1.c
gcc contoh1.c –o contoh1

Apabila proses kompilasi dan link sukses eksekusi program
./contoh1

PID Saya = 1028
PID PARENT Saya = 1027
Jika anda mencoba program ini maka output diatas tentunya dapat saja berbeda dengan output sistem anda. Pemanggilan fungsi pada bahasa C dapat disederhanakan dengan cara berikut:

printf("PID Saya = %d\n",getpid()); /* tampilkan PID proses ini */
printf("PID PARENT Saya = %d\n",getppid()); /* tampilkan PID parent */

5.Membuat Proses
Untuk membuat proses baru di sistem, GNU C menyediakan sistem call fork() yang disertakan pada pustaka unistd.h dengan bentuk prototype sebagai berikut :
pid_t fork (void);

fork() mengembalikan suatu besaran bertipe pidt_t yang dapat bernilai :
-1 menandakan pembuatan proses baru (child) gagal
0 menandakan proses child
selain itu merupakan proses parent dan jika variabel PID diakses berisi PID child.
Apabila operasi sukses akan terdapat 2 proses yang dieksekusi yaitu proses parent dan proses child, eksekusi akan dilanjutkan pada kedua proses setelah fork() sampai selesai. Seperti yang telah dijelaskan bahwa proses parent dan child dapat membuat proses parent dan child dapat membuat proses-proses baru yang lain sehingga terdapat banyak proses yang berjalan pada waktu bersamaan (multitasking). Berikut contoh program yang melakukan forking sebuah proses tanpa memeriksa nilai yang dikembalikan.

/* contoh2.c */
#include /* standard I/O */
#include /* fork() */
#include /* pid_t */
int main() {
printf("Hello\n"); /* tampilkan Hello */
fork(); /* buat proses child */
printf("Bye-Bye\n"); /* dieksekusi oleh parent dan child */
}

gcc contoh2.c –o contoh2

./contoh2
Hello
Bye-Bye
Bye-Bye

String “Hello” di tampilkan oleh parent sedangkan “Bye-Bye” masing- masing dieksekusi oleh parent dan child. Biar lebih jelas lagi sobat-sobat semua, ini dia ilustrasi forking proses pada program contoh2.c di atas.


Setelah menampilkan string “Hello” kelayar, eksekusi berikutnya adalah statement fork() yang akan membuat proses child, jika statement ini sukses dieksekusi maka akan terdapat 2 proses yang identik dengan PID yang berbeda. Seperti gambar berikut.

Eksekusi proses PARENT dan proses CHILD dilanjutkan di baris sesudah statement fork(), yaitu masing – masing parent dan child menampilkan string “Bye-Bye “. Demikian seterusnya sampai seluruh statement pada parent dan child dieksekusi dan kedua proses berakhir. Berikut contoh program pembuatan proses baru yang melakukan pemeriksaan nilai kembalian dari fork().

/* contoh3.c */
#include /* standard I/O */
#include /* standard library */
#include /*fork(), getpid(), getppid() */
#include /* pid_t */

int main(){
pid_t pid;
pid=fork(); /* buat proses child */
if (pid==-1){
print(“Fork gagal\n”);
exit(EXIT_FAILURE); /* exit jika gagal */
}
if (pid==0){
/* proses child */
print(“CHILD: Ini proses Child\n”);
print(“CHILD: PID saya = %d\n”,getpid());
print(“CHILD: PID parent saya = %d\n”,getppid());
} else {
/* proses parent */
print(“PARENT: Ini proses Parent\n”);
print(“PARENT: PID saya = %d\n”,getpid());
print(“PARENT: PID parent saya = %d\n”,getppid());
print(“PARENT: PID child saya = %d\n”,pid);
}
}

Blok if dapat digantikan dengan struktur switch case seperti berikut :
switch(pid) {
case -1 : print(“Fork gagal\n”);
exit(EXIT_FAILURE); /* exit jika gagal */
case 0 : /* proses child */
print(“CHILD: Ini proses Child\n”);
print(“CHILD: PID saya = %d\n”,getpid());
print(“CHILD: PID parent saya = %d\n”,getppid());
exit(EXIT_SUCCESS); /* child berakhir */
default : /* proses parent */
print(“PARENT: Ini proses Parent\n”);
print(“PARENT: PID saya = %d\n”,getpid());
print(“PARENT: PID parent saya = %d\n”,getppid());
print(“PARENT: PID child saya = %d\n”,pid);
exit(EXIT_SUCCESS); /* parent berakhir */
}

Setelah dikompilasi dan link didapat output berikut:
./contoh3

PARENT: Ini proses Parent
PARENT: PID saya = 1021
PARENT: PID parent saya = 1019
PARENT: PID child saya = 1022
CHILD : Ini proses Child
CHILD : PID saya = 1022
CHILD : PID parent saya = 1021

Output diatas memperlihatkan forking proses sukses dilakukan, sehingga terdapat 2 proses yang dieksekusi, pada proses parent variabel pid berisi PID child, sedangkan fungsi getppid() pada parent menghasilkan PID parent-nya yaitu PID dari program tempat contoh3 dieksekusi yaitu prompt shell bash. Output diatas dapat saja tidak berurutan dikarenakan quantum time suatu proses telah habis. Sistem operasi linux menggunakan quantum time untuk membatasi setiap proses yang dieksekusi. Ini terkait erat dengan algoritma penjadwalan yang digunakan yaitu Round Robin.
Nah segitu dulu deh tulisan-tulisan yang bisa aku tulis pada kesempatan kali ini, semoga bermanfaat untuk semua khalayak ramai. ^_^

Referensi :
Kuliah Umum IlmuKomputer.Com - Copyright © 2004 IlmuKomputer.Com
fajarmks@yahoo.com