Proses merupakan konsep pokok pada sistem operasi, karena salah satu tugas utama sistemoperasi adalahbagaimana mengatur proses – proses yang berjalan di sistem. Sebenarnya apakah Proses itu?Berikut beberapa definisi proses pada sistem operasi adalah :
1. Program yang sedang dalam keadaan dieksekusi.
2. Unit kerja terkecil yang secara individu memiliki sumber daya dan dijadwalkan olehsistemoperasi.
Sistem operasi mengolah seluruh proses yang ada di sistem dan bertugasmengalokasikan sumber daya –sumber daya ke proses yang membutuhkan sesuai dengankebijaksanaan tertentu. Sumber daya yang dibutuhkan proses diantaranya CPU, memori, fileserta I/O device.
Beberapa tipe proses :
•Foreground : Proses yang diciptakan oleh pemakai langsung pada terminal (interaktif, dialog)
•Batch : Proses yang dikumpulkan dan dijalankan secara sekuensial (satu persatu). ProseBatch tidak diasosiasikan (berinteraksi) dengan terminal.
•Daemon : Proses yang menunggu permintaan (request) dari proses lainnya dan menjalankantugas sesuai dengan permintaan tersebut. Bila tidak ada request, maka program iniakan berada dalam kondisi “idle” dan tidak menggunakan waktu hitung CPU.Umumnya nama proses daemon di UNIX berakhiran d, misalnya inetd, named, popd dll
Keadaan/ Status Proses :
Proses – proses yang dikelola oleh sistem operasi akan melalui serangkaian keadaan yang merupakan bagian dari aktivitasnya. Keadaan proses ini disebut sebagai status proses yang terdiri dari:
•Status New yaitu status dimana proses sedang dibuat.
•Status Ready yaitu status dimana proses siap dieksekusi tetapi CPU belum tersediakarena sedang mengerjakan proses lain.
•Status Waiting yaitu status dimana proses sedang menunggu suatu kejadian tertentu.Misalnya sedang menunggu operasi I/O selesai, menunggu signal dari proses lain,tersedianya memori, dsb.
•Status Running yaitu status dimana proses dieksekusi. Pada status ini CPU sedangmengeksekusi instruksi – instruksi pada proses.
•Status Terminated yaitu status dimana proses diakhiri
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.
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 */
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.
PENJADWALAN
Penjadwalan adalah suatu pekerjaan yang dilakukan untuk mengalokasikan CPU timeuntuk tasks yang berbeda-beda dalam sistem operasi. Untuk linux ada aspek lain yangpenting dalam penjadwalan: seperti menjalankan dengan berbagai kernel tasks.Linux mempunyai dua algoritma penjadwalan yaitu :
•Algoritma time-sharing untuk penjadwalan preemptive yang adil diantara sekianbanyak proses.
•Algoritma yang kedua didesain untuk tugas real-time dimana proritas mutlak lebih utama daripada keadilan mendapatkan suatu pelayanan.
KONSEP THREAD
Thread merupakan unit dasar dari penggunaan CPU, yang terdiri dari Thread_ID, program counter, register set,danstack . Sebuah thread berbagi code section, datasection, dan sumber daya sistem operasi dengan Thread lain yang dimiliki oleh prosesyang sama dan Thread juga sering disebut lightweight process.
Keuntungan Thread :
- Responsif
- Berbagai sumber daya
- Ekonomis
- Utilisasi arsitektur multiprosessor
Thread kernel :
- Thread kernel didukung langsung oleh sistem operasi. Pembuatan,penjadwalan, dan manajemen thread dilakukan oleh kernel pada kernel space
- Thread diatur oleh kernel, karena itu jika sebuah thread menjalankan blocking system call maka kernel dapat menjadwalkan thread lain diaplikasi untuk melakukan eksekusi.
- Pada lingkungan multiprocessor, kernel dapat menjadwal thread-thread pada processor yang berbeda. Contoh sistem operasi yang mendukung kernel thread adalah Windows NT, Solaris, Digital UNIX.
Thread Cancellation :
Thread cancellation adalah pemberhentian thread sebelum tugasnya selesai.Pemberhentian target
thread dapat terjadi melalui dua cara yang berbeda:
1. Asynchronous cancellation : suatu thread seketika itu juga memberhentikan target thread
2. Defered cancellation : target thread secara perodik memeriksa apakah dia harusberhenti, cara ini memperbolehkan target thread untuk memberhentikan dirinya sendirisecara terurut.
Thread Kernel Linux :
Linus Torvalds mendefinisikan bahwa sebuah thread adalah Context of Execution (COE),yang berarti bahwa hanya ada sebuah Process Control Block (PCB) dan sebuahpenjadwal yang diperlukan. Linux tidak mendukung multithreading, struktur data yangterpisah, atau pun rutin kernel.
Linux menyediakan 2 system call yaitu :
1.Fork memiliki fungsi untuk menduplikasi proses dimana proses anak yang dihasilkanbersifat
Independent.
2. Clone memiliki sifat yang mirip dengan fork yaitu sama-sama membuat duplikat dariproses induk.