Ilustrasi Thread dengan Linux dan Java
3.6. Ilustrasi Thread dengan Linux dan Java
Dewasa ini, banyak sistem operasi yang telah mendukung proses multithreading. Setiap sistem operasi memiliki konsep tersendiri dalam mengimplementasikannya ke dalam sistem.
3.6.1. Thread dengan Linux
Kernel Linux mulai menggunakan thread pada versi 2.2. Thread dalam Linux dianggap sebagai task, seperti halnya proses. Kebanyakan sistem operasi yang mengimplementasikan multithreading menjalankan sebuah thread terpisah dari proses. Linus Torvalds mendefinisikan bahwa sebuah thread adalah Context of Execution (COE), yang berarti bahwa hanya ada sebuah Process Control Block (PCB) dan sebuah penjadual yang diperlukan. Linux tidak mendukung multithreading, struktur data yang terpisah, atau pun rutin kernel.
Linux menyediakan dua macam system call, yaitu fork dan clone. fork memiliki fungsi untuk menduplikasi proses dimana proses anak yang dihasilkan bersifat independent. clone memiliki sifat yang mirip dengan fork yaitu sama-sama membuat duplikat dari proses induk. Namun demikian, selain membuat proses baru yang terpisah dari proses induk, clone juga mengizinkan terjadinya proses berbagi ruang alamat antara proses anak dengan proses induk, sehingga proses anak yang dihasilkan akan sama persis dengan proses induknya.
Setiap proses memiliki struktur data yang unik. Namun demikian, proses-proses di Linux hanya menyimpan pointer-pointer ke struktur data lainnya dimana instruksi disimpan, sehingga tidak harus menyimpan instruksi ke setiap struktur data yang ada. Hal ini menyebabkan context switch antar proses di Linux menjadi lebih cepat.
Ketika fork dieksekusi, sebuah proses baru dibuat bersamaan dengan proses penyalinan struktur data dari proses induk. Ketika clone dieksekusi, sebuah proses baru juga dibuat, namun proses tersebut tidak menyalin struktur data dari proses induknya. Proses baru tersebut hanya menyimpan pointer ke struktur data proses induk. Oleh karena itu, proses anak dapat berbagi ruang alamat dan sumber daya dengan proses induknya. Satu set flag digunakan untuk mengindikasikan seberapa banyak kedua proses tersebut dapat berbagi. Jika tidak ada flag yang ditandai, maka tidak ada sharing, sehingga clone berlaku sebagai fork. Jika kelima flag ditandai, maka proses induk harus berbagi semuanya dengan proses anak.
Tabel 3-1. Tabel Flag dan Fungsinya Flag
Keterangan
CLONE_VM
Berbagi data dan Stack
CLONE_FS Berbagi informasi sistem berkas CLONE_FILES
Berbagi berkas
CLONE_SIGHAND
Berbagi sinyal
CLONE_PID Berbagi PID dengan proses induk
3.6.2. Thread dengan Java
Sistem operasi mendukung thread pada tingkat kernel atau tingkat pengguna. Java merupakan salah satu dari sedikit bahasa pemrograman yang mendukung thread di tingkat bahasa untuk pembuatan dan managemen 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 pengguna atau kernel.
Setiap program dalam Java memiliki minimal sebuah thread, yaitu main thread yang merupakan single-thread tersendiri di JVM. Java juga menyediakan perintah untuk membuat dan memodifikasi thread tambahan sesuai Setiap program dalam Java memiliki minimal sebuah thread, yaitu main thread yang merupakan single-thread tersendiri di JVM. Java juga menyediakan perintah untuk membuat dan memodifikasi thread tambahan sesuai
Pembuatan Thread
Ada dua cara untuk membuat thread dalam Java. Pertama, thread dapat dibuat secara eksplisit dengan cara membuat objek baru dari class yang telah meng-extends class Thread yang menyebabkan class tersebut mewarisi method-method dan field dari class super. Dalam kasus ini, sebuah class hanya dapat meng-extends sebuah class. Keterbatasan ini dapat diatasi dengan cara kedua yaitu meng-implements interface Runnable, yang merupakan cara yang paling sering digunakan untuk membuat thread, sehingga class tersebut dapat meng-extends class lain.
Sebuah objek yang berasal dari subkelas Thread dapat dijalankan sebagai thread pengontrol yang terpisah dalam JVM. Membuat objek dari class Thread tidak akan membuat thread baru. Hanya dengan method start thread baru akan terbentuk. Memanggil method start untuk membuat objek baru akan mengakibatkan dua hal, yaitu:
• Pengalokasian memori dan menginisialisasikan sebuah thread baru dalam JVM. • Memanggil method run, yang sudah di-override, membuat thread dapat dijalankan oleh JVM.
(Catatan: Method run dijalankan jika method start dipanggil. Memanggil method run secara langsung hanya menghasilkan sebuah single-thread tambahan selain main thread)
Contoh pembuatan thread dengan membuat objek baru dari class yang meng-extends class Thread:
Gambar 3-22. Thread
public class TestThread1 { public static void main (String[] args) { BuatThread1 b = new BuatThread1(); for(int i = 0; i < angka; i++) {
b.start(); } } }
class BuatThread1 extends Thread { public void run() { try { System.out.println("Thread baru dibuat."); } catch (InterruptedException e) { }
JVM dan 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 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