Pembuatan Proses Dan Thread
Linux menggunakan representasi yang sama untuk proses dan thread.
Secara sederhana thread dapat dikatakan sebuah proses baru yang
berbagi alamat yang sama dengan induknya. Perbedaannnya terletak
pada saat pembuatannya. Thread baru dibuat dengan system call
clone yang membuat proses baru dengan identitas sendiri, namun
diizinkan untuk berbagi struktur data dengan induknya.
Secara tradisional, sumber daya yang dimiliki oleh proses induk
akan diduplikasi ketika membuat proses anak. Penyalinan ruang
alamat ini berjalan lambat, sehingga untuk mengatasinya, salinan
hanya dibuat ketika salah satu dari mereka hendak menulis di
alamat tersebut. Selain itu, ketika mereka akan berbagi alamat
tersebut ketika mereka hanya membaca. Inilah proses ringan yang
dikenal juga dengan thread.
Thread dibuat dengan __clone(). __clone() merupakan rutin dari
library system call clone(). __clone memiliki 4 buah argumen yaitu:
*
fn
fungsi yang akan dieksekusi oleh thread baru
*
arg
pointer ke data yang dibawa oleh fn
*
flags
sinyal yang dikirim ke induk ketika anak berakhir dan
pembagian sumber daya antara anak dan induk.
*
child_stack
pointer stack untuk proses anak.
clone() mengambil argumen flags dan child_stack yang dimiliki oleh __clone
kemudian menentukan id dari proses anak yang akan mengeksekusi
fn dengan argumen arg.
Pembuatan anak proses dapat dilakukan dengan fungsi fork() dan vfork().
Implementasi fork() sama seperti system call clone() dengan sighandler
SIGCHLD di-set, semua bendera clone di-clear yang berarti tidak ada
sharing dan child_stack dibuat 0 yang berarti kernel akan membuat stack
untuk anak saat hendak menulis. Sedangkan vfork() sama seperti fork()
dengan tambahan bendera CLONE_VM dan CLONE_VFORK di-set. Dengan vfork(),
induk dan anak akan berbagi alamat, dan induk akan di-block hingga
anak selesai.
Untuk memulai pembuatan proses baru, clone() akan memanggil fungsi do_fork().
Hal yang dilakukan oleh do_fork() antara lain:
*
memanggil alloc_task_struct() yang akan menyediakan tempat di memori
dengan ukuran 8KB untuk deskriptor proses dan stack modus kernel.
*
memeriksa ketersediaan sumber daya untuk membuat proses baru.
*
find_empty_procees() memanggil get_free_taskslot() untuk mencari
sebuah slot di array task untuk pointer ke deskriptor proses yang baru.
*
memanggil copy_files/fm/sighand/mm() untuk menyalin sumber daya untuk
anak, berdasarkan nilai flags yang ditentukan clone().
*
copy_thread() akan menginisialisasi stack kernel dari proses anak.
*
mendapatkan PID baru untuk anak yang akan diberikan kembali
ke induknya ketika do_fork() selesai.
Beberapa proses sistem hanya berjalan dalam modus kernel di belakang layar.
Untuk proses semacam ini dapat digunakan thread kernel. Thread kernel hanya
akan mengeksekusi fungsi kernel, yaitu fungsi yang biasanya dipanggil oleh
proses normal melalui system calls. Thread kernel juga hanya dieksekusi dalam
modus kernel, berbeda dengan proses biasa. Alamat linier yang digunakan oleh
thread kernel lebih besar dari PAGE_OFFSET proses normal yang dapat berukuran
hingga 4GB. Thread kernel dibuat sebagai berikut: int kernel_thread(int (*fn) (void *),
void *arg, unsigned long flags); flags=CLONE_SIGHAND, CLONE_FILES, etc
Jawaban UAS Kecerdasan Buatan
3 years ago
0 comments
Post a Comment