top of page

Sistem I/O Linux #2 - Manajemen Proses Linux

  • Writer: Achmad Syarief Hidayatullah Amiruddin
    Achmad Syarief Hidayatullah Amiruddin
  • May 16, 2019
  • 3 min read

A. Pendahuluan dan Deskriptor Proses


Setiap aplikasi yang dijalankan di linux mempunyai pengenal yang disebut sebagai process identification number (PID). Hingga kernel versi 2.4, PID disimpan dalam angka 16 bit dengan kisaran dari 0-32767 untuk menjamin kompatibilitas dengan unix. Dari nomor PID inilah linux dapat mengawasi dan mengatur proses-proses yang terjadi didalam system.


Guna keperluan managemen 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.


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.



B. 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.


Thread dibuat dengan __clone() . __clone() merupakan rutin dari library system call clone() .

__clone memiliki 4 buah argumen yaitu:

  1. fn : fungsi yang akan dieksekusi oleh thread baru

  2. arg : pointer ke data yang dibawa oleh fn

  3. flags : sinyal yang dikirim ke induk ketika anak berakhir dan pembagian sumber daya antara anak dan induk.

  4. 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 .


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.


C. Penjadwalan


Penjadual adalah suatu pekerjaan yang dilakukan untuk mengalokasikan CPU time untuk tasks yang berbeda-beda dalam sistem operasi. Pada umumnya, kita berfikir penjadualan sebagai menjalankan dan menginterupsi suatu proses, untuk linux ada aspek lain yang penting dalam penjadualan: seperti menjalankan dengan berbagai kernel tasks. Kernel tasks meliputi task yang diminta oleh proses yang sedang dijalankan dan tasks yand dieksekusi internal menyangkut device driver yang berkepentingan. Ketika kernel telah mencapai titik penjadualan ulang, entah karena terjadi interupsi penjadualan ulang mau pun karena proses kernel yang sedang berjalan telah diblokir untuk menunggu beberapa signal bangun, harus memutuskan proses selanjutnya yang akan dijalankan.


Linux telah memiliki dua algoritma penjadualan proses yang terpisah satu sama lain. Algoritma yang pertama adalah algoritma time-sharing untuk penjadualan preemptive yang adil diantara sekian banyak proses. Sedangkan algoritma yang kedua didesain untuk tugas real-time dimana proritas mutlak lebih utama daripada keadilan mendapatkan suatu pelayanan. Bagian dari tiap identitas proses adalah kelas penjadualan, yang akan menentukan algoritma yang digunakan untuk tiap proses. Kelas penjadualan yang digunakan oleh Linux, terdapat dalam standar perluasan POSIX untuk sistem komputer waktu nyata.


D. Symmetric Multithreading


Kernel Linux 2.0 adalah kernel Linux pertama yang stabil untuk mendukung perangkat keras symmetric multiprocessor (SMP). Proses mau pun thread yang berbeda dapat dieksekusi secara paralel dengan processor yang berbeda. Tapi bagaimana pun juga untuk menjaga kelangsungan kebutuhan sinkronisasi yang tidak dapat di-preemptive dari kernel, penerapan SMP ini menerapkan aturan dimana hanya satu processor yang dapat dieksekusi dengan kode mode kernel pada suatu saat. SMP menggunakan kernel spinlock tunggal untuk menjalankan aturan ini. Spinlock ini tidak memunculkan permasalahan untuk pekerjaan yang banyak menghabiskan waktu untuk menunggu proses komputasi, tapi untuk pekerjaan yang melibatkan banyak aktifitas kernel, spinlock dapat menjadi sangat mengkhawatirkan.


Sebuah proyek yang besar dalam pengembangan kernel Linux 2.1 adalah untuk menciptakan penerapan SMP yang lebih masuk akal, dengan membagi kernel spinlock tunggal menjadi banyak kunci yang masing-masing melindungi terhadap masuknya kembali sebagian kecil data struktur kernel. Dengan menggunakan teknik ini, pengembangan kernel yang terbaru mengizinkan banyak processor untuk dieksekusi oleh kode mode kernel secara bersamaan.


コメント


Post: Blog2_Post

©2019 by Amad's Blog. Proudly created with Wix.com

bottom of page