Definisi Proses
Proses merupakan program sedang
dieksekusi. Menurut Silberschatz proses tidak hanya sekedar suatu kode program
(text section), melainkan meliputi beberapa aktivitas yang bersangkutan seperti
program counter dan stack. Sebuah proses juga melibatkan stack yang berisi data
sementara (parameter fungsi/metode, return address, dan variabel lokal) dan
data section yang menyimpan variabel-variabel global. Tanenbaum juga
berpendapat bahwa proses adalah sebuah program yang dieksekusi yang mencakup
program counter, register, dan variabel di dalamnya [MDGR2006]. Perbedaan
antara program dengan proses adalah program merupakan entitas yang pasif, yaitu
suatu file yang berisi kumpulan instruksi-instruksi yang disimpan di dalam disk
(file executable), sedangkan proses merupakan entitas yang aktif,
dengan sebuah program counter yang menyimpan alamat instruksi selanjut yang
akan dieksekusi dan seperangkat sumber daya (resource) yang dibutuhkan agar
sebuah proses dapat dieksekusi.
Status Proses
Proses yang dieksekusi mempunyai
lima status yang terdiri dari:
a. new: Pembentukan suatu
proses
b. running:
Instruksi-instruksi yang sedang dieksekusi
c. waiting: Proses
menunggu untuk beberapa event yang terjadi
d. ready: Proses menunggu
untuk dialirkan ke pemroses (processor)
e. terminated: Proses
telah selesai dieksekusi.
Process Control Block (PCB)
Setiap proses digambarkan dalam
sistem operasi oleh sebuah process control block (PCB), juga
disebut sebuah control block. PCB berisikan banyak bagian dari informasi yang
berhubungan dengan sebuah proses yang spesifik, termasuk hal-hal di bawah ini:
• Status proses: status yang
mungkin adalah new, ready, running, waiting,
halted, dan seterusnya.
• Program counter: suatu penghitung
yang mengindikasikan alamat dari instruksi selanjutnya yang akan dieksekusi
untuk proses tersebut.
• CPU register: Register bervariasi
dalam jumlah dan tipenya, tergantung pada arsitektur komputer. Register
tersebut termasuk accumulator, index register, stack
pointer, general-purposes register, ditambah informasi condition-code.
Bersama dengan program counter, keadaan/status informasi harus disimpan ketika
gangguan terjadi, untuk memungkinkan proses tersebut berjalan/bekerja dengan
benar.
• Informasi manajemen memori: Informasi
ini dapat termasuk suatu informasi sebagai nilai dari dasar dan batas register,
tabel page/halaman, atau tabel segmen tergantung pada sistem memori yang
digunakan oleh sistem operasi.
• Informasi pencatatan: Informasi
ini termasuk jumlah dari CPU dan waktu nyata yang digunakan, batas waktu,
jumlah account, jumlah job atau proses, dan banyak lagi.
• Informasi status I/O: Informasi
termasuk daftar dari perangkat I/O yang di gunakan pada proses ini, suatu
daftar berkas-berkas yang sedang diakses dan banyak lagi.
PCB hanya berfungsi sebagai tempat
penyimpanan informasi yang dapat bervariasi dari proses yang
satu dengan yang lain.
Thread
Proses merupakan sebuah program
yang mengeksekusi thread tunggal. Kendali thread tunggal ini hanya memungkinkan
proses untuk menjalankan satu tugas pada satu waktu. Banyak sistem operasi
modern telah memiliki konsep yang dikembangkan agar memungkinkan sebuah proses
untuk mengeksekusi multi-threads. Misalnya user melakukan pekerjaan secara
bersamaan yaitu mengetik dan menjalankan pemeriksaan ejaan didalam proses yang
sama. Thread merupakan unit dasar dari penggunaan CPU, yang terdiri dari Thread
ID, program counter, register set, dan stack.
Sebuah thread berbagi code section, data section, dan sumber daya
sistem operasi dengan Thread lain yang dimiliki oleh proses yang sama. Thread
juga sering disebut lightweight process. Sebuah proses tradisional
atau heavyweight process mempunyai thread tunggal yang berfungsi
sebagai pengendali. Perbedaannya ialah proses dengan thread yang banyakmengerjakan
lebih dari satu tugas pada satu satuan waktu.
Pada umumnya, perangkat lunak yang
berjalan pada komputer modern dirancang secara multithreading. Sebuah aplikasi
biasanya diimplementasi sebagai proses yang terpisah dengan beberapa thread yang
berfungsi sebagai pengendali. Contohnya sebuah web browser mempunyai thread
untuk menampilkan gambar atau tulisan sedangkan thread yang lain berfungsi
sebagai penerima data dari network.
Terkadang ada sebuah aplikasi yang
perlu menjalankan beberapa tugas yang serupa. Sebagai contohnya sebuah web
server dapat mempunyai ratusan klien yang mengaksesnya secara concurrent. Kalau
web server berjalan sebagai proses yang hanya mempunyai thread tunggal maka ia
hanya dapat melayani satu klien pada pada satu satuan waktu. Bila ada klien
lain yang ingin mengajukan permintaan maka ia harus menunggu sampai klien
sebelumnya selesai dilayani. Solusinya adalah dengan membuat web server menjadi
multi-threading. Dengan ini maka sebuah web server akan membuat thread yang akan
mendengar permintaan klien, ketika permintaan lain diajukan maka web server
akan menciptakan thread lain yang akan melayani permintaan tersebut [MDGR2006].
Keuntungan Thread
Beberapa keuntungan dari penggunaan
thread adalah sebagai berikut:
a. Responsif.
Aplikasi interaktif menjadi tetap responsif meski pun sebagian dari program
sedang diblok atau melakukan operasi yang panjang kepada pengguna. Umpamanya,
sebuah thread dari web browser dapat melayani permintaan pengguna sementara
thread lain berusaha menampilkan gambar.
b. Berbagi sumber daya.
Thread berbagi memori dan sumber daya dengan thread lain yang dimiliki oleh
proses yang sama. Keuntungan dari berbagi kode adalah mengizinkan sebuah
aplikasi untuk mempunyai beberapa thread yang berbeda dalam lokasi memori yang
sama.
c. Ekonomis.
Pembuatan sebuah proses memerlukan dibutuhkan pengalokasian memori dan sumber
daya. Alternatifnya adalah dengan penggunaan thread, karena thread berbagi
memori dan sumber daya proses yang memilikinya maka akan lebih ekonomis untuk
membuat dan konteks penukaran thread. Akan susah untuk mengukur perbedaan waktu
antara proses dan thread dalam hal pembuatan dan pengaturan, tetapi secara umum
pembuatan dan pengaturan proses lebih lama dibandingkan thread. Pada Solaris,
pembuatan proses lebih lama 30 kali dibandingkan pembuatan thread, dan konteks
penukaran proses lima kali lebih lama dibandingkan konteks penukaran thread.
d. Utilisasi arsitektur
multiprocessor. Keuntungan dari multithreading dapat sangat meningkat
pada arsitektur multiprocessor, dimana setiap thread dapat berjalan secara
pararel di atas processor yang berbeda. Pada arsitektur processor tunggal, CPU
menjalankan setiap thread secara bergantian tetapi hal ini berlangsung sangat
cepat sehingga menciptakan ilusi pararel, tetapi pada kenyataannya hanya satu
thread yang dijalankan CPU pada satu-satuan waktu (satusatuan waktu pada CPU
biasa disebut time slice atau quantum).
Model Multithreading
Dukungan thread disediakan pada
tingkat user yaitu user threads atau tingka kernel untuk kernel
threads. User Threads disediakan oleh kernel dan diatur tanpa dukungan
kernel, sedangkan kernel therads didukung dan diatur secara langusng
oleh sistem operasi. Hubungan antara user threads dan kernel threads terdiri
dari tiga model relasi, yaitu:
Model Many to One: Model Many-to-One memetakan beberapa thread tingkatan pengguna ke
sebuah thread tingkatan kernel. Pengaturan thread dilakukan dalam ruang
pengguna, sehingga efisien. Hanya satu thread pengguna yang dapat mengakses
thread kernel pada satu saat. Jadi, multiple thread tidak dapat berjalan secara
paralel pada multiprocessor. Thread tingkat pengguna yang diimplementasi pada
sistem operasi yang tidak mendukung thread kernel menggunakan model
Many-to-One.
Model One to One: Model One-to-One memetakan setiap thread tingkatan pengguna ke thread
kernel. Ia menyediakan lebih banyak concurrency dibandingkan model Many-to-One.
Keuntungannya sama dengan keuntungan thread kernel. Kelemahannya model ini
ialah setiap pembuatan thread pengguna memerlukan pembuatan thread kernel.
Karena pembuatan thread dapat menurunkan kinerja dari sebuah aplikasi maka
implmentasi dari model ini, jumlah thread dibatasi oleh sistem. Contoh sistem
operasi yang mendukung model One-to-One ialah Windows NT dan OS/2.
Model Many To Many: Model ini me-multipleks banyak thread tingkatan pengguna ke thread
kernel yang jumlahnya lebih sedikit atau sama dengan tingkatan pengguna.
thread. Jumlah thread kernel spesifik untuk sebagian aplikasi atau sebagian
mesin. Many-to-One model mengizinkan developer untuk membuat user thread
sebanyak yang ia mau tetapi concurrency (berjalan bersama) tidak dapat
diperoleh karena hanya satu thread yang dapat dijadwal oleh kernel pada suatu
waktu. One-to-One menghasilkan concurrency yang lebih tetapi developer
harus hati-hati untuk tidak menciptakan terlalu banyak thread dalam suatu
aplikasi (dalam beberapa hal, developer hanya dapat membuat thread dalam jumlah
yang terbatas). Model Many-to-Many tidak mengalami kelemahan dari dua model di
atas. Developer dapat membuat user thread sebanyak yang diperlukan, dan kernel
thread yang bersangkutan dapat bejalan secara paralel pada multiprocessor. Dan
juga ketika suatu thread menjalankan blocking system call maka kernel dapat
menjadwalkan thread lain untuk melakukan eksekusi. Contoh sistem operasi yang
mendukung model ini adalah Solaris, IRIX, dan Digital UNIX.
Persoalan dalam Thread
System Calls fork() dan
exec()
Terdapat dua kemungkinan dalam
sistem UNIX jika fork dipanggil oleh salah satu thread dalam proses:
a. Semua thread diduplikasi.
b. Hanya thread yang memanggil
fork.
Jika suatu thread memanggil System
Call exec maka program yang dispesifikasi dalam parameter exec, akan
mengganti keseluruhan proses termasuk thread. Penggunaan dua versi dari fork di
atas tergantung dari aplikasi. Kalau exec dipanggil seketika sesudah fork, maka
duplikasi seluruh thread tidak dibutuhkan, karena program yang dispesifikasi
dalam parameter exec akan mengganti seluruh proses. Pada kasus ini cukup hanya
mengganti thread yang memanggil fork. Tetapi jika proses yang terpisah tidak
memanggil exec sesudah fork maka proses yang terpisah tersebut hendaknya
menduplikasi seluruh thread.
Pembatalan Thread
Pembatalan thread merupakan
penghentian tugas sebelum prosesnya selesai, sebagai contoh dalam web page,
pemanggilan suatu gambar menggunakan beberapa thread. Jika penggambaran belum
sempurna sedangkan user menekan tombol stop, maka seluruh penggambaran oleh
tiap-tiap thread tersebut akan dibatalkan secara kesuluruhan. Pembatalan suatu thread
dapat terjadi dalam dua skenario yang berbeda, yaitu:
a. Asynchronous cancellation:
suatu thread seketika itu juga memberhentikan target thread.
b. Deferred cancellation:
target thread secara perodik memeriksa apakah dia harus berhenti, cara ini
memperbolehkan target thread untuk memberhentikan dirinya sendiri secara
berurutan. Kejaidan yang sulit dari pembatalan suatu thread adalah ketika
terjadi situasi dimana sumber daya sudah dialokasikan untuk thread yang akan
dibatalkan. Selain itu kesulitan lain adalah ketika thread yang dibatalkan
sedang meng-update data yang ia bagi dengan thread lain. Hal ini akan menjadi
masalah yang sulit apabila menggunakan asynchronous cancellation.
Sistem operasi akan mengambil kembali sumber daya dari thread yang dibatalkan
namun seringkali sistem operasi tidak mengambil kembali seluruh sumber daya
dari thread tersebut. Alternatifnya adalah dengan menggunakan deffered
cancellation. Cara kerja dari deffered cancellation adalah
dengan menggunakan satu thread yang berfungsi sebagai pengindikasi bahwa target
thread akan dibatalkan. Tetapi pembatalan hanya akan terjadi jika target thread
telah memeriksa apakah ia harus batal atau tidak. Hal ini memperbolehkan thread
untuk memeriksa apakah ia harus berhenti pada titik tersebut secara aman.
Penanganan Sinyal
Sinyal yang digunakan pada sistem
UNIX untuk memberitahukan sebuah proses kalau suatu peristiwa telah terjadi.
Sebuah sinyal dapat diterima secara synchronous atau asynchronous
tergantung dari sumber dan alasan suatu event memberikan sinyal. Semua
sinyal (asynchronous dan synchronous) mengikuti pola yang
sama, yaitu:
a. Sebuah sinyal dimunculkan oleh
kejadian dari suatu event.
b. Sinyal yang dimunculkan tersebut
dikirim ke proses.
c. Sesudah dikirim, sinyal tersebut
harus ditangani.
Contoh dari sinyal synchronous adalah
ketika suatu proses melakukan pengaksesan memori secara ilegal atau pembagian
dengan nol, sinyal dimunculkan dan dikirim ke proses yang melakukan operasi
tersebut. Contoh dari sinyal asynchronous misalnya kita mengirimkan
sinyal untuk mematikan proses dengan keyboard (CTRL+C) maka sinyal asynchronous
dikirim ke proses tersebut. Setiap sinyal dapat ditangani oleh salah satu dari
dua penanganan sinyal, yaitu:
1. Penanganan sinyal default.
2. Penanganan sinyal yang didefinisikan
sendiri oleh user.
Penanganan sinyal pada program yang
hanya memakai thread tunggal cukup mudah yaitu hanya dengan mengirimkan sinyal
ke prosesnya. Tetapi mengirimkan sinyal lebih rumit pada program
multithreading, karena sebuah proses dapat memiliki beberapa thread. Secara
umum ada empat pilihan kemana sinyal harus dikirim, yaitu:
1. Mengirimkan sinyal ke thread
yang dituju oleh sinyal tersebut.
2. Mengirimkan sinyal ke setiap
thread pada proses tersebut.
3. Mengirimkan sinyal ke thread
tertentu dalam proses.
4. Menugaskan thread khusus untuk
menerima semua sinyal yang ditujukan pada proses.
Metode untuk mengirimkan sebuah
sinyal tergantung dari jenis sinyal yang dimunculkan. Sebagai contoh sinyal
synchronous perlu dikirimkan ke thread yang memunculkan sinyal tersebut bukan
thread lain pada proses itu. Tetapi situasi dengan sinyal asynchronous menjadi
tidak jelas. Beberapa sinyal asynchronous seperti sinyal yang
berfungsi untuk mematikan proses (contoh: Alt-F4) harus dikirim ke semua
thread. Beberapa versi UNIX yang multithreading mengizinkan thread menerima
sinyal yang akan ia terima dan menolak sinyal yang akan ia tolak. Karena itu
sinyal asynchronouns hanya dikirimkan ke thread yang tidak memblok sinyal
tersebut. Solaris 2 mengimplementasikan pilihan ke-4 untuk menangani sinyal.
Windows 2000 tidak menyediakan fasilitas untuk mendukung sinyal, sebagai
gantinya Windows 2000 menggunakan asynchronous procedure calls (APCs).
Thread Pools
Dalam situasi web server
multithreading ada dua masalah yang timbul, diantaranya adalah:
a. Ukuran waktu yang diperlukan
untuk menciptakan thread dalam melayani permintaan yang diajukan akan berlebih.
Pada kenyataannya thread dibuang ketika sudah menyelesaikan tugasnya.
b. Pembuatan thread yang tidak
terbatas jumlahnya dapat menurunkan performa dari sistem. Solusinya adalah
dengan penggunaan Thread Pools, cara kerjanya adalah dengan membuat
beberapa thread pada proses startup dan menempatkan mereka ke pools,
dimana thread tersebut menunggu untuk bekerja. Jadi ketika server menerima
permintaan maka akan membangunkan thread dari pool dan jika thread
tersebut tersedia, permintaan akan dilayani. Ketika thread sudah selesai
mengerjakan tugasnya maka thread tersebut kembali ke pool dan
menunggu pekerjaan lainnya. Bila
tidak thread yang tersedia pada saat dibutuhkan, maka server menunggu sampai
ada satu thread yang bebas.
Keuntungan menggunakan thread pool adalah:
• Umumnya lebih cepat dalam
melayani permintaan thread yang sudah ada dibandingkan dengan menunggu thread
baru yang sedang dibuat.
• Thread pool membatasi jumlah
thread yang ada pada suatu waktu. Hal ini penting pada sistem yang tidak dapat
mendukung banyak thread yang berjalan secara bersamaan.
Jumlah thread dalam pool dapat
tergantung dari jumlah CPU dalam sistem, jumlah memori fisik, dan jumlah
permintaan klien yang bersamaan. Thread yang dimiliki oleh suatu proses memang
berbagi data tetapi setiap thread mungkin membutuhkan duplikat dari data
tertentu untuk dirinya sendiri dalam keadaan tertentu. Data ini disebut thread-specific
data.
Tidak ada komentar:
Posting Komentar