Sunday, June 17, 2012

PROSES, THREAD DAN SCHEDULING


Pada saat suatu proses dilakukan maka sebuah program akan mengeksekusi thread, dikarenakan sebuah thread lebih kecil dari pada sebuah proses, pembuatan thread biasanya menggunakan lebih sedikit sumber daya dibandingkan dengan pembuatan proses. Perbedaan lain dari pembuatan proses dengan pembuatan thread adalah pembuatan proses membutuhkan pengalokasian Prosses Control Block (PCB), yang merupakan struktur data yang agak besar. Dimana di dalam PCB tersebut terdapat peta memori (memory map) yang biasanya paling memakan waktu. Penciptaan proses juga sangat berat karena selalu membutuhkan ruang alamat baru yang akan dibuat dan bahkan jika proses berbagi memori maka proses komunikasi antar proses akan lebih berat dan mahal dibandingkan dengan komunikasi antar thread. Pembuatan thread pada sistem operasi, baik pada user level maupun pada kernel hanya melibatkan pengalokasian struktur data kecil untuk menangani suatu set register, stack dan priority[4].
Seperti yang telah di jelaskan sebelumnya,  sebuah proses dapat terdiri dari program yang mengeksekusi hanya thread tunggal ataupun banyak thread. Thread tunggal hanya dapat mengerjakan sebuah tugas dalam satuan waktu, dan banyak thread dapat mengerjakan banyak tugas dalam satuan waktu. Proses dengan banyak thread dan mengerjakan banyak tugas dalam satuan waktu inilah yang disebut dengan multithreading. Multithreading mengizinkan beberapa thread terjadi dalam sebuah proses dan saling berbagi sumber daya tetapi dapat dijalankan secara independen. Ada 4 keuntungan dari multithreading yaitu, responsif, berbagi sumber daya, ekonomis dan utilisasi arsitektur multiprosesor. Pada multithreading terdapat pemrograman-pemrograman yang dapat maupun tidak dapat meningkatkan sebuah solusi thread tunggal. Sebuah web server yang melayani setiap permintaan layanan di thread yang terpisah, sehingga web server tersebut dapat mempunyai banyak pengguna yang mengaksesnya secara bersamaan serta sebuah program aplikasi paralel seperti perkalian matriks dimana bagian berbeda dari matriks dapat dikerjaan secara paralel merupakan contoh pemrograman multithreading yang dapat meningkatkan sebuah thread tunggal. Adapun contoh dari pemrograman yang tidak meningkatkan kinerja dari thread tunggal diantaranya adalah setiap program sekuensial contohnya sebuah program yang digunakan untuk menghitung pengembalian pajak individu[3,6].
Terdapat tiga model multithreading, yaitu one to one, many to many dan one to many. Pada one to one setiap user-level thread akan di petakan ke setiap thread. Keuntungan dari model ini adalah sama dengan keuntungan thread kernel. Sedangkan kelemahan dari model ini ialah setiap pembuatan thread pengguna memerlukan tambahan thread kernel. Karena itu, jika mengimplementasikan sistem ini maka akan menurunkan kinerja dari sebuah aplikasi sehingga biasanya jumlah thread dibatasi dalam sistem. Pada model many to many, akan memultipleks banyak user-level thread ke kernel thread yang jumlahnya sedikit atau sama dengan user-lvl. Model ini mengizinkan developer membuat thread sebanyak yang ia mau tetapi concurrency tidak dapat diperloleh karena hanya satu thread yang dapat dijadwalkan oleh kernel pada suatu waktu. Keuntungan dari sistem ini ialah kernel thread yang bersangkutan dapat berjalan secara paralel pada multiprosesor[2].
Pada umumnya saat ini setiap sistem operasi moderen telah mendukung proses multithreading. Setiap sistem operasi memiliki konsep tersendiri dalam pengimplementasiannya. Sebuah sistem operasi dapat mendukung thread pada kernel maupun pada user-level(tinggat pengguna). Terdapat tida perbedaan antara kernel thread dan user-level thread yaitu, user-level thread tidak dikenali atau tidak di ketahui oleh sebuah kernel sedangkan kernel hanya mengenali kernel thread, user-level thread diimplementasikan dengan pustaka (library) thread sedangkan kernel thread di dukung langsung oleh sistem operasi dan dijadwalkan oleh kernel, serta sebuah kernel thread tidak dikaitkan dengan proses sedangkan setiap user-lever thread terkait dengan proses[5]. Pada user-lever thread pustaka(library) thread menyediakan fasilitas untuk pembuatan thread, penjadwalan thread, dan manajemen thread tanpa dukungan dari kernel. Semua pembuatan dan penjadwalan tersebut dilakukan dalam ruang pengguna tanpa campur tangan dari kernel. Thread ini biasanya dapat cepat dibuat dan dikendalikan. Selain didukung langsung oleh sistem operasi, pembuatan, penjadwalan dan manajemen kernel thread dilakukan kernel pada kernel space. Pengaturan kernel thread yang dilakukan oleh sistem operasi, mengakibatkan pembuatan dan pengaturan kernel thread lebih lambat dibandingkan dengan user-level thread. Kernel thread lebih baik dibandingkan user-level thread ketika thread melakukan blocking system call dan lebih baik ketika di dalam lingkungan multiprosesor. User-level thread biasanya lebih cepat untuk membuat dan mengelola, thread ini lebih baik dari kernel thread apabila tidak ada blocking system call[1,5].
Telah dijelaskan sebelumnya bahwa user-level thread dijadwalkan dengan pustaka (library thread) sedangkan kernel thread di dukung langsung oleh kernel (sistem operasi). Oleh karena itu pada saat context switch antara user level thread sebuah library thread akan mengambil user-level thread dan menggantinya dengan thread yang lain. Tindakan ini biasanya melibatkan penyelamatan dan pemulihan keadaan register. Sedangkan pada saat contect switch antara kernel thread sebuah kernel akan melakukan penyimpanan nilai register CPU dari thread yang di pindahkan dan melakukan pemulihan register CPU dari thread baru yang telah dijadwalkan[1,5].
Setelah membahas mengenai proses akan dibahas pula mengenai penjadwalan (scheduling). Penjadwalan berkaitan dengan permasalahan memutuskan proses mana yang akan dilaksanakan dalam suatu sistem. Proses yang belum mendapat jatah alokasi dari CPU akan mengantri di ready queue. Algoritma penjadwalan berfungsi untuk menentukan proses manakah yang ada di ready queue yang akan dieksekusi oleh CPU. Bagian berikut ini akan memberikan ilustrasi beberapa algoritma penjadwalan. FCFS (First Come First Serve) merupakan algoritma penjadwalan yang paling sederhana yang digunakan CPU. Dengan menggunakan algoritma ini setiap proses yang berada pada status ready dimasukkan kedalam FIFO queue atau antrian dengan prinsip first in first out, sesuai dengan waktu kedatangannya. Proses yang tiba terlebih dahulu yang akan dieksekusi. Kemudian algoritma SJF (Shortes Job First), pada algoritma ini setiap proses yang ada di ready queue akan dieksekusi berdasarkan burst time terkecil. Hal ini mengakibatkan waiting time yang pendek untuk setiap proses dan karena hal tersebut maka waiting time rata-ratanya juga menjadi pendek, sehingga dapat dikatakan bahwa algoritma ini adalah algoritma yang optimal. Algoritma ini dapat dibagi menjadi dua bagian. Pertama Preemptive Shortes Job First, jika ada proses yang sedang dieksekusi oleh CPU dan terdapat proses di ready queue dengan burst time yang lebih kecil daripada proses yang sedang dieksekusi tersebut, maka proses yang sedang dieksekusi oleh CPU akan digantikan oleh proses yang berada di ready queue tersebut. Preemptive SJF sering disebut juga Shortest Remaining Time First scheduling. Kedua Non-preemptive Shortes Job First, CPU tidak memperbolehkan proses yang ada di ready queue untuk menggeser proses yang sedang dieksekusi oleh CPU meskipun proses yang baru tersebut mempunyai burst time yang lebih kecil[2].

Pada saat suatu proses dilakukan maka sebuah program akan mengeksekusi thread, dikarenakan sebuah thread lebih kecil dari pada sebuah proses, pembuatan thread biasanya menggunakan lebih sedikit sumber daya dibandingkan dengan pembuatan proses. Perbedaan lain dari pembuatan proses dengan pembuatan thread adalah pembuatan proses membutuhkan pengalokasian Prosses Control Block (PCB), yang merupakan struktur data yang agak besar. Dimana di dalam PCB tersebut terdapat peta memori (memory map) yang biasanya paling memakan waktu. Penciptaan proses juga sangat berat karena selalu membutuhkan ruang alamat baru yang akan dibuat dan bahkan jika proses berbagi memori maka proses komunikasi antar proses akan lebih berat dan mahal dibandingkan dengan komunikasi antar thread. Pembuatan thread pada sistem operasi, baik pada user level maupun pada kernel hanya melibatkan pengalokasian struktur data kecil untuk menangani suatu set register, stack dan priority[4].
Seperti yang telah di jelaskan sebelumnya,  sebuah proses dapat terdiri dari program yang mengeksekusi hanya thread tunggal ataupun banyak thread. Thread tunggal hanya dapat mengerjakan sebuah tugas dalam satuan waktu, dan banyak thread dapat mengerjakan banyak tugas dalam satuan waktu. Proses dengan banyak thread dan mengerjakan banyak tugas dalam satuan waktu inilah yang disebut dengan multithreading. Multithreading mengizinkan beberapa thread terjadi dalam sebuah proses dan saling berbagi sumber daya tetapi dapat dijalankan secara independen. Ada 4 keuntungan dari multithreading yaitu, responsif, berbagi sumber daya, ekonomis dan utilisasi arsitektur multiprosesor. Pada multithreading terdapat pemrograman-pemrograman yang dapat maupun tidak dapat meningkatkan sebuah solusi thread tunggal. Sebuah web server yang melayani setiap permintaan layanan di thread yang terpisah, sehingga web server tersebut dapat mempunyai banyak pengguna yang mengaksesnya secara bersamaan serta sebuah program aplikasi paralel seperti perkalian matriks dimana bagian berbeda dari matriks dapat dikerjaan secara paralel merupakan contoh pemrograman multithreading yang dapat meningkatkan sebuah thread tunggal. Adapun contoh dari pemrograman yang tidak meningkatkan kinerja dari thread tunggal diantaranya adalah setiap program sekuensial contohnya sebuah program yang digunakan untuk menghitung pengembalian pajak individu[3,6].
Terdapat tiga model multithreading, yaitu one to one, many to many dan one to many. Pada one to one setiap user-level thread akan di petakan ke setiap thread. Keuntungan dari model ini adalah sama dengan keuntungan thread kernel. Sedangkan kelemahan dari model ini ialah setiap pembuatan thread pengguna memerlukan tambahan thread kernel. Karena itu, jika mengimplementasikan sistem ini maka akan menurunkan kinerja dari sebuah aplikasi sehingga biasanya jumlah thread dibatasi dalam sistem. Pada model many to many, akan memultipleks banyak user-level thread ke kernel thread yang jumlahnya sedikit atau sama dengan user-lvl. Model ini mengizinkan developer membuat thread sebanyak yang ia mau tetapi concurrency tidak dapat diperloleh karena hanya satu thread yang dapat dijadwalkan oleh kernel pada suatu waktu. Keuntungan dari sistem ini ialah kernel thread yang bersangkutan dapat berjalan secara paralel pada multiprosesor[2].
Pada umumnya saat ini setiap sistem operasi moderen telah mendukung proses multithreading. Setiap sistem operasi memiliki konsep tersendiri dalam pengimplementasiannya. Sebuah sistem operasi dapat mendukung thread pada kernel maupun pada user-level(tinggat pengguna). Terdapat tida perbedaan antara kernel thread dan user-level thread yaitu, user-level thread tidak dikenali atau tidak di ketahui oleh sebuah kernel sedangkan kernel hanya mengenali kernel thread, user-level thread diimplementasikan dengan pustaka (library) thread sedangkan kernel thread di dukung langsung oleh sistem operasi dan dijadwalkan oleh kernel, serta sebuah kernel thread tidak dikaitkan dengan proses sedangkan setiap user-lever thread terkait dengan proses[5]. Pada user-lever thread pustaka(library) thread menyediakan fasilitas untuk pembuatan thread, penjadwalan thread, dan manajemen thread tanpa dukungan dari kernel. Semua pembuatan dan penjadwalan tersebut dilakukan dalam ruang pengguna tanpa campur tangan dari kernel. Thread ini biasanya dapat cepat dibuat dan dikendalikan. Selain didukung langsung oleh sistem operasi, pembuatan, penjadwalan dan manajemen kernel thread dilakukan kernel pada kernel space. Pengaturan kernel thread yang dilakukan oleh sistem operasi, mengakibatkan pembuatan dan pengaturan kernel thread lebih lambat dibandingkan dengan user-level thread. Kernel thread lebih baik dibandingkan user-level thread ketika thread melakukan blocking system call dan lebih baik ketika di dalam lingkungan multiprosesor. User-level thread biasanya lebih cepat untuk membuat dan mengelola, thread ini lebih baik dari kernel thread apabila tidak ada blocking system call[1,5].
Telah dijelaskan sebelumnya bahwa user-level thread dijadwalkan dengan pustaka (library thread) sedangkan kernel thread di dukung langsung oleh kernel (sistem operasi). Oleh karena itu pada saat context switch antara user level thread sebuah library thread akan mengambil user-level thread dan menggantinya dengan thread yang lain. Tindakan ini biasanya melibatkan penyelamatan dan pemulihan keadaan register. Sedangkan pada saat contect switch antara kernel thread sebuah kernel akan melakukan penyimpanan nilai register CPU dari thread yang di pindahkan dan melakukan pemulihan register CPU dari thread baru yang telah dijadwalkan[1,5].
Setelah membahas mengenai proses akan dibahas pula mengenai penjadwalan (scheduling). Penjadwalan berkaitan dengan permasalahan memutuskan proses mana yang akan dilaksanakan dalam suatu sistem. Proses yang belum mendapat jatah alokasi dari CPU akan mengantri di ready queue. Algoritma penjadwalan berfungsi untuk menentukan proses manakah yang ada di ready queue yang akan dieksekusi oleh CPU. Bagian berikut ini akan memberikan ilustrasi beberapa algoritma penjadwalan. FCFS (First Come First Serve) merupakan algoritma penjadwalan yang paling sederhana yang digunakan CPU. Dengan menggunakan algoritma ini setiap proses yang berada pada status ready dimasukkan kedalam FIFO queue atau antrian dengan prinsip first in first out, sesuai dengan waktu kedatangannya. Proses yang tiba terlebih dahulu yang akan dieksekusi. Kemudian algoritma SJF (Shortes Job First), pada algoritma ini setiap proses yang ada di ready queue akan dieksekusi berdasarkan burst time terkecil. Hal ini mengakibatkan waiting time yang pendek untuk setiap proses dan karena hal tersebut maka waiting time rata-ratanya juga menjadi pendek, sehingga dapat dikatakan bahwa algoritma ini adalah algoritma yang optimal. Algoritma ini dapat dibagi menjadi dua bagian. Pertama Preemptive Shortes Job First, jika ada proses yang sedang dieksekusi oleh CPU dan terdapat proses di ready queue dengan burst time yang lebih kecil daripada proses yang sedang dieksekusi tersebut, maka proses yang sedang dieksekusi oleh CPU akan digantikan oleh proses yang berada di ready queue tersebut. Preemptive SJF sering disebut juga Shortest Remaining Time First scheduling. Kedua Non-preemptive Shortes Job First, CPU tidak memperbolehkan proses yang ada di ready queue untuk menggeser proses yang sedang dieksekusi oleh CPU meskipun proses yang baru tersebut mempunyai burst time yang lebih kecil[2].

No comments:

Post a Comment