Cari Blog Ini

Selasa, 26 April 2011

THREAD


Thread
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 di miliki oleh proses yang sama. Thread juga sering disebut light weight 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 perangkat lunak yang berjal an 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.



  Gambar: Status proses

Gambar : Thread

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 mencipt akan thread lain yang akan melayani permintaan tersebut.
Java mempunyai pengunaan lain dari thread. Perlu diketahui bahwa Java t idak 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 unt uk mencoba melakukan koneksi ke server.

Keuntungan Thread
Keuntungan dari program yang multi threading dapat dipisah menjadi empat kat egori :
1.      Responsi : Membuat aplikasi yang interaktif menjadi multithreading dapat membuat sebuah program t erus berjalan meskipun sebagian dari program tersebut diblok atau melakukan operasi yang panjang, karena itu dapat meningkat kan respons kepada pengguna. Sebagai contohnya dalam web browser yang multi threading, 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 t hread yang berbeda dal am lokasi memori yang sama.

3.      Ekonomi : dalam pembuatan sebuah proses banyak dibutuhkan pengalokasian memori dan sumber daya. Alternatifnya adalah dengan penggunaan thread, karena t hread 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 pengat uran proses lebih lama dibandingkan thread. Pada Solaris, pembuat an proses lebih lama 30 kali dibandingkan pembuat an thread, dan context swit ch proses 5 kali lebih lama dibandingkan context switch thread.

4.      Utilisasi arsit ektur multiprocessor : Keuntungan dari multithreading dapat sangat meningkat pada arsitektur multiprocessor, dimana setiap thread dapat berjalan secara pararel di atas processor yang berbeda. Pada arsit ekt ur processor t unggal, CPU menjalankan setiap thread secara bergantian tetapi hal ini berlangsung sangat cepat sehingga menciptakan ilusi pararel, tetapi pada kenyataannya hanya satu thread yang di jal ankan CPU pada satu - satuan wakt u ( satu - sa uan 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 t hread dilakukan di user space t anpa int ervensi 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 mengakibat kan seluruh proses diblok walaupun ada thread lain yang dapat jalan dalam aplikasi tersebut . Contoh user-thread libraries adalah POSIX Pthreads, M ach 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 t hread 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 Windows NT, Solaris, Digital UNIX.



Multithreading Model
a.    One to one Model
One-to-Onemodel 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 oper asi yang mendukung One-to-One model adal ah Windows NT dan OS/2.

Gambar : One to one

b.   M any to one Model
Many-to-One model memetakan banyak user-level thread kesatu 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 mult iprocessor . User-level thread yang diimplementasi pada sistem operasi yang tidak mendukung kernel thread enggunakan Many-to-One model.
Gambar: Many to one


c.    M any 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 spesifikasi untuk sebagian aplikasi atau sebagian mesin. Many-t o-One model mengizinkan developer untukmembuat user thread sebanyak yang ia mau tet api concurrency tidak dapat diperoleh karena hanya satu thread yang dapat dijadual oleh kernel pada suatu waktu. One-t o-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, IRI X, dan
Digital UNIX.

Gambar : Many t o many


Thread Cancellation dan Thread Pools
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 terlebih dahulu. Thread yang akan diberhent ikan biasa disebut target thread.
Pemberhentian target thread dapat terjadi melalui dua cara yang berbeda :
-          A synchronous cancellation : suatu thread seketika itu juga memberhentikan target thread.
-          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 ket ika thread yang diberhentikan sedang meng-update data yang ia bagi dengan thread lain. Hal ini akan menjadi masalah yang sulit apabila digunakan asynchronous cancellat ion. Sistem operasi akan mengambil kembali sumber daya dari thread yang di berhentikan tetapi seringkali sistem operasi tidak mengambil kembali semua sumber daya dari thread yang diberhentikan.
Alternatifnya adalah dengan menggunakan deferred cancellation. Cara kerja dari deferred cancellation adalah dengan menggunakan satu thread yang berfungsi sebagai pengindikasi bahwa target thread hendak diberhent ikan. Tetapi pemberhent ian 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 cancellat ion points.
Pada umumnya sistem operasi memperbolehkan proses atau thread untuk diberhentikan secara asynchronous. Tetapi Pthread API menyediakan deferred cancellat ion. Hal ini berarti sist em operasi yang mengimplementasikan Pthread API akan mengizinkan deferred cancellation.

Thread Pools
Pada web server yang multithreading ada dua 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 unt uk bekerja. Jadi ketika server menerima permintaan maka 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 dibut uhkan maka server menunggu sampai ada satu thread yang b eb as.



Keuntungan thread pool :
-Biasanya lebih cepat untuk melayani permintaan dengan thread yang ada dibanding dengan menunggu thread baru di buat.
-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 stick, dan jumlah permintaan klien yang concurrent.



Thread dengan Linux dan Thread dengan Java
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 copy 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 processnya tetapi menciptakan pointer ke struktur data pada parent process yang memungkinkan child process untuk berbagi memori dan sumber daya dari parent processnya. Project LinuxThread menggunakan system call ini untuk mensimulasi thread di user space. Sayangnya, pendekatan ini mempunyai beberapa kekurangan, khusunya 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.


Thread Java
Saat sebuah program Java dieksekusi, yaitu saat main() dijalankan, ada sebuah thread utama yang bekerja. Java adalah bahasa pemrograman yang mendukung adanya pembentukan thread tambahan selain thread utama tersebut. Thread dalam Java diatur oleh Java Virtual Machine(JVM) sehingga sulit untuk menentukan apakah thread Java berada di user-level atau kernel-level.



Status Thread

Suatu thread bisa berada pada salah satu dari status berikut:
  • New Thread yang berada di status ini adalah objek dari kelas Thread yang baru dibuat, yaitu saat instansiasi objek dengan statement new. Saat thread berada di status new, belum ada sumber daya yang dialokasikan, sehingga thread belum bisa menjalankan perintah apapun.
  • RunnableAgar thread bisa menjalankan tugasnya, method start() dari kelas Thread harus dipanggil. Ada dua hal yang terjadi saat pemanggilan method start(), yaitu alokasi memori untuk thread yang dibuat dan pemanggilan method run(). Saat method run() dipanggil, status thread berubah menjadi runnable, artinya thread tersebut sudah memenuhi syarat untuk dijalankan oleh JVM. Thread yang sedang berjalan juga berada di status runnable.
  • BlockedSebuah thread dikatakan berstatus blocked atau terhalang jika terjadi blocking statement, misalnya pemanggilan method sleep(). sleep() adalah suatu method yang menerima argumen bertipe integer dalam bentuk milisekon. Argumen tersebut menunjukkan seberapa lama thread akan "tidur". Selain sleep(), dulunya dikenal method suspend(), tetapi sudah disarankan untuk tidak digunakan lagi karena mengakibatkan terjadinya deadlock. Di samping blocking statement, adanya interupsi M/K juga dapat menyebabkan thread menjadi blocked. Thread akan menjadi runnable kembali jika interval method sleep()-nya sudah berakhir, atau pemanggilan method resume() jika untuk menghalangi thread tadi digunakan method suspend() atau M/K sudah tersedia lagi.
  • DeadSebuah thread berada di status dead bila telah keluar dari method run(). Hal ini bisa terjadi karena thread tersebut memang telah menyelesaikan pekerjaannya di method run(), maupun karena adanya pembatalan thread. Status jelas dari sebuah thread tidak dapat diketahui, tetapi method isAlive() mengembalikan nilai boolean untuk mengetahui apakah thread tersebut dead atau tidak.

JVM ( Java Virtual Machine )

Setiap program Java dijalankan oleh Java Virtual Machine(JVM). Artinya, program Java dapat dijalankan di platform manapun selama platform tersebut mendukung JVM. Umumnya JVM diimplementasikan di bagian atas suatu host operating system, hal ini memungkinkan JVM untuk menyembunyikan detail implementasi dari sistem operasi tersebut.
Pemetaan thread Java ke suatu sistem operasi tergantung pada implementasi JVM pada sistem operasi itu. Misalnya, Windows 2000 menggunakan model one-to-one, Solaris dulunya menggunakan model many-to-one, sedangkan Tru64 UNIX menggunakan model many-to-many.
Aplikasi Thread dalam Java
Dalam ilustrasi program yang ada pada subbab “Pembatalan Thread, kita tidak dapat mengetahui thread yang mana yang akan terlebih dahulu mengerjakan tugasnya. Hal ini terjadi karena ada dua thread yang berjalan secara paralel, yaitu thread utama dan thread t1. Artinya, keluaran dari program ini bisa bervariasi. Salah satu kemungkinan keluaran program ini adalah sebagai berikut:
     
Thread UTAMA
Ini CobaThread1
Ini CobaThread2
Thread UTAMA
Ini CobaThread2
Thread UTAMA
Ini CobaThread1
Ini CobaThread2
Thread UTAMA
Thread UTAMA
Ini CobaThread2
Ini CobaThread1
Thread UTAMA
Thread UTAMA
Ini CobaThread1
Thread UTAMA

Rangkuman

Setiap program Java memiliki paling sedikit satu thread. Bahasa pemrograman Java memungkinkan adanya pembuatan dan manajemen thread tambahan oleh JVM. Sebuah thread bisa berada di salah satu dari 4 status, yaitu new, runnable, blocked, dan dead. Ada dua cara untuk membuat thread dalam Java, yaitu dengan meng- extends kelas Thread dan dengan meng- implements interface Runnable.
Dalam beberapa kondisi, thread yang dibuat dapat digabungkan dengan parent thread-nya. Method join() berfungsi agar suatu thread menunggu thread yang dibuatnya menyelesaikan tugasnya terlebih dahulu, baru mulai mengeksekusi perintah selanjutnya.
Pembatalan thread secara asynchronous dilakukan dengan pemanggilan method stop(). Akan tetapi, cara ini terbukti tidak aman, sehingga untuk menterminasi thread digunakanlah deferred cancellation. Pembatalan dilakukan dengan pemanggilan method interrupt() untuk mengeset status interupsi, serta isInterrupted() atau interrupted() untuk memeriksa status interupsi tersebut.
Program Java dapat dijalankan di berbagai platform selama platform tersebut mendukung JVM. Pemetaan thread Java ke host operating system tergantung pada implementasi JVM di sistem operasi tersebut.

Tidak ada komentar:

Posting Komentar