S.I


Latar belakang

Ketika pertama kali dikembangkan, Linux tidak didukung dengan threading di dalam kernelnya, tetapi dia mendukung proses-proses sebagai entitas yang dapat dijadwalkan melalui clone system calls. Sekarang Linux mendukung penduplikasian proses menggunakan system call clone dan fork. Clone mempunyai sifat mirip dengan fork, kecuali dalam hal pembuatan copy dari proses yang dipanggil dimana ia membuat sebuah proses yang terpisah yang berbagi address space dengan proses yang dipanggil.

Pembagian address space dari parent process memungkinkan cloned task bersifat mirip dengan thread yang terpisah. Pembagian address space ini dimungkinkan karena proses direpresentasikan di dalam Kernel Linux. Di dalam Kernel Linux setiap proses direpresentasikan sebagai sebuah struktur data yang unik. Jadi, daripada menciptakan yang baru maka struktur data yang baru mengandung pointer yang menunjuk ke tempat dimana data berada. Jadi ketika fork dipanggil, proses yang baru akan tercipta beserta duplikasi dari segala isi di struktur data di parent process, namun ketika clone dipanggil, ia tidak menduplikasi parent processnya tetapi menciptakan pointer ke struktur data pada parent process yang memungkinkan child process untuk berbagi memori dan sumber daya dari parent processnya.

 Project LinuxThread menggunakan system call ini untuk mensimulasi thread di user space. Sayangnya, pendekatan ini mempunyai beberapa kekurangan, khusunya di area signal handling, scheduling, dan interprocess synchronization primitive.

Pendahuluan

Linux adalah sebuah sistem operasi komputer. Pembangunan Linux dimulai tahun 1990 oleh Linus Torvald, seorang mahasiswa dari University of Helsinki, Finlandia. Saat ini, Linux adalah salah satu pilihan sistem operasi selain Microsoft Windows, UNIX, Solaris, QNX dan beberapa sistem operasi lainnya.

Sebagai sistem operasi, Linux bertugas mengambil kendali infrastruktur perangkat keras (hardware) ketika pertama kali sistem tersebut dijalankan. Linux mendukung berbagai platform hardware dari mulai PC berbasiskan Intel, Macintosh, Amiga, Silicon Graphics, Digital Alpha, sampai dengan perangkat mini computer seperti PDAdan pocket PC.

Sebenarnya nama Linux adalah nama inti dari sistem operasi itu saja (kernel), bukan seluruh aplikasi yang terpaket dalam CD atau aplikasi-aplikasi yang berjalan diatasnya, namun sudah umum diketahui bahwa sistem operasi dengan kernel Linux disertai aplikasi-aplikasi pendukungnya disebut secara keseluruhan sebagai Linux.

Linux mengatur semua proses di dalam sistem melalui pemeriksaan dan perubahan terhadap setiap struktur data task_struct yang dimiliki setiap proses. Sebuah daftar pointer ke semua struktur data task_struct disimpan dalam task vector. Jumlah maksimum proses dalam sistem dibatasi oleh ukuran dari task vector. Linux umumnya memiliki task vector dengan ukuran 512 entries. Saat proses dibuat, task_struct baru dialokasikan dari memori sistem dan ditambahkan ke task vector. Linux juga mendukung proses secara real time. Proses semacam ini harus bereaksi sangat cepat terhadap event eksternal dan diperlakukan berbeda dari proses biasa lainnya oleh penjadwal.

Proses akan berakhir ketika ia memanggil exit(). Kernel akan menentukan waktu pelepasan sumber daya yang dimiliki oleh proses yang telah selesai tersebut. Fungsi do_exit akan dipanggil saat terminasi yang kemudian memanggil __exit_mm/files/fs/sighand() yang akan membebaskan sumber daya. Fungsi exit_notify() akan memperbarui hubungan antara proses induk dan proses anak, semua proses anak yang induknya berakhir akan menjadi anak dari proses init. Terakhir akan dipanggil scheduler untuk menjalankan proses baru.

Deskriptor Proses

Kernel adalah aplikasi yang selalu berjalan ketika menjalankan sistem operasi. Karena program2 ini selalu difungsikan ikut serta memberi service terhadap setiap instruksi yang mengeksekusi data sekaligus menjalankan aplikasinya.

Dalam sistem operasi Linux, Kernel memegang peranan penting khususnya dalam membantu manajemen memori(pengalokasian dan pembebasan pages,kumpulan pages,dan kumpulan blok kecil memori dan swaping (pemindahan data dengan melibatkan virtual memori sehingga bisa memetakan alamat ruang dari proses yang berjalan).

Pada tabel kernel pages memetakan sebanyak mungkin memori fisik dalam range alamat. Alamat fisik yang ditempati oleh kode kernel dan data telah dipesan dan tak akan dialokasikan untuk tujuan
lain.

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:

Contoh 7-1. 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 atau pun siap dieksekusi oleh CPU.

  • TASK_INTERRUPTIBLE

Pada status ini, proses sedang menunggu sebuah kondisi. Interupsi, sinyal, atau pun 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 atau pun 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 hal 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.

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 atau pun 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 atau pun kelas terdapat antrian tunggu yang terpisah. Proses akan diberi sinyal bangun ketika event yang ditunggunya terjadi. Berikut contoh dari antrian tunggu tersebut:

Contoh 7-2. Antrian Tunggu

                                                                                                           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.

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.

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.

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.

http://www.BLOG-E AHTOVIC _ KERNELL LINUX DAN VIRTUA MEMORI.htm

Tentang niesha30

anak pertama dari 2 bersaudara yang pasti :)
Pos ini dipublikasikan di Uncategorized. Tandai permalink.

4 Balasan ke S.I

  1. loewyi berkata:

    ini makul masalah sistem operasi yach mbak???😀

  2. angkillerz berkata:

    Linux is File

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s