Your Ad Here

Deskriptor Proses

Posted by Rahadian Syarif | 11:57 PM | 0 comments »

Guna keperluan manajemen proses, kernel memelihara informasi tentang
setiap proses di sebuah deskriptor proses dengan tipe task_struct.
Setiap deskriptor proses mengandung informasi antara lain
status proses, ruang alamat, daftar berkas yang dibuka,
prioritas proses, dan sebagainya. Berikut gambaran isinya:

Isi deskriptor proses :


struct task_struct{
volatile long state;
/*-1 unrunnable,
0 runnable,
>0 stopped*/
unsigned long flags;
/* 1 untuk setiap flag proses */
mm_segment_t_addr_limit;
/* ruang alamat untuk thread */
struct exec_domain *exec_domain;
long need_resched;
long counter;
long priority;
/* SMP and runqueue state */
struct task_struct *next_task, *prev_task;
struct task_struct *next_run, *prev_run;
...
/* task state */
/* limits */
/* file system info */
/* ipc stuff */
/* tss for this task */
/* filesystem information */
/* open file information */
/* memory management info */
/* signal handlers */
...
};





Setiap proses di Linux memiliki status. Status proses merupakan array dari
flag yang mutually exclusive. Setiap proses memiliki tepat satu keadaan
(status) pada suatu waktu. Status tersebut adalah:

*

TASK_RUNNING

Pada status ini, proses sedang ataupun siap dieksekusi oleh CPU.
*

TASK_INTERRUPTIBLE

Pada status ini, proses sedang menunggu sebuah kondisi. Interupsi,
sinyal, ataupun pelepasan sumber daya akan membangunkan proses.
*

TASK_UNINTERRUPTIBLE

Pada status ini, proses sedang tidur dan tidak dapat dibangunkan
oleh suatu sinyal.
*

TASK_STOPPED

Pada status ini proses sedang dihentikan, misalnya oleh sebuah debugger.
*

TASK_ZOMBIE

Pada status ini proses telah berhenti, namun masih memiliki struktur
data task_struct di task vector dan masih memegang sumber daya yang sudah
tidak digunakan lagi.

Setiap proses ataupun eksekusi yang terjadwal secara independen memiliki
deskriptor prosesnya sendiri. Alamat dari deskriptor proses digunakan
untuk mengindentifikasi proses. Selain itu, nomor ID proses (PIDs) juga
digunakan untuk keperluan tersebut. PIDs adalah 32-bit bilangan yang
mengidentifikasikan setiap proses dengan unik. Linux membatasi PIDs
berkisar 0-32767 untuk menjamin kompatibilitas dengan sistem UNIX
tradisional.

Karena proses merupakan sesuatu yang dinamis, maka deskriptor proses
disimpan dalam memori yang dinamis pula. Untuk itu dialokasikan juga
memori sebesar 8KB untuk setiap proses untuk menyimpan proses deskriptornya
dan stack proses dari modus kernel. Keuntungan dari dal ini adalah pointer
dari deskriptor proses dari proses yang sedang berjalan (running) dapat
diakses dengan cepat menggunakan stack pointer. Selain itu,
8KB (EXTRA_TASK_STRUCT) dari memori akan di-cache untuk mem-bypass
pengalokasi memori kernel ketika sebuah proses dihapus dan sebuah proses
baru dibuat. Kedua perintah free_task_struct() dan alloc_task_struct()
akan digunakan untuk melepaskan atau mengalokasikan memori
seukuran 8KB sebagai cache.

Deskriptor proses juga membangun sebuah daftar proses dari semua proses
yang ada di sistem. Daftar proses tersebut merupakan sebuah doubly-linked
list yang dibangun oleh bagian next_task dan prev_task dari deskriptor
proses. Deskriptor init_task(mis:swapper) berada di awal daftar tersebut
dengan prev_task-nya menunjuk ke deskriptor proses yang paling akhir
masuk dalam daftar. Sedangkan makro for_each_task() digunakan untuk
memindai seluruh daftar.

Proses yang dijadwalkan untuk dieksekusi dari doubly-linked list dari
proses dengan status TASK_RUNNING disebut runqueue. Bagian prev_run dan
next_run dari deskriptor proses digunakan untuk membangun runqueue,
dengan init_task mengawali daftar tersebut. Sedangkan untuk memanipulasi
daftar di deskriptor proses tersebut, digunakan fungsi-fungsi:
add_to_runqueue(), del_from_runqueue(), move_first_runqueue(),
move_last_runqueue(). Makro NR_RUNNING digunakan untuk menyimpan
jumlah proses yang dapat dijalankan, sedangkan fungsi wake_up_process
membuat sebuah proses menjadi dapat dijalankan.

Untuk menjamin akurasinya, array task akan diperbarui setiap kali ada
proses baru dibuat ataupun dihapus. Sebuah daftar terpisah akan melacak
elemen bebas dalam array task itu. Ketika suatu proses dihapus, entrinya
ditambahkan di bagian awal dari daftar tersebut.

Proses dengan status task_interruptible dibagi ke dalam kelas-kelas yang
terkait dengan suatu event tertentu. Event yang dimaksud misalnya:
waktu kadaluarsa, ketersediaan sumber daya. Untuk setiap event ataupun
kelas terdapat antrian tunggu yang terpisah. Proses akan diberi sinyal
bangun ketika event yang ditunggunya terjadi. Berikut contoh dari
antrian tunggu tersebut:



void sleep_on(struct wait_queue **wqptr) {
struct wait_queue wait;
current_state=TASK_UNINTERRUPTIBLE;
wait.task=current;
add_wait_queue(wqptr, &wait);
schedule();
remove_wait_queue(wqptr, &wait);
}




Fungsi sleep_on() akan memasukkan suatu proses ke dalam antrian
tunggu yang diinginkan dan memulai penjadwal. Ketika proses itu
mendapat sinyal untuk bangun, maka proses tersebut akan dihapus
dari antrian tunggu.

Bagian lain konteks eksekusi proses adalah konteks perangkat keras,
misalnya: isi register. Konteks dari perangkat keras akan disimpan
oleh task state segment dan stack modus kernel. Secara khusus tss
akan menyimpan konteks yang tidak secara otomatis disimpan oleh
perangkat keras tersebut. Perpindahan antar proses melibatkan
penyimpanan konteks dari proses yang sebelumnya dan proses berikutnya.
Hal ini harus dapat dilakukan dengan cepat untuk mencegah terbuangnya
waktu CPU. Versi baru dari Linux mengganti perpindahan konteks
perangkat keras ini menggunakan piranti lunak yang mengimplementasikan
sederetan instruksi mov untuk menjamin validasi data yang disimpan
\serta potensi untuk melakukan optimasi.

Untuk mengubah konteks proses digunakan makro switch_to(). Makro
tersebut akan mengganti proses dari proses yang ditunjuk oleh prev_task
menjadi next_task. Makro switch_to() dijalankan oleh schedule() dan
merupakan salah satu rutin kernel yang sangat tergantung pada perangkat
keras (hardware-dependent). Lebih jelas dapat dilihat pada kernel/sched.c
dan include/asm-*/system.h.

0 comments

Your Ad Here