Thread
Materi Pengenalan Thread Pemrograman Multicore Model Multithread Thread Library Implicit Threading Permasalahan dalam Thread Thread dalam Berbagai Sistem Operasi
Tujuan Memperkenalkan konsep thread – unit dasar dari penggunaan CPU yang terbentuk dari sistem multithread Mendiskusikan API untuk library thread Pthreads, Windows, dan Java Mengeksplor beberapa strategi implicit threading Membahas masalah pada program multithread
Pengenalan Thread
Thread Unit dasar dari pemanfaatan CPU Pada dasarnya satu proses terdiri atas satu thread (single-thread) Dalam sekali waktu hanya ada satu tugas yang bisa dikerjakan dalam satu proses Padahal program-program terkini butuh menjalankan beberapa tugas dalam sekali waktu. Butuh multi-thread dalam satu proses.
Contoh Kebutuhan Multithreading Web browser Thread untuk menampilkan halaman web, gambar Thread untuk mengunduh data dari jaringan Pengolah kata Thread untuk menerima dan menampilkan hasil pengetikan Thread untuk mengecek grammar Webserver Thread untuk menangani request dari banyak user
Contoh Multithread pada Webserver
Question Mengapa harus multi-thread? Mengapa tidak pakai multiprocess saja? Apa keuntungan pakai multithread?
Keuntungan Multithread Responsiveness Program tetap bisa berjalan walaupun ada sebagian tugas yang memakan waktu lama. Contoh : Web browser tetap dapat digunakan walaupun sedang ada aktifitas download. Resource sharing Multiprocess : Butuh implementasi shared memory atau message passing untuk berbagi data antar-proses. Multithread : Antar-thread dalam satu proses sudah berbagi data Economy Multiprocess : Butuh alokasi banyak memori dan resource untuk membuat proses baru Multithread : Antar-thread sudah berbagi resource yang dialokasikan untuk sebuah proses Scalability Process : Satu processor hanya bisa mengeksekusi satu proses Thread : Setiap thread dalam satu proses dapat dieksekusi secara paralel oleh processor yang berbeda
Single Thread vs Multi Thread
Multicore Program
Multicore Program Multicore/Multiprocessor : ada lebih dari satu processor/core processor dalam satu system Pemrograman multithread memungkinkan pemanfaatan fitur multicore pada suatu system Contoh sebuah program dengan 4 threads Single core : Eksekusi thread dilakukan secara bergantian (concurrent) Multi Core : Eksekusi dilakukan secara parallel sesuai jumlah core Memungkinkan pembagian tugas dalam satu program
Question Apa perbedaan concurrent dan parrarel?
Concurrency vs. Parallelism Concurrent execution pada single core Hanya ada satu thread yang dieksekusi sekali waktu Thread dieksekusi dengan progress tertentu secara bergantian Paralleilism pada multi-core Beberapa thread dieksekusi secara parallel sesuai jumlah core
Tantangan Pemrograman pada Sistem Multi-core Identifikasi aktifitas Identifikasi bagian program mana saja yang dapat berjalan terpisah Keseimbangan Tugas yang dipisah memiliki beban yang seimbang Pemisahan data Bagaimana membagi data antar bagian program yang terpisah? Ketergantungan data Bagaimana jika data pada satu tugas bergantung dengan data dari tugas lain? Testing dan debugging Bagaimana melakukan testing dan debugging pada bagian program yang terpisah?
Tipe Parralelism Data parralelism Task parralelism
Data Parallelism Distribusi bagian-bagian data ke masing-masing core processor berbeda untuk diolah Operasi pada masing-masing core sama Contoh : Operasi penjumlahan bilangan 1 sampai N Ada 2 core processor Penjumlahan data 1 sampai (N/2) di core 1 dan (N/2+1) sampai N di core 2
Task Parallelism Distribusi tugas (thread) berbeda ke masing-masing core processor yang berbeda Operasi pada masing-masing core beda Contoh : Core 1 menghitung standard deviasi Core 2 mencari nilai max
Multithreading Model
User Thread vs Kernel Thread Berdasarkan pengendalinya, thread dibagi : User thread Kenel thread User thread dikendalikan oleh program pada level user tanpa campur tangan kernel Kernel thread dikendalikan langsung oleh sistem operasi Ada beberapa model hubungan antara kernel dan user thread
Model Many-to-One Beberapa user-thread dipetakan ke satu kernel-thread Kelebihan Tidak ada batasan jumlah user-thread yang bisa dibuat Kelemahan Satu thread melakukan blocking (misal I/O), seluruh proses ter-block Multithread tidak dapat dijalankan secara parallel pada sistem multicore Contoh Solaris Green Threads GNU Portable Threads
Model One-to-One Contoh : Windows, Linux Satu user-thread dipetakan ke satu kernel-thread Pembuatan satu user-thread = Pembuatan satu kernel-thread Kelebihan Satu thread blocking tidak akan berpengaruh ke thread lain Multithread dapat dijalankan secara parallel pada sistem multicore Kelemahan Jumlah user-thread yang bisa dibuat terbatas Pembuatan kernel-thread dapat membebani performa Contoh : Windows, Linux
Model Many-to-Many Beberapa user-thread dipetakan ke beberapa kernel-thread (multiplexing) Jumlah kernel-thread yang dibuat bergantung aplikasi dan spesifikasi mesin Kelebihan : Satu thread blocking tidak akan berpengaruh ke thread lain Tidak ada batasan jumlah user-thread
Two Level Model Mirip M:M, tapi mengijinkan user-level thread dipetakan ke satu kernel thread Contoh : IRIX HP-UX TRU64-Unix Solaris 8 ke bawah
Thread Library
Thread Libraries Application Programming Interface (API) untuk pembuatan dan manajemen thread Dua jenis implementasi Library diimplementasi di level user Library diimplementasi di level kernel. Bisa dipianggil dengan dengan system call
Strategi Implementasi Asynchronous Threading Setelah thread induk membuat thread anak, proses induk kembali melanjutkan eksekusi Thread induk dan thread anak berjalan independen Proses induk tidak perlu tahu status thread anak Synchronous Threading Proses induk menunggu semua thread anak selesai sebelum melanjutkan eksekusi (fork-join) Setelah thread anak selesai, join ke thread induk
Pthreads Tersedia untuk user-level dan kernel-level thread Spesifikasi, bukan implementation API menspesifikasi behaviour, untuk implementasi tergantung developer Banyak digunakan pada OS berbasis UNIX seperti Solaris, Linux, Mac OS X
Contoh Pthreads
Contoh Pthreads (Cont.)
Pthreads Code for Joining 10 Threads (fork-join strategy)
Windows Multithreaded C Program
Java Threads Java threads diatur oleh JVM Implementasi menggunakan model thread yang disediakan oleh OS Java threads dapat dibuat dengan: Extends Thread class dan override method run() Implement Runnable interface
Java Multithreaded Program : implement Runnable
Java Multithreaded Program (2)
Java Thread : Important Notes Tidak ada konsep global variabel Proses berbagi data dilakukan dengan passing reference ke object Contoh : panggil method getSum() dan setSum() Implementasi fork-join strategy dilakukan dengan memanggil method join()
Question Apa perbedaan implementasi thread di Java dengan implements Runnable dan extend Thread class?
Implicit Threading
Implicit Threading Dalam perkembangannya, sebuah aplikasi dapat mempunyai ratusan hingga ribuan thread Contoh : multithread pada webserver Masalah : Identifikasi, pemisahan data, ketergantungan data Ketepatan hasil program Solusi Implicit threading : pembuatan dan manajemen thread dilakukan oleh compiler dan run-time library, bukan programmer
Metode Implicit Threading Thread Pools OpenMP Grand Central Dispatch
Thread Pools Latar Belakang Solusi Thread Pools Kelebihan Ada ratusan/ribuan thread yang harus dibuat pada satu aplikasi. Contoh : webserver Pembuatan thread memakan waktu dan resource Solusi Thread Pools Buat beberapa thread di awal process dan tempatkan dalam penampung (pool) Ketika sebuah tugas akan dieksekusi, gunakan thread-thread yang sudah tersedia dalam pool Kelebihan Lebih cepat daripada membuat thread baru setiap kali ada tugas Thread pool dapat membatasi jumlah threa yang dibuat sekali waktu Ada pemisahan bagian antara tugas yang akan dikerjakan dengan pembuatan thread Sebuah tugas dapat dilakukan secara berulang
OpenMP API untuk C, C++, FORTRAN Menyediakan dukungan untuk pemrograman parallel pada lingkungan shared-memory Programmer dapat menentukan Parallel regions – bagian code yang berjalan secara parallel #pragma omp parallel Create as many threads as there are cores #pragma omp parallel for for(i=0;i<N;i++) { c[i] = a[i] + b[i]; } Run for loop in parallel
Grand Central Dispatch Tekologi Apple untuk Mac OS X dan iOS Programmer dapat menentukan bagian code yang berjalan secara parallel Detail pengaturan threading sudah diatur oleh GCD Code ditaruh di “^{ }” - ˆ{ printf("I am a block"); } Bagian block ditempatkan dalam dispatch queue Block dijalankan oleh thread yang tersedia di thread pool Block dihapus dari dispatch queue
Permasalahan dalam Thread
Permasalahan dalam Thread System call fork() dan exec() Signal handling Pembatalan thread Thread local storage Schedulers activation
System call fork() dan exec() Permasalahan Jika fungsi fork() dipanggil oleh salah satu thread, apakah semua thread diduplikasi atau hanya thread yang memanggil saja? Solusi Jika fungsi exec() dipanggil setelah fork(), duplikasi hanya untuk thread yang memanggil Program yang dipanggil di exec() akan menggantikan seluruh proses Jika tidak memanggil exec(), duplikasi semua thread
Signal Handling Signals digunakan pada UNIX system untuk memberitahu sebuah proses bahwa sebuah even terjadi. Divide by zero Buffer overflow Signal handler digunakan untuk menangani signal Signal dibuat oleh event tertentu Signal diberikan ke sebuah process Signal ditangani oleh satu dari dua jenis handler : default handler atau user-defined handler Masalah : Kemana signal harus diberikan pada proses dengan multi-thread? Berikan signal ke satu thread dimana signal tersebut digunakan Berikan signal ke setiap thread Berikan signal ke beberapa thread Tunjuk satu thread untuk menangani semua signal
Thread Cancellation Pemusnahan thread sebelum selesai menjalankan tugas Thread yang akan dibatalkan disebut target thread Dua pendekatan: Asynchronous cancellation memusnahkan target thread segera Deferred cancellation membuat target thread untuk mengecek secara periodik apakah dia harus mengakhiri eksekusi Pthread code to create and cancel a thread:
Thread Cancellation (Cont.) Pemusnahan thread bergantung status thread Default type adalah deferred Pemusnahan terjadi hanya ketika thread mencapai cancellation point I.e. pthread_testcancel() Then cleanup handler is invoked Pada Linux systems, pemusnahan thread ditangani melalui signals
Scheduler Activations M:M dan two-level model butuh komunikasi untuk menjaga alokasi jumlah kernel thread dari sebuah aplikasi Biasanya menggunakan perantara data structure antara user dan kernel threads – lightweight process (LWP) Terlihat sebagai virtual processor yang dapat menjadwalkan user-thread mana yang berjalan Setiap LWP ditempelkan ke kernel thread Berapa jumlah LWP yang harus dibuat? Scheduler activations menyediakan upcalls -Sebuah mekanisme komunikasi dari kernel ke upcall handler dalam library thread. Komunikasi ini membuat aplikasi dapat menjaga jumlah kernel thread yang dibuat
Thread-Local Storage Thread-local storage (TLS) membuat setiap thread mempunyai duplikat datanya sendiri Berguna jika programmer tidak bisa mengontrol pembuatan thread (ketika menggunakan thread pool) Beda dengan local variable Lingkup local variabel hanya dalam satu fungsi Lingkup TLS meliputi berbagai fungsi Mirip static data TLS unik untuk setiap thread
Thread dalam Berbagai Sistem Operasi
Windows Threads Thread di Windows dapat dibuat/diatur dengan Windows API Menerapkan one-to-one mapping, kernel-level Setiap thread mengandung Thread id Register set merepresentaskan status prosesor Memisahkan user dan kernel stack ketika thread berjalan di user mode atau kernel mode Private data storage area yag digunakan oleh run-time libraries and dynamic link libraries (DLLs) Register set, stacks, dan private storage area disebut sebagai context thread Struktur data sebuah thread meliputi: ETHREAD (executive thread block) – pointer ke proses induk dari sebuah thread dan ke KTHREAD, dalam kernel space KTHREAD (kernel thread block) – informasi penjadwalan dan sinkronisasi, kernel-mode stack, pointer ke TEB, dalam kernel space TEB (thread environment block) – thread id, user-mode stack, thread-local storage, di user space
Windows Threads Data Structures
Linux Threads Linux menggunakan terminologi tasks daripada threads Pembuatan thread melalui system call clone() clone()mengijinkan thread anak untuk berbagi data dengan proses induk Flags control behavior struct task_struct menunjuk ke process data structures (shared or unique)
Terima Kasih