BAB 10
Concurrency
1.Pengenalan Concurrency
Concrrency adalah sebuah tugas(task) atau proses yang dimana unit program dapat dieksekusi bersamaan dengan unit program yang lain.Sebuah tugas (task) berbeda dengan subprogram biasa bila :
-Sebuah tugas dapat mulai secara implisit
-Ketika sebuah unit program memulai eksekusi sebuah tugas,maka tidak perlu dilakukan penundaan
-Ketika sebuah eksekusi tugas telah selesai,control tidak kembali kepada pemanggil
-Sebuah tugas biasanya dijalankan secara bersamaan
Concurrency pada sebuah mesin dapat terjadi pada 4 buah level :
– Instruksi level (eksekusi dua atau lebih instruksi mesin serentak)
– Statement level (eksekusi dua atau lebih statement bahasa tingkat tinggi serentak)
– Unit level (eksekusi dua atau lebih subprogram unit serentak)
– Program level (eksekusi dua atau lebih program serentak)
Secara umum,sebuah tugas dapat dibagi menjadi 2 kategori :
- Heavyweight task ,sebuah tugas yang mengeksekusi ruang alamatnya sendiri
- Lightweight task ,sebuah tugas yang berjalan pada ruang alamat yang sama.
Lightweight task dapat lebih efisien dibandingkan Heavyweight task,karena hanya butuh usaha kecil untuk mengatur eksekusinya.Sebuah tugas (task) dapat berhubungan dengan lainnya melalui variabel non-lokal yang dibagi. Sebuah tugas (task) dikatan disjoint apabila tidak berhubungan atau tidak mempenaruhi task lainnya pada program tersebut.Karena,task pada umumnya bekerja bersama untuk menyelesaikan masalah untuk itu mereka tidak disebut disjoint,mereka harusnya menggunakan beberapa bentuk komunikasi atau mengsinkronisasikan eksekusi atau membagi data mereka.
Synchronization adalah mekanisme yang mengkontrol task yang akan dieksekusi.Ada 2 jenis synchronization yang diperlukan saat task lagi berbagi data :
Terdapat 2 tipe synchronization :
– Cooperation synchronization
Cooperation synchronization adalah synchronization yang dibutuhkan antara task A dan task B ketika task A harus menunggu task B untuk menyelesaikan aktivitas spesifik sebelum task A dapat melanjutkan eksekusi.
– Competition synchronization
Competititon synchronization adalah synchronization yang dibutuhkan antara 2 task ketika keduanya membutuhkan resource yang tidak dapat digunakan secara serentak.
Komunikasi antara task sangat penting untuk synchronization disediakan oleh :
– Shared nonlocal variables
– Parameters
– Message passing
Scheduler berfungsi memberikan sinkronisasi ke mekanisme eksekusi task yang terlambat.Kontrol eksekusi task di atur oleh program bernama scheduler.
Macam-macam tahap eksekusi task:
– New adalah tahap dimana sebuah tasks dibuat tapi belum dijalankan
– Ready adalah tahap dimana sebuah tasks siap untuk dijalankan tapi belum berjalan
– Running adalah tahap dimana sebuah tasks yang sedang berjalan / eksekusi
– Blocked adalah tahap dimana sebuah tasks yang diblok ketika sedng berjalan / interrupted oleh sesuatu
– Dead adalah tahap dimana sebuah tasks yang tidak lagi aktif
Diagram dari tahap task
Satu hal yang penting dalam eksekusi task yaitu bagaimana task yang dipilih telah selesai untuk berpindah ke tahapp running ketika task yang saat itu sedang berjalan telah menjadi blocked atau time slice telah berakhir? Berbagai algoritma telah digunakan untuk pilihan ini ,beberapa berdasarkan level prioritas yang spesifik .Algoritma yang melakukan tindakan pemilihan ini diimplementasikan di scheduler. Asosiasi antara ekseksi concurrent dengan kegunaan dari sumber yang dapat dibagi menghasilkan konsep liveness.Liveness adalah karakteristik dari program unit yang mungkin / tidak mungkin memiliki sequential code (unit akan menyelesaikan eksekusinya).Sedangkan deadlock adalah semua task pada concurrent environment kehilangan liveness nya.Deadlock merupakan ancaman yang serius terhadap reliability suatu program.
2.Masalah dalam mendesain Concurrency
- Competition and cooperation synchronization (yang paling penting)
- Controlling task scheduling
- How can an application influence task scheduling
- How and when tasks start and end execution
- How and when are tasks created
Masalah dalam mendesain concurrency dapat diatasi dengan 3 hal berikut yaitu:semaphores,
monitors,dan message passing.
- Semaphore
Semaphore adalah data struktur mengandung counter dan queue untuk menyimpan task descriptor (task descriptor adalah data struktur yang menyimpan semua informasi relevan tentang tahap eksekusi dari sebuah task) / mekanisme simple yang dapat digunakan untuk memberikan sinkronisasi task.Semaphore dapat digunakan untuk implementasi guard yaitu sebuah alat linguistic yang dimana kode yang dijaganya dapat dieksekusi dalam sebuah kondisi spesifik yang benar.Jadi,sebuah guard hanya dapat dipakai sekali untuk sebuah task untuk mengakses data yang dibagi struktur data pada waktu tertentu.
Semaphore hanya memiliki dua operasi, wait dan release (awalnya disebut Passeren dan Vrygerem oleh Dijkstra). Semaphore dapat digunakan untuk menyediakan competition dan cooperation synchronization.
- Cooperation Synchronization dengan Semaphores
Contohnya adalah shared buffer.
- Buffer diimplementasikan sebagai tipe data abstrak dengan operasi DEPOSIT dan FETCH yang menjadi acara untuk mengakses
- Menggunakan 2 semaphore untuk cooperation yaitu : emptyspots dan
- Balasan dari semaphore biasanya digunakan unyuk menyimpan angka dari emptyspots dan fullspots pada
- DEPOSIT pertama kali harus memeriksa adanya ruang pada buffer.Bila ada,maka counter dari emptyspots akan dikurangi dan nilai akan dimasukkan. Bila tidak ada ,pemanggil akan disimpan pada barisan dari
- Setelah DEPOSIT selesai,maka counter of fullspots akan dinaikkan
- FETCH pertama kali wajib memeriksa fullspots untuk melihat apaka adanya nilai.Jika ada fullspot,counter dari fullspots akan berkurang dan nilai akan dihilangkan .Jika tidak ada nilai,maka pemanggil harus memindahkan pada antrian Ketika FETCH telah selesai , maka counter of emptyspots akan naik
Operasi FETCH dan DEPOSIT pada semphorres dapat dipakai melalui 2 operasi semaphores yaitu Wait dan Release.
Berikut adalah contoh penggunaan operator wait dan release pada semaphore :
wait(aSemaphore)
if aSemaphore’s counter > 0 then
decrement aSemaphore’s counter
else
put the caller in aSemaphore’s queue
attempt to transfer control to some ready task
(if the task ready queue is empty, deadlock occurs)
end if
release(aSemaphore)
if aSemaphore’s queue is empty (no task is waiting) then
increment aSemaphore’s counter
else
put the calling task in the task-ready queue
transfer control to a task from aSemaphore’s queue
end
- Competition Synchronization dengan Semaphores
Competition Synchronization dengan Semaphores menggunakan semaphore ketiga yang dinamakan access yang digunakan untuk control akses.Counter dari akses hanya memiliki nilai 0 dan 1 .Inilah yang disebut sebagai binary semaphore.Perhatikan juga wait dan release harus atomic.
- Monitors
Monitors bertugas mengenkapsulasi shared data dan operasi nya untuk membatasi akses. Monitor adalah abstract data type (ADT) untuk shared data.Monitors terdapat pada bahasa pemograman Ada,Java dan C#.Monitors dapat digunakan untuk menyediakan competition tanpa semaphores dengan bertanggung jawab dalam mentransfer sinkronisasi ke system run-time.
- Cooperation Synchronization dengan Semaphores
Cooperation diantara proses masih merupakan task programming.Programmer harus memastikan shared buffer tidak mengalami underflow atau overflow.
- Competition Synchronization dengan Semaphores
Shared data bertempat tinggal di monitor dari pada di unit klien.Implementasi monitor memastikan sinkronisasi akses dengan memperbolehkannya sekali akses pada suatu waktu.Prosedur pemanggilan monitor menunggu secara implisit jika monitor sibuk pada saat pemanggilan.
- Message Passing
Message Passing adalah model general dari concurrency.Message passing dapat melakukan semaphores dan monitors. Message passing tidak hanya untuk competition synchronization.Komunikasi task dapat diibaratkan sebagai konsultasi dokter-kebanyakan waktu dihabiskan untuk menunggu anda atau dokter,namun ketika keduanya siap ,maka akan bertemu.
Linimasa waktu pertemuan
Server task adalah sebuah task yang menerima clauses bukan kode lain .Sebuah task tanpa menerima clauses disebut sebagai actor task.Sebuah actor task dapat mengirimkan pesan kepada actor task lainnya.Sebuah pengirim harus mengetahui entry name dari penerima tapi tidak sebaliknya.
3.Multiple Entry Points
Sebuah task dapat memiliki lebih dari 1 titik masuk dengan cara spesifikasi task memiliki klausa masuk untuk setiapnya dan task body dapat menerima klausa dari setiap klausa masuk dan memindahkannya pada sebuah select clause yaitu dalam sebuah loop.Contoh penggunaan task dengan lebih dari 1 titik masuk :
task body Teller is
loop
select
accept Drive_Up(formal params) do
…
end Drive_Up;
…
or
accept Walk_Up(formal params) do
…
end Walk_Up;
…
end select;
end loop;
end Teller;
Oleh Kelompok 12
Referensi :
Bab 10 :
- Robert W. Sebesta – Concept of Programming Languages (Tenth Edition), Chapter 13
- http://arcana70.blogspot.co.id/2014/06/kbp-pert-10.html
- http://panduofunited.blogspot.co.id/2012/02/pengertian-concurrency.html
- https://binusmaya.binus.ac.id/newStudent/#/class/resources.COMP6060/007420/1610/LEC/9239