Multi Thread dapat di download (versi odt)
MultiThread
Konsep
Thread
1.1.
Pendahuluan
Pada
bab sebelumnya kita telah mempelajari tentang proses, namun seiring berjalannya
waktu dan tuntutan teknologi ternyata ditemukan kelemahan yang sebenarnya bisa
diminimalisir pada proses. Untuk itulah diciptakan thread yang merupakan
cara dari komputer untuk menjalankan dua atau lebih task dalam waktu
bersamaan, sedangkan multithreading adalah cara computer untuk
membagi-bagi pekerjaan yang dikerjakan sebagian-sebagian dengan cepat sehingga menimbulkan
efek seperti menjalankan beberapa task secara bersamaan walaupun otaknya
hanya satu. Di sini kita akan belajar mengapa harus ada thread,
perbedaan thread dengan proses, keuntungan dan kerugian pengimplementasian
thread, model-model multithreading, pengimplementasian pustaka thread,
pembatalan thread, thread pools, penjadwalan thread dan thread
di Linux.
1.2.
Keuntungan dan Kerugian MultiThreading
Multiprocessing
merupakan
penggunaan dua atau lebih CPU dalam sebuah sistem komputer.
Multitasking
merupakan
metode untuk menjalankan lebih dari satu proses dimana terjadi
pembagian
sumberdaya seperti CPU. Multithreading adalah cara pengeksekusian yang
mengizinkan
beberapa thread terjadi dalam sebuah proses, saling berbagi sumber daya
tetapi
dapat
dijalankan secara independen.
Keuntungan
dari sistem yang menerapkan multithreading dapat kita kategorikan
menjadi 4
bagian:
a.
Responsif. Aplikasi interaktif menjadi tetap responsif meskipun sebagian
dari program sedang diblok atau melakukan operasi lain yang panjang. Umpamanya,
sebuah thread dari web browser dapat melayani permintaan pengguna
sementara thread yang lain berusaha menampilkan gambar.
b.
Berbagi sumber daya. Beberapa thread yang melakukan proses yang sama
akan berbagi
sumber
daya. Keuntungannya adalah mengizinkan sebuah aplikasi untuk mempunyai beberapa
thread yang berbeda dalam lokasi memori yang sama.
c.
Ekonomis. Pembuatan sebuah proses memerlukan pengalokasian memori dan
sumber daya. Alternatifnya adalah dengan menggunakan thread, karena thread
membagi memori dan sumber daya yang dimilikinya sehingga lebih ekonomis
untuk membuat thread dan context switching thread. Akan
susah mengukur perbedaan waktu antara thread dan switch, tetapi
secara umum pembuatan dan pengaturan proses akan memakan waktu lebih lama
dibandingkan dengan thread. Pada Solaris, pembuatan proses memakan waktu
30 kali lebih lama dibandingkan pembuatan thread sedangkan proses context
switch 5 kali lebih lama dibandingkan context switching thread.
d.
Utilisasi arsitektur multiprosesor. Keuntungan dari multithreading dapat
sangat meningkat pada arsitektur multiprosesor, dimana setiap thread dapat
berjalan secara paralel di atas procesor yang berbeda. Pada arsitektur
processor tunggal, CPU menjalankan setiap thread secara bergantian
tetapi hal ini berlangsung sangat cepat sehingga menciptakan ilusi paralel, tetapi
pada kenyataannya hanya satu thread yang dijalankan CPU pada satu-satuan
waktu.
Adapun
kerugian dari multithreading adalah :
1.
Jika digunakan secara berlebihan, multithreading akan berdampak pada
pemborosan resource dan CPU yang dialokasikan untuk switching threads.
Misalnya jika heavy disk I/O terlibat, akan lebih cepat jika hanya
memiliki 1 atau 2 thread yang melaksanakan tugas secara berurutan,
daripada menggunakan multithread yang masing-masing mengeksekusi sebuah task
pada waktu yang sama.
2.
Sistem yang memiliki kecepatan prosesor dan memory yang cenderung sama,
sehingga tidak ada efisiensi yang hilang (mengacu kepada latency), tidak
akan memperoleh peningkatan bandwidth yang signifikan jika menggunakan multithreading.
3.
Multithreading menghasilkan program yang lebih kompleks. Menggunakan multiple
thread sendiri tidak akan menciptakan kerumitan, tapi interaksi antar thread-lah
yang mengakibatkan kompleksitas tersebut.
4.
Thread yang banyak bisa saling berinterferensi ketika saling berbagi
sumber daya hardware seperti cache.
1.3.
Model MultiThreading
Beberapa
terminologi yang akan dibahas:
a.
Thread pengguna: Thread yang pengaturannya dilakukan oleh
pustaka thread pada tingkatan pengguna. Karena pustaka yang menyediakan
fasilitas untuk pembuatan dan penjadwalan thread, thread pengguna
cepat dibuat dan dikendalikan.
b.
Thread Kernel: . Thread yang didukung langsung oleh kernel.
Pembuatan, penjadwalan dan manajemen thread dilakukan oleh kernel pada kernel
space. Karena dilakukan oleh system operasi, proses pembuatannya akan lebih
lambat jika dibandingkan dengan thread pengguna.
Model-Model
MultiThreading:
a.
Model Many-to-One. Model ini 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 multiprosesor. Kekurangannya
adalah ketika ada satu blocking systemc call, semua akan menjadi terblok juga.
Contoh: Solaris Green Threads dan GNU Portable Threads.
b.
Model One-to-One. Model ini memetakan setiap thread tingkatan
pengguna ke setiap thread.
Ia
menyediakan lebih banyak concurrency dibandingkan model Many-to-One.
Keuntungannya sama dengan keuntungan thread kernel. Kelemahan 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. Contoh: Windows NT/XP/2000 , Linux, Solaris 9, OS/2.
c.
Model Many-to-Many. Model ini memultipleks banyak thread tingkatan
pengguna ke thread kernel yang jumlahnya sedikit atau sama dengan
tingkatan pengguna. Model ini mengizinkan developer membuat thread sebanyak
yang ia mau tetapi concurrency tidak dapat diperoleh 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 multiprosessor dan lebih efisien. Contoh : Solaris 2, IRIX, HPUX.
1.4.
Pustaka Thread
Pustaka
Thread atau yang lebih familiar dikenal dengan Thread Library bertugas
untuk
menyediakan
API untuk programmer dalam menciptakan dan memanage thread. Ada
dua cara dalam mengimplementasikan pustaka thread:
a.
Menyediakan API dalam level pengguna tanpa dukungan dari kernel sehingga
pemanggilan fungsi tidak melalui system call. Jadi, jika kita memanggil
fungsi yang sudah ada di pustaka, maka akan menghasilkan pemanggilan fungsi call
yang sifatnya lokal dan bukan system call.
b.
Menyediakan API di level kernel yang didukung secara langsung oleh sistem
operasi. Pemanggilan fungsi call akan melibatkan system call ke
kernel.
Ada
tiga pustaka thread yang sering digunakan saat ini, yaitu: POSIX
Pthreads, Java, dan Win32. Implementasi POSIX standard dapat dengan cara user
level dan kernel level, sedangkan Win32 adalah kernel level. Java API thread
dapat diimplementasikan oleh Pthreads atau Win32.
1.5.
Pembatalan Thread
Thread
Cancellation ialah
pembatalan thread sebelum tugasnya selesai. Misalnya hendak
mematikan
Java Virtual Machine (JVM) pada program Java. Maka sebelum JVM dimatikan
seluruh
thread yang berjalan harus dibatalkan terlebih dahulu. Contoh lain
adalah pada masalah search. Apabila sebuah thread mencari sesuatu
dalam database dan menemukan serta mengembalikan hasilnya, thread sisanya
akan dibatalkan. Thread yang akan diberhentikan biasa disebut target
thread.
Pemberhentian
target Thread dapat dilakukan dengan 2 cara:
a.
Asynchronous cancellation. Suatu thread seketika itu juga
membatalkan target thread.
b.
Deferred cancellation. Suatu thread secara periodik
memeriksa apakah ia harus batal, cara
ini
memperbolehkan target thread untuk membatalkan dirinya secara terurut.
Hal
yang sulit dari pembatalan thread ini 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 digunakan asynchronous cancellation.
Sistem operasi akan mengambil kembali sumber daya dari thread yang
dibatalkan tetapi seringkali sistem operasi tidak mengambil kembali semua
sumber daya dari thread yang dibatalkan.
Alternatifnya
adalah dengan menggunakan deffered cancellation. Cara kerja dari deffered
cancellation
adalah
dengan menggunakan satu thread yang berfungsi sebagai pengindikasi
bahwa
target thread hendak dibatalkan. Tetapi pembatalan hanya akan terjadi
jika target thread memeriksa apakah ia harus batal atau tidak. Hal ini
memperbolehkan thread untuk memeriksa apakah ia harus batal pada waktu
dimana ia dapat dibatalkan secara aman yang aman. Pthread merujuk sebagai cancellation
points. Pada umumnya sistem operasi memperbolehkan proses atau thread untuk
dibatalkan secara asynchronous. Tetapi Pthread API menyediakan deferred
cancellation. Hal ini berarti system operasi yang mengimplementasikan
Pthread API akan mengizinkan deferred cancellation.
1.6.
Thread Pools
Pada
web server yang menerapkan multithreading ada dua masalah yang
timbul:
a. Ukuran waktu yang diperlukan untuk
menciptakan thread yang melayani permintaan yang
diajukan pada kenyataannya thread dibuang
seketika sesudah ia menyelesaikan tugasnya.
b. Pembuatan thread yang tidak terbatas
jumlahnya dapat menurunkan performa dari sistem.
Solusinya
adalah dengan penggunaan Thread Pools, yaitu sekumpulan thread yang
mengantri untuk mengerjakan tugas 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, 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 ada thread yang tersedia pada saat dibutuhkan maka server
menunggu sampai ada satu thread yang bebas.
Keuntungan
thread pool adalah:
a.
Biasanya lebih cepat untuk melayani permintaan dengan thread yang ada
dibandingkan menunggu thread baru dibuat.
b.
Thread pool membatasi jumlah thread yang ada pada suatu waktu.
Hal ini penting pada system yang tidak dapat mendukung banyak thread yang
berjalan secara concurrent. Jumlah thread dalam pool dapat
tergantung dari jumlah CPU dalam sistem, jumlah memori fisik, dan jumlah permintaan
klien yang concurrent.
c.
Pembuatan jumlah thread yang tepat dapat meningkatkan performa serta
sistem yang lebih stabil
1.7.
Penjadwalan Thread
Begitu
dibuat, thread baru dapat dijalankan dengan berbagai macam penjadwalan.
Kebijakan
penjadwalanlah
yang menentukan setiap proses, di mana proses tersebut akan ditaruh dalam
daftar
proses sesuai proritasnya dan bagaimana ia bergerak dalam daftar proses
tersebut.
Untuk
menjadwalkan thread, sistem dengan model multithreading many to many atau
many to
one
menggunakan:
a. Process Contention Scope (PCS).
Pustaka thread menjadwalkan thread pengguna untuk
berjalan pada LWP (lightweight process)
yang tersedia.
b. System Contention Scope (SCS).
SCS berfungsi untuk memilih satu dari banyak thread,
kemudian menjadwalkannya ke satu thread tertentu (CPU / Kernel).
11.8. Thread Linux
Ketika pertama kali dikembangkan, Linux
tidak didukung dengan threading di dalam kernelnya, tetapi dia mendukung
proses-proses sebagai entitas yang dapat dijadwalkan melalui clone() system
calls. Sekarang Linux mendukung penduplikasian proses menggunakan system call clone()
dan fork(). Clone() mempunyai sifat mirip dengan fork(), kecuali dalam hal
pembuatan salinan dari proses yang dipanggil dimana ia membuat sebuah proses
yang terpisah yang berbagi address space dengan proses yang dipanggil.
Pembagian address space dari parent process memungkinkan cloned task bersifat
mirip dengan thread yang terpisah. Pembagian address space ini dimungkinkan
karena proses direpresentasikan di dalam Kernel Linux. Di dalam Kernel Linux
setiap proses direpresentasikan sebagai sebuah struktur data yang unik.
Jadi, daripada menciptakan yang baru
maka struktur data yang baru mengandung pointer yang menunjuk ke tempat dimana
data berada. Jadi ketika fork() dipanggil, proses yang baru akan tercipta
beserta duplikasi dari segala isi di struktur data di parent process, namun
ketika clone() dipanggil, ia tidak menduplikasi parent process-nya tetapi menciptakan
pointer ke struktur data pada parent process yang memungkinkan child process
untuk berbagi memori dan sumber daya dari parent process-nya. Project Linux
Thread menggunakan system call ini untuk mensimulasi thread di user space.
Sayangnya, pendekatan ini mempunyai beberapa kekurangan, khususnya di area
signal handling, scheduling, dan interprocess synchronization primitive.
Untuk meningkatkan kemampuan Thread
Linux, dukungan kernel dan penulisan ulang pustaka thread sangat diperlukan.
Dua project yang saling bersaing menjawab tantangan ini. Sebuah tim yang
terdiri dari pengembang dari IBM membuat NGPT (Next Generation POSIX Threads). Sementara
pengembang dari Red Hat membuat NPTL (Native POSIX Thread Library). Sebenarnya
Linux tidak membedakan antara proses dan thread. Dalam kenyataannya, Linux lebih
menggunakan istilah task dibandingkan proses dan thread ketika merujuk kepada pengaturan
alur pengontrolan di dalam program.
Pada sistem operasi lain seperti Mac OS
X, terdapat lima thread API yang berbeda, yaitu: Mach thread, POSIX thread
(pthreads), Cocoa thread (NSThreads), Carbon MP tasks, dan Carbon
Thread Manager. Akan tetapi tidak mudah
untuk menentukan suatu thread mengerjakan tugas yang mana, sehingga dibuatlah
suatu siklus yang membuat masing-masing thread bekerja secara bergantian.
1.9. Rangkuman
Thread adalah alur kontrol dari suatu
proses.
Keuntungan menggunakan Multithreading:
a.
Meningkatkan respon dari pengguna.
b.
Pembagian sumber daya.
c.
Ekonomis.
d.
Mengambil keuntungan dari arsitektur multiprosessor.
Tiga model Multithreading:
a.
Model Many-to-One.
b.
Model One-to-One.
c.
Model Many-to-Many.
Pustaka Thread bertugas untuk
menyediakan API untuk programmer dalam menciptakan dan
memanage thread. Cara untuk
mengimplementasikannya yaitu:
a.
Menyediakan API dalam level pengguna tanpa dukungan dari kernel.
b.
Menyediakan API di level kernel yang didukung secara langsung oleh system operasi.
Pembatalan Thread: Tugas untuk
membatalkan Thread sebelum menyelesaikan tugasnya.
Pembatalan Thread terdiri dari 2 jenis:
1.
Asynchronous cancellation.
2.
Deffered cancellation.
Thread Pools menciptakan sejumlah Thread
yang ditempatkan di dalam pool dimana Thread
menunggu untuk dipanggil.
Thread Schedulling ada 2 macam:
1.
Local Schedulling.
2.
Global Schedulling.
Istilah thread di Linux adalah task.
Pembuatan Thread di Linux menggunakan
system call clone(). Sedangkan di Mac sekumpulan
thread yang ada akan mengerjakan tugas
bergantian dengan menggunakan siklus.
Evan Christian O
Sistem Informasi / kelas C (04212084)

