Thread adalah unit dasar dari penggunaan CPU, thread mengandung 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. 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
Banyak software yang berjalan pada PC modern didesain 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.
Kadang kala ada situasi dimana sebuah aplikasi diperlukan untuk menjalankan beberapa tugas yang serupa. Sebagai contohnya sebuah web server bisa mempunyai ratusan klien yang mengaksesnya secara concurrent . Kalau web server berjalan sebagai proses yang hanya mempunyai thread tunggal maka ia hanya bisa 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 multithreading . 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 dikeahui 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 ( bisa 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 selamabeberap 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 multithrading dapat dipisah menjadi empat kategori :
1.Responsi : Membuat aplikasi yang interaktif menjadi multithreading dapat membuat sebuah program terus berjalan meskipun 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 mengijinkan 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 bisa 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 Thread
User thread didukung diatas kernel dan diimplementasi oleh thread library pada user level. Library meneyediakan fasilitas untuk pembuatan thread, penjadwalan thread, dan manajemen thread tanpa dukungan dari kernel. Karena kernel tidak menyadari user-level thread maka semua pembuatan dan penjadwalan 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 bisa 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, penjadwalan, dan manajeman 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 bisa menjadwalkan thread lain di aplikasi untuk melakukan eksekusi. Keuntungan lainnya adalah pada lingkungan multiprocessor , kernel bisa menjadwal thread-thread pada processor yang berbeda. Contoh sistem operasi yang mendukung kernel thread adalah Windows NT, Solaris, Digital UNIX.
Multithreading Models
1.Many-to-One Model
Many-to-One model memetakan banyak user-level thread ke saru 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 bisa mengakses thread pada suatu waktu maka multiple thread tidak bisa berjalan secara pararel pada multiprocessor . User-level thread yang diimplementasi pada sistem operasi yang tidak mendukung kernel thread menggunakan 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 bisa 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.
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 bisa spesifik untuk sebagian aplikasi atau sebagian mesin. Many-to-One model mengijinkan developer ntuk membuat user thread sebanyak yang ia mau tetapi concurrency tidak dapat diperoleh karena hanya satu thread yang bisa 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 bisa membuat thread dalam jumlah yang terbatas ). Many-to-Many model tidak menderita kelemahan dari 2 model di atas. Developer bisa membuat user thread sebanyak yang diperlukan, dan kernel thread yang bersangkutan bisa bejalan secara pararel 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.
Thread Libraries
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.
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.
Win32 Threads
Teknik menciptakan thread menggunakan Win32 sama dengan teknik pthreads.
Threads yang diciptakan didalam Win32 API menggunakan fungsi CreateThread0 dan hanya seperti di set Pthreads-a dari atribut-atribut diberikan kepada fungsi. Atribut-atribut ini termasuk kedalam informasi keamanan, ukuran stack, dan bendera dimana dapat di set untuk menandai jika thread dikarantina.
Java Threads
Sistem operasi mendukung thread pada tingkat kernel atau tingkat user . Java merupakan salah satu dari sejumlah kecil bahasa pemrograman yang mendukung thread di tingkat bahasa untuk pembuatan dan manajemen thread. Karena thread dalam Java diatur oleh Java Virtual Machine (JVM), tidak dengan user-level library ataupun kernel, sulit mengelompokkan thread di Java apakah di tingkat user atau kernel.
Setiap program dalam Java memiliki sedikitnya sebuah thread yaitu main yang merupakan single-thread tersendiri di JVM. Java juga menyediakan perintah untuk membuat dan modifikasi thread tambahan sesuai kebutuhan di dalam program.
Keunggulan Java Threads adalah:
JVM menggunakan prioritas preemptive berdasarkan algoritma penjadwalan
Semua threads di Java mempunyai prioritas. Prioritas tertinggi dijadualkan untuk dieksekusi oleh JVM
Jika ada 2 thread yang prioritasnya sama, digunakan algoritma First In First Out (FIFO)
The JVM and Host Operating System
Implementasi umum dari JVM adalah di atas sebuah host operating system. Hal ini memungkinkan JVM untuk menyembunyikan implementasi detail dari sistem operasi tempat JVM dijalankan dan menyediakan lingkungan abstrak dan konsisten yang memungkinkan program-program Java untuk beroperasi di atas platform apa pun yang mendukung JVM. Spesifikasi untuk JVM tidak mengindikasikan bagaimana thread-thread Java dipetakan ke sistem operasi tempat JVM dijalankan, melainkan menyerahkan keputusan tersebut kepada implementasi tertentu dari JVM. Windows 95/98/NT/2000 menggunakan model One-to-One, sehingga setiap thread Java untuk JVM pada sistem operasi tersebut dipetakan kepada sebuah kernel thread. Solaris 2 awalnya mengimplementasikan JVM menggunakan model Many-to-One (disebut Green Threads). Akan tetapi, sejak JVM versi 1.1 dengan Solaris 2.6, mulai diimplementasikan menggunakan model Many-to-Many.
Threading Issues
The fork() and exec() System Calls
•Bila sebuah thread di program memanggil fork() maka ada dua skenario yang bisa terjadi :
– Semua thread akan diduplikasi.
– Hanya thread yang memanggil fork() yang akan didupliakasi.
•Jika exec() dipanggil langsung setelah fork(), maka duplikasi seluruh thread tidak dibutuhkan krn exec sdh mengganti seluruh proses
•Jika exec() tidak dipanggil, maka duplikasi thread harus dilakukan
Thread cancellation adalah sebuah tugas untuk memberhentikan thread sebelum thread tersebut selesai.
– Contoh: JVM akan mematikan seluruh thread sblm mati
Thread yang akan diberhentikan disebut target thread.
Dua skenario thread cancellationn :
•Asynchronous cancellation : satu thread memberhentikan target thread seketika itu juga.
•Deferred cancellation : target thread secara periodik dapat mengecek apakah ia harus berhenti, skenario ini memberi kesempatan kepada target thread untuk memberhentikan dirinya sendiri.
Signal Handling
Sebuah sinyal digunakan di sistem UNIX untuk notify sebuah proses kalau suatu peristiwa telah terjadi. Sebuah sinyal bisa diterima secara synchronous atau asynchronous tergantung dari sumber dan alasan kenapa peristiwa itu memberi sinyal.
Semua sinyal( asynchronous dan synchronous ) mengikuti pola yang sama :
•Sebuah sinyal dimunculkan oleh kejadian dari suatu persitiwa.
•Sinyal yang dimunculkan tersebut dikirim ke proses.
•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 oleh peristiwa diluar proses yang sedang berjalan maka proses tersebut menerima sinyal tersebut secara asynchronous .
Setiap sinyal bisa ditangani oleh salah satu dari 2 penerima sinyal :
•Penerima sinyal yang merupakan set awal dari sistem operasi.
•Penerima sinyal yang didefinisikan sendiri ole user.
Penanganan sinyal pada program yang hanya memakai thread tunggal cukup mudah yaitu hanya dengan mengrimkan sinyal ke prosesnya. Tetapi mengirimkan sinyal lebih rumit pada program yang multithreading , karena sebuah proses bisa memiliki beberapa thread.
Secara umum ada 4 pilihan kemana sinyal harus dikirim :
•Mengirimkan sinyal ke thread yang dituju oleh sinyal tersebut.
•Mengirimkan sinyal ke setiap thread pada proses tersebut.
•Mengirimkan sinyal ke thread tertentu dalam proses.
•Menugaskan thread khusus untuk menerima semua sinyal yang ditujukan pada proses.
Cara untuk mengirimkan sebuah sinyal tergantung dari tipe 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 mengijinkan 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 2 masalah yang timbul :
•Ukuran waktu yang diperlukan untuk menciptakan thread untuk melayani permintaan yang diajukan terlebih pada kenyataannya thread dibuang ketika ia seketika sesudah ia menyelesaikan tugasnya.
•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 maka ia akan membangunkan thread dari pool dan jika threadnya 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 1 thread yang bebas.
Keuntungan thread pool :
•Biasanya lebih cepat untuk melayani permintaan dengan thread yang ada dibanding dengan menunggu thread baru dibuat.
•Thread pool membatasi jumlah thread yang ada pada suatu waktu. Hal ini pentingpada sistem yang tidak bisa mendukung banyak thread yang berjalan secara concurrent .
Jumlah thread dalam pool bisa tergantung dari jumlah CPU dalam sistem, jumlah memori fisik, dan jumlah permintaan klien yang 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.
Scheduler Activations
Satu rencana untuk komunikasi antara user dengan thread library dikenal sebagai Scheduler Activations( pengaktifan jadwal).
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).
Operating-System Examples
Windows XP Threads
Windows XP menerapkan Win 32 API yaitu primer API antarmuka untuk sistem operasi microsoft (Windows 95, 98, NT, 2000 dan XP). Suatu aplikasi Windows XP dijalankan sebagai suatu proses yang terpisah, danmasing-masing proses boleh berisi satu atau lebih thread. Windows XP menggunakan model pemetaan one-to-one yang menggambarkan tingkatan pengguna kepada satu kernel yang dihubungkan oleh thread, setiap thread dapat melakukan proses untuk mengakses alamat dan ruang.
Komponen-komponen yang umum pada suatu thread meliputi :
a.Suatu thread ID yang unik untuk mengidentifikasi thread.
b.Sebuah register merepesentasikan status dari prosessor.
c.Seorang pengguna stack, bekerja ketika thread sedang berjalan didalam mode pengguna.
d.Suatu kawasan stack yang digunakan oleh run-time library dan dinamic link.
Set register, stacks, dan private storage dikenal dengan konteks dari thread. Struktur dari data primer dari suatu thread meliputi :
• ETHREAD—executive thread block
• KTHREAD—kernel thread block
• TEB—thread environment block
Linux Threads
Thread dalam Linux dianggap sebagai task , seperti halnya proses. Linux tidak mendukung multithreading, struktur data yang terpisah, atau pun kernel routines .
Linux menyediakan dua macam system call , yaitu fork dan clone. fork memiliki fungsi asli untuk menduplikasi proses. clone memiliki sifat yang mirip dengan fork yaitu sama-sama membuat duplikat dari proses pemanggilnya. Namun demikian, selain membuat proses baru yang terpisah dari proses pemanggilnya, clone juga mengizinkan terjadinya pembagian ruang alamat (address space) antara proses anak (child process) dengan proses pemanggilnya (parent process) .
Setiap proses memiliki struktur data yang unik. Namun demikian, setiap proses di Linux hanya menyimpan pointer-pointer ke struk tur data lainnya dimana instruksi disimpan, daripada harus menyimpan instruksi ke setiap struktur data yang ada. Ketika fork dieksekusi, sebuah proses baru dibuat bersamaan dengan menyalin struktur data dari parent process . Ketika clone dieksekusi, sebuah proses baru dibuat, namun proses tersebut tidak menyalin struktur data dari parent process -nya. Proses baru tersebut hanya menyimpan pointer ke struktur data proses pemanggilnya itu. Oleh karena itu, child process dapat berbagi ruang alamat dan sumber daya dengan parent process -nya. Satu set flag digunakan untuk mengindikasikan seberapa banyak kedua proses tersebut dapat berbagi. Jika tidak ada flag yang ditandai, maka tidak ada sharing dan clone berlaku sebagai fork. Jika kelima flag ditandai, maka child process harus berbagi semuanya dengan parent process .
Selasa, 07 April 2009
Langganan:
Komentar (Atom)

