Suatu thread merupakan suatu alur instruksi yang di
eksekusi. Program yang melakukan lebih dari satu alur instruksi biasa disebut
melakukan multithreading.
Contoh,
kita ingin membuat suatu aplikasi untuk meng-import file yang besar sementara
memungkinkan user untuk menekan tombol “Batal”, seorang developer akan membuat
thread tambahan untuk melakukan proses import. Dengan melakukan proses import
di thread yang lain, aplikasi bisa menerima pesan pembatalan dari user daripada
harus menyebabkan aplikasi menjadi “Not Responding” sampai proses upload
selesai.
Suatu
sistem operasi men-simulasikan beberapa thread melalui mekanisme yang disebut
“time slicing”. Time Slicing adalah mekanisme dimana sistem operasi mengalihkan
eksekusi dari satu thread (urutan instruksi) ke thread berikutnya sehingga
proses eksekusi perintah secara terus menerus akan tetap berlanjut dengan
cepat.
Efeknya
hampir sama dengan efek dalam kabel fiber optic dari telepon, dimana kawat dari
fiber optic mewakili processor dan setiap percakapan yang terjadi mewakili
suatu thread. Satu (single-mode) kawat fiber optic telepon hanya bisa
mengirimkan 1 sinyal pada sekali pakai, tetapi banyak orang bisa saling
melakukan percakapan secara terus menerus. Channel-channel dalam fiber optic
cukup cepat dalam melakukan pergantian antar percakapan. Hampir sama, setiap
thread dari suatu proses multithread selalu berjalan terus menerus secara
paralel dengan thread yang lain.
Suatu
thread seringkali menunggu event-event yang berbeda, seperti operasi I/O,
mengganti ke suatu thread yang berbeda menyebabkan lebih efisiennya proses
eksekusi perintah, karena processor tidak perlu idle untuk menunggu sampai
operasi selesai.
Tetapi,
mengganti proses dari satu thread ke thread yang lain akan bisa menyebabkan
“overhead”. Jika terlalu banyak thread, pengalihan overhead akan membanjiri
bagian dari proses thread yang sedang di eksekusi, juga, sistem akan mulai
berjalan lambat – mulai melakukan proses pergantian antar thread daripada
menyelesaikan proses dari thread sebelumnya terlebih dahulu.
Yang
baru mengenal programming-pun pasti pernah mendengar istilah multithreading
sebelumnya, seringkali mengenai kerumitannya.
Pemrograman,
betapapun, meninggalkan suatu kerumitan yang patut dipertimbangkan, tidak
sebanyak seperti membuat aplikasi yang memiliki banyak thread.
Atomicity
(Valensi)
Pikirkan suatu kode program yang melakukan proses transfer dari suatu rekening. Pertama, pastikan apakah dananya cukup, jika cukup, proses transfer terjadi. Jika sesudah mengecek dana, eksekusi diganti dengan thread untuk menghapus dana tersebut, maka akan menyebabkan proses transfer yang invalid ketika proses eksekusi kembali ke thread awal. Mengatur akses rekening sehingga hanya satu thread yang bisa mengakses rekening tersebut, dalam satu waktu akan memperbaiki masalah dan menjadikan transfer tersebut “atomic”.
Pikirkan suatu kode program yang melakukan proses transfer dari suatu rekening. Pertama, pastikan apakah dananya cukup, jika cukup, proses transfer terjadi. Jika sesudah mengecek dana, eksekusi diganti dengan thread untuk menghapus dana tersebut, maka akan menyebabkan proses transfer yang invalid ketika proses eksekusi kembali ke thread awal. Mengatur akses rekening sehingga hanya satu thread yang bisa mengakses rekening tersebut, dalam satu waktu akan memperbaiki masalah dan menjadikan transfer tersebut “atomic”.
Suatu
operasi atomic adalah satu, yang mana menyelesaikan seluruh prosesnya sampai
selesai, atau mengembalikan sistem ke kondisi awal. Operasi transfer pada bank
pastinya merupakan suatu operasi atomic karena melibatkan 2 langkah. Dalam
proses melakukan langkah-langkah tersebut, sangat mungkin kehilangan operasi
atomicity jika thread yang lain melakukan modifikasi terhadap rekening sebelum
proses transfer selesai.
Identifikasi
dan implementasi atomicity merupakan salah satu kerumitan utama dalam
pemrograman multithreading.
Kerumitannya
bertambah karena secara umum statemen dalam C# tidak secara penuh memerlukan
atomic. _Count++, sebagai contohnya, merupakan statemen dalam C#, tetapi
diterjemahkan menjadi beberapa instruksi untuk processor.
1.
Proses membaca data dalam Count.
2. Processor mengkalkulasikan nilai yang baru.
3. Nilai baru diberikan pada Count (walaupun ini mungkin bukan atomic).
2. Processor mengkalkulasikan nilai yang baru.
3. Nilai baru diberikan pada Count (walaupun ini mungkin bukan atomic).
Sesudah
data diakses, tetapi sebelum nilai baru diberikan, thread yang lain mungkin
akan memodifikasi nilai aslinya.
Deadlock
Untuk menghindari kondisi yang tidak diinginkan, bahasa pemrograman mendukung kemampuan untuk mengunci dan membatasi kode untuk dijalankan pada thread tertentu, umumnya satu. Tetapi, jika perintah penguncian dijalankan pada thread berbeda, suatu deadlock bisa terjadi, seperti thread menjadi berhenti, masing-masing menunggu yang lain untuk melepaskan penguncian.
Untuk menghindari kondisi yang tidak diinginkan, bahasa pemrograman mendukung kemampuan untuk mengunci dan membatasi kode untuk dijalankan pada thread tertentu, umumnya satu. Tetapi, jika perintah penguncian dijalankan pada thread berbeda, suatu deadlock bisa terjadi, seperti thread menjadi berhenti, masing-masing menunggu yang lain untuk melepaskan penguncian.
Contohnya :
Pada poin ini, setiap thread menunggu thread lain sebelum memulai proses, jadi setiap thread dikunci, sehingga mengakibatkan deadlock secara keseluruhan dalam proses eksekusi kode yang dijalankan.
Pada poin ini, setiap thread menunggu thread lain sebelum memulai proses, jadi setiap thread dikunci, sehingga mengakibatkan deadlock secara keseluruhan dalam proses eksekusi kode yang dijalankan.
Masalah
dari code yang tidak atomic atau menyebabkan deadlock adalah bahwa kode
tersebut tergantung pada urutan terjadinya instruksi dalam processor pada
beberapa thread.
Sekilas pemrograman multithreading memang agak susah dan
rumit, semua tergantung bagaimana logika programmer dalam mengatasinya. Salam
Tidak ada komentar:
Posting Komentar