Concurrency
Concurrency pada tingkat unit-level merupakan eksekusi dua atau lebih subprogram secara bersamaan. “Unit” yang dimaksudkan untuk dieksekusi secara bersamaan biasanya didefinisikan oleh bahasa pemrograman. Sedangkan concurrency pada tingkat program-level merupakan eksekusi dua atau lebih program secara bersamaan. Concurrency pada tingkat program-level biasanya diatur oleh operating system yang menjalankan program tersebut. Sehingga tidak ada isu desain bahasa pemrograman terkait dengan concurrency pada tingkat program-level.
Task vs Subprogram
Task merupakan sebuah unit dalam suatu program, mirip dengan sebuah subprogram, task dapat dieksekusi secara bersamaan dengan (concurrent) dengan unit lainnya dalam program yang sama. Terdapat tiga karakteristik yang membedakan task dengan subprogram yaitu:
- task dapat dijalankan secara implisit, sedangkan subprogram harus dijalankan secara eksplisit
- eksekusi dari unit program yang menjalankan suatu task, tidak harus tertahan untuk menunggu selesainya task tersebut
- ketika eksekusi dari suatu task selesai, kendali tidak harus dikembalikan ke unit program yang menyebabkannya berjalan (caller)
- task biasanya bekerja sama.
Suatu task bisa berada dalam beberapa state berikut:
- New – pada state ini task sudah dibuat tapi belum mulai dijalankan
- Ready – pada state ini task siap (ready) untuk dijalankan, tapi sedang tidak dijalankan (processor belum dapat menjalankannya) karena ada task lain dengan precedence yang lebih tinggi sedang dijalankan.
- Running – pada state ini task sedang dijalankan oleh processor
- Blocked – pada state ini task sudah berjalan, namun tertahan (biasanya karena menunggu terjadinya event tertentu)
- Dead – pada state ini task sudah tidak aktif lagi
Task States |
Pada state New, task sudah dibuat tetapi belum mulai dijalankan. Task akan beranjak ke state Ready siap untuk dijalankan tetapi belum dijalankan. Apabila tidak ada lagi task lain yang precedencenya lebih tinggi maka task dijalankan dan berada pada state Running. Ketika waktu pengerjaan (time slice expiration) habis maka task akan kembali ke state Ready, membentuk siklus. Untuk task yang telah selesai dikerjakan akan masuk ke state Dead (task sudah tidak aktif). Bila dibutuhkan input/output maka task masuk ke state Blocked untuk menunggu dipenuhinya input/output dan kembali ke state Ready, dan membentuk siklus.
Synchronization
Synchronization merupakan sebuah mekanisme yang mengendalikan urutan eksekusi dari beberapa task. Task yang dijalankan secara bersamaan (concurrent) biasanya bekerja sama untuk mensimulasikan atau menyelesaikan permasalahan. Dalam bekerja sama, masing-masing task tersebut saling berkomunikasi dan mempengaruhi satu sama lain serta tak jarang menggunakan data yang sama. Oleh karena itu diperlukan metode komunikasi untuk mensinkronisasi ekseksusi masing-masing task dan pengaturan penggunaan data yang sama oleh tiap-tiap task. Ada dua jenis synchronization yaitu cooperation dan competition.
- Cooperation synchronization diperlukan oleh task A dan task B jika task A harus menunggu task B menyelesaikan suatu aktivitas sebelum task A dapat melanjutkan eksekusinya.
- Competition synchronization diperlukan oleh dua task, jika kedua task tersebut perlu menggunakan sejumlah resources yang tidak dapat digunakan secara simultan.
Contoh kasus dimana Synchronization merupakan suatu kebutuhan
Misalkan terdapat variable TOTAL yang digunakan secara bersama (shared) oleh dua buah task A dan B yang masing-masing berisi statement yang merubah nilai TOTAL sebagai berikut:
Task A: TOTAL = TOTAL + 3
Task B: TOTAL = TOTAL * 3
Misal nilai awal variabel TOTAL = 2. Terdapat empat kemungkinan hasil akhir total tergantung dari urutan eksekusi task pada variabel TOTAL yaitu:
- Task A mengambil nilai TOTAL = 3 dan mengubahnya menjadi TOTAL = 3 + 3 = 6, kemudian task B mengambil nilai TOTAL = 6 dan mengubahnya menjadi TOTAL = 6 * 3 = 18. Hasil akhir TOTAL = 18.
- Task B mengambil nilai TOTAL = 3 dan mengubah menjadi TOTAL = 3 * 3 = 9, kemudian task A mengambil nilai TOTAL = 9 dan mengubahnya menjadi TOTAL = 9 + 3 = 12. Hasil akhir TOTAL = 12.
- Task A dan task B masing-masing mengambil nilai TOTAL = 3. Task A dieksekusi terlebih dahulu sehingga TOTAL = 3 + 3 = 6. Kemudian task B dieksekusi menggunakan TOTAL = 3, mengubah TOTAL = 3 * 3 = 9 dan menyimpan nilai tersebut. Hasil akhir TOTAL = 9.
- Task A dan task B masing-masing mengambil nilai TOTAL = 3. Task B dieksekusi terlebih dahulu sehingga TOTAL = 3 * 3 = 9. Kemudian task A dieksekusi menggunakan TOTAL = 3, mengubah TOTAL = 3 + 3 = 6 dan menyimpan nilai tersebut. Hasil akhir TOTAL = 6.
Keadaan dimana hasil akhir dari eksekusi dua task tergantung pada urutan eksekusinya disebut sebagai race condition. Untuk mengatasi permasalahan ini maka diperlukan synchronization untuk mengatur urutan ekseskusi kedua task tersebut dan mengatur bagaimana variabel TOTAL digunakan oleh masing-masing task.
Comments
Post a Comment