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.