=>Model proses yang didiskusikan sejauh ini telah menunjukkan
bahwa suatu proses adalah sebuah program yang menjalankan
eksekusi thread tunggal. Sebagai contoh, jika sebuah proses
menjalankan sebuah program Word Processor, ada sebuah
thread tunggal dari instruksi-instruksi yang sedang dilaksanakan.
=>Kontrol 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 memiliki eksekusi multi-threads, agar dapat
secara terus menerus mengetik dan menjalankan pemeriksaan ejaan
di dalam proses yang sama, maka sistem operasi tersebut
memungkinkan proses untuk menjalankan lebih dari satu tugas
pada satu waktu.
=>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 yg sama.
Thread juga sering disebut lightweight process. Sebuah proses tradisional
atau heavyweight process mempunyai thread tunggal yang berfungsi
sebagai pengendali. Perbedaan antara proses dengan thread tunggal
dengan proses dengan thread yang banyak adalah proses dengan thread
yang banyak dapat mengerjakan lebih dari satu tugas pada satu satuan waktu.
Gambar Thread
=>Banyak perangkat lunak yang berjalan pada PC modern
dirancang secara multi-threading. 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.
=>Kadang kala ada situasi dimana sebuah aplikasi diperlukan
untuk 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.
=>Java mempunyai pengunaan lain dari thread. Perlu diketahui
bahwa Java tidak mempunyai konsep asynchronous. Sebagai
contohnya kalau program java mencoba untuk melakukan koneksi
ke server maka ia akan berada dalam keadaan block state sampai
koneksinya jadi (dapat dibayangkan apa yang terjadi apabila servernya
mati). Karena Java tidak memiliki konsep asynchronous maka
solusinya adalah dengan membuat thread yang mencoba untuk
melakukan koneksi ke server dan thread lain yang pertamanya tidur
selama beberapa waktu (misalnya 60 detik) kemudian bangun.
Ketika waktu tidurnya habis maka ia akan bangun dan memeriksa
apakah thread yang melakukan koneksi ke server masih mencoba
untuk melakukan koneksi ke server, kalau thread tersebut masih dalam
keadaan mencoba untuk melakukan koneksi ke server maka ia akan
melakukan interrupt dan mencegah thread tersebut untuk mencoba
melakukan koneksi ke server.
Keuntungan Thread
Keuntungan dari program yang multithreading dapat dipisah
menjadi empat kategori:
1.Responsi: Membuat aplikasi yang interaktif menjadi multithreading
dapat membuat sebuah program terus berjalan meski pun sebagian
dari program tersebut diblok atau melakukan operasi yang panjang,
karena itu dapat meningkatkan respons kepada pengguna. Sebagai
contohnya dalam web browser yang multithreading, sebuah thread dapat
melayani permintaan pengguna sementara thread lain berusaha
menampilkan image.
2.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.
3.Ekonomi: dalam pembuatan sebuah proses banyak 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 context switch 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 context switch proses 5
kali lebih lama dibandingkan context switch thread.
4.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 (satu-satuan waktu pada
CPU biasa disebut time slice atau quantum).
USER DAN KERNEL THREAD:
User Thread:
User thread didukung di atas kernel dan diimplementasi oleh thread
library pada user level. Library menyediakan fasilitas untuk pembuatan
thread, penjadualan thread, dan managemen thread tanpa dukungan
dari kernel. Karena kernel tidak menyadari user-level thread maka semua
pembuatan dan penjadualan thread dilakukan di user space tanpa
intervensi dari kernel. Oleh karena itu, user-level thread biasanya cepat
untuk dibuat dan diatur. Tetapi user thread mempunyai kelemahan yaitu
apabila kernelnya merupakan thread tunggal maka apabila salah satu
user-level thread menjalankan blocking system call maka akan
mengakibatkan seluruh proses diblok walaupun ada thread lain yang
dapat jalan dalam aplikasi tersebut. Contoh user-thread libraries
adalah POSIX Pthreads, Mach C threads, dan Solaris threads.
Kernel Thread:
Kernel thread didukung langsung oleh sistem operasi. Pembuatan,
penjadualan, dan managemen thread dilakukan oleh kernel pada
kernel space. Karena pengaturan thread dilakukan oleh sistem operasi
maka pembuatan dan pengaturan kernel thread lebih lambat
dibandingkan user thread. Keuntungannya adalah thread diatur oleh
kernel, karena itu jika sebuah thread menjalankan blocking system call
maka kernel dapat menjadualkan thread lain di aplikasi untuk melakukan
eksekusi. Keuntungan lainnya adalah pada lingkungan multiprocessor,
kernel dapat menjadual thread-thread pada processor yang berbeda.
Contoh sistem operasi yang mendukung kernel thread adalah WindowsNT,
Solaris, Digital UNIX.
MULTITHREADING MODELS
1.Many-to-One Model
Many-to-One model memetakan banyak user-level thread ke satu
kernel thread.
Pengaturan thread dilakukan di user space, oleh karena itu ia efisien
tetapi ia mempunyai kelemahan yang sama dengan user thread.
Selain itu karena hanya satu thread yang dapat mengakses thread
pada suatu waktu maka multiple thread tidak dapat berjalan secara
pararel pada multiprocessor. User-level thread yang diimplementasi
pada sistem operasi yang tidak mendukung kernel thread menggunakan
Many-to-One model.
Gambar Many-to-One model
2.One-to-One Model
One-to-One model memetakan setiap user thread ke kernel thread.
Ia menyediakan lebih banyak concurrency dibandingkan Many-to-One
model. Keuntungannya sama dengan keuntungan kernel thread.
Kelemahannya model ini adalah setiap pembuatan user thread
membutuhkan pembuatan kernel thread. Karena pembuatan thread
dapat menurunkan performa dari sebuah aplikasi maka implmentasi
dari model ini membatasi jumlah thread yang dibatasi oleh sistem.
Contoh sistem operasi yang mendukung One-to-One model adalah
Windows NT dan OS/2.
Gambar One-to-One model
3.Many-to-Many Model
Many-to-many model multiplexes banyak user-level thread ke
kernel thread yang jumlahnya lebih kecil atau sama banyaknya
dengan user-level thread. Jumlah kernel thread dapat spesifik
untuk sebagian aplikasi atau sebagian mesin. Many-to-One model
mengizinkan developer ntuk membuat user thread sebanyak yang
ia mau tetapi concurrency tidak dapat diperoleh karena hanya satu
thread yang dapat dijadual 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). Many-to-Many model tidak menderita
kelemahan dari 2 model di atas. Developer dapat membuat user
thread sebanyak yang diperlukan, dan kernel thread yang bersangkutan
dapat bejalan secara pararel pada multiprocessor. Dan juga ketika suatu
thread menjalankan blocking system call maka kernel dapat menjadualkan
thread lain untuk melakukan eksekusi. Contoh sistem operasi yang
mendukung model ini adalah Solaris, IRIX, dan Digital UNIX.
Gambar Many-to-many
Fork dan Exec System Call:
Ada dua kemungkinan dalam system UNIX jika fork dipanggil oleh
salah satu thread dalam proses:
1.Semua thread diduplikasi.
2.Hanya thread yang memanggil fork.
Kalau thread memanggil exec System Call maka program yang
dispesifikasi di parameter exec akan mengganti keseluruhan proses
termasuk thread dan LWP.
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 di 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.
Cancellation:
Thread cancellation adalah tugas untuk memberhentikan thread
sebelum ia menyelesaikan tugasnya. Sebagi contohnya jika dalam
program java kita hendak mematikan Java Virtual Machine (JVM)
maka sebelum JVM-nya dimatikan maka seluruh thread yang berjalan
dihentikan terlebuh dahulu. Thread yang akan diberhentikan biasa
disebut target thread.
Pemberhentian target thread dapat terjadi melalui dua cara yg berbeda:
1.Asynchronous cancellation: suatu thread seketika itu juga
memberhentikan target thread.
2.Defered cancellation: target thread secara perodik memeriksa apakah
dia harus berhenti, cara ini memperbolehkan target thread untuk
memberhentikan dirinya sendiri secara terurut.
Hal yang sulit dari pemberhentian thread ini adalah ketika terjadi situasi
dimana sumber daya sudah dialokasikan untuk thread yang akan
diberhentikan. Selain itu kesulitan lain adalah ketika thread yang
diberhentikan sedang meng-update data yang ia bagi dengan thread lain.
Hal ini akan menjadi masalah yang sulit apabila digunakan asynchronous
cancellation. Sistem operasi akan mengambil kembali sumber daya dari
thread yang diberhentikan tetapi seringkali sistem operasi tidak mengambil
kembali semua sumber daya dari thread yang diberhentikan.
Alternatifnya adalah dengan menggunakan deffered cancellation.
Cara kerja dari deffered cancellation adalah dengan menggunakan
satu thread yang berfungsi sebagai pengindikasi bahwa target thread
hendak diberhentikan. Tetapi pemberhentian hanya akan terjadi jika
target thread memeriksa apakah ia harus berhenti atau tidak.
Hal ini memperbolehkan thread untuk memeriksa apakah ia harus
berhenti pada waktu dimana ia dapat diberhentikan secara aman yang
aman. Pthread merujuk tersebut sebagai cancellation points.
Pada umumnya sistem operasi memperbolehkan proses atau thread
untuk diberhentikan secara asynchronous. Tetapi Pthread API
menyediakan deferred cancellation. Hal ini berarti sistem operasi yang mengimplementasikan Pthread API akan mengizinkan deferred cancellation.
Penanganan Sinyal:
Sebuah sinyal digunakan di sistem UNIX untuk notify sebuah proses
kalau suatu peristiwa telah terjadi. Sebuah sinyal dapat diterima secara
synchronous atau asynchronous tergantung dari sumber dan alasan
kenapa peristiwa itu memberi sinyal.
Semua sinyal (asynchronous dan synchronous) mengikuti pola yg sama:
1.Sebuah sinyal dimunculkan oleh kejadian dari suatu persitiwa.
2.Sinyal yang dimunculkan tersebut dikirim ke proses.
3.Sesudah dikirim, sinyal tersebut harus
ditangani.
Contoh dari
sinyal synchronous adalah ketika
suatu proses melakukan
pengaksesan memori secarai 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 (ALT-F4) maka
sinyal
asynchronous dikirim ke proses
tersebut. Jadi ketika suatu sinyal
dimunculkan olehperistiwa di luar proses
yang sedang berjalan maka
proses tersebut menerima sinyal tersebut secara asynchronous.
Setiap sinyal dapat ditangani
oleh salah satu dari dua penerima sinyal:
1.Penerima sinyal yang merupakan set awal dari sistem operasi.
2.Penerima sinyal yang didefinisikan sendiri ole 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 yang multithreading,
karena sebuah proses dapat memiliki beberapa thread.
Secara
umum ada empat pilihan kemana sinyal harus dikirim:
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.
Cara 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 tersebut. 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). Fasilitas APC memperbolehkan
user thread untuk
memanggil fungsi tertentu ketika user thread
menerima
notifikasi peristiwa tertentu.
Thread Pools:
Pada web
server yang multithreading ada
dua masalah yang timbul:
1.Ukuran waktu yang diperlukan untuk menciptakan thread
untuk
melayani permintaan yang diajukan
terlebih pada kenyataannya thread
dibuang ketika
ia seketika sesudah
ia menyelesaikan tugasnya.
2.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 mereka duduk diam dan
menunggu untuk bekerja. Jadi ketika server
menerima permintaan
maka ia akan membangunkan thread dari pool dan jika
thread tersedia
maka permintaan
tersebut akan dilayani. Ketika thread sudah
selesai
mengerjakan tugasnya maka ia 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 thread
pool:
1.Biasanya lebih cepat untuk melayani
permintaan dengan thread
yang
ada dibanding dengan menunggu thread baru dibuat.
2.Thread pool membatasi
jumlah thread yang ada pada suatu waktu.
Hal ini pentingpada sistem yang tidak
dapat mendukung banyak thread
yang
berjalan secara concurrent.
Jumlah thread dalam pool dapat tergantung dari jumlah CPU
dalam sistem, jumlah memori fisik, & jumlah permintaan klien yg concurrent.
Thread Specific Data:
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.
Pthreads:
Pthreads
merujuk kepada POSIX standard (IEEE 1003.1 c)
mendefinisikan sebuah API untuk
pembuatan thread dan sinkronisasi.
Pthreads adalah spesifikasi untuk thread dan bukan merupakan suatu
implementasi. Desainer sistem operasi boleh mengimplementasikan
spesifikasi tersebut dalam berbagai cara yang mereka
inginkan.
Secara umum Libraries yang mengimplementasikan Pthreads
dilarang pada
sistem berbasis UNIX seperti Solaris 2. Sistem operasi
Windows secara umum
belum mendukung Pthreads, walaupun versi
shareware-nya
sudah ada di domain publik.
Rangkuman:
>>Thread adalah sebuah alur kontrol dari
sebuah proses.
Suatu proses yang multithreaded mengandung beberapa perbedaan
alur kontrol dengan ruang alamat yang sama.
>>Keuntungan dari multithreaded
meliputi peningkatan respon dari
pengguna, pembagian sumber daya proses, ekonomis,
dan kemampuan
untuk mengambil keuntungan dari arsitektur multiprosesor.
>>Thread tingkat pengguna adalah thread
yang tampak oleh programer
dan tidak diketahui oleh kernel.
>>Thread tingkat pengguna secara tipikal
dikelola oleh sebuah
library thread di
ruang pengguna.
>>Thread tingkat kernel didukung dan dikelola oleh kernel sistem operasi.
Secara umum, thread tingkat pengguna lebih cepat
dalam pembuatan
dan pengelolaan dari pada kernel
thread.
>>Ada 3 perbedaan tipe dari model yang berhubungan dengan pengguna
dan kernel thread yaitu one-to one
model, many-to-one model,
many-to-many model.
1.Model many to one: memetakan beberapa pengguna level thread
hanya ke satu buah kernel thread.
2.Model one to one: memetakan setiap thread
pengguna ke dalam
satu kernel thread berakhir.
3.Model many to many: mengijinkan pengembang untuk membuat
thread pengguna sebanyak mungkin, konkurensi tidak dapat tercapai
karena hanya satu thread yang dapat dijadualkan oleh kernel dalam
satu waktu.
Thread
cancellation adalah
tugas untuk memberhentikan thread
sebelum
ia menyelesaikan tugasnya.
Thread yang akan diberhentikan
disebut target thread.
Pemberhentian target thread dapat terjadi melalui 2 cara yang
berbeda:
1.Asynchronous cancellation: suatu thread seketika itu juga
memberhentikan target thread.
2.Deffered cancellation: target
thread secara periodik memeriksa
apakah dia harus berhenti, cara ini
memperbolehkan target thread
untuk memberhentikan dirinya sendiri secara terurut.
Thread Pools adalah
cara kerja dengan membuat beberapa thread
pada proses startup dan menempatkan mereka ke pools.
Keuntungan Thread
Pools:
1.Biasanya lebih cepat untuk melayani
permintaan dengan thread
yang
ada dibanding dengan menunggu thread baru dibuat.
2.Thread pool membatasi jumlah
thread yang ada pada suatu waktu.
Hal ini penting pada sistem yang tidak dapat mendukung banyak
thread yang berjalan secara concurrent.
Sumber: Diolah dari berbagai sumber
>>>>>TERIMAKASIH<<<<<