Skip to main content

Concurrency dan Synchronization dalam Pemrograman

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.


Task States

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:
  1. 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.
  2. 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.
  3. 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.
  4. 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

Popular posts from this blog

Pengertian Binding dalam Bahasa Pemrograman dan Kapan Terjadinya

Binding dimaksudkan sebagai pengikatan (association) antara suatu entity dengan atributnya, misalnya binding/pengikatan antara suatu variable dengan tipe datanya atau dengan nilainya, atau dapat juga antara suatu operasi dengan simbol, misalnya simbol + dikenali sebagai operasi penjumlahan atau simbol ^ dikenali sebagai operasi pangkat, dll.  Peristiwa binding dan kapan terjadinya binding (biasanya disebut dengan binding time ) berperan penting dalam membicarakan semantics suatu bahasa pemrograman. Beberapa kemungkinan binding time adalah:

Latihan Soal Jawab Matematika Diskrit

Berikut di bawah ini adalah latihan soal jawab untuk matematika diskrit dengan topik-topik: Pernyataan Logika Circuits dan Ekspresi Boolean Argumen (valid/tidak valid) Teori Himpunan Permutasi Fungsi --o0o-- Pernyataan Logika 1. Buatlah tabel kebenaran untuk menentukan yang mana tautology dan yang mana contradiction dalam pernyataan logika (a) dan (b) di bawah ini: a. (p ∧ q) ∨ (∼p ∨ (p ∧ ∼q)) b.  (p ∧ ∼q) ∧ (∼p ∨ q)

Contoh proses normalisasi relasi dari UNF – 1NF – 2NF – dan 3NF

Dalam posting tulisan tentang: “Tujuan dan Manfaat Normalisasi dalam Perancangan Database” , kita sudah mempelajari tentang: “Apa itu normalisasi” dan “Mengapa kita perlu melakukan normalisasi”. Kedua pertanyaan itu sudah terjawab dalam tulisan tersebut.  Kemudian dalam posting tulisan tentang: “Konsep Ketergantungan Fungsional, Normalisasi, dan Identifikasi Primary Key dalam Perancangan Sistem Database” , kita sudah mempelajari suatu konsep penting yang digunakan untuk melakukan normalisasi, yaitu konsep ketergantungan fungsional yang terdiri dari ketergantungan penuh, ketergantungan parsial atau sebagian, dan ketergantungan transitif. Proses normalisasi pertama-tama dilakukan dengan mengidentifikasi adanya ketergantungan-ketergantungan tersebut dalam relasi-relasi dan kemudian menghilangkannya. Cara melakukan normalisasi, mengidentifikasi berbagai macam ketergantungan, dan menghilangkan ketergantungan pada relasi-relasi bisa dipelajari ulang dalam postingan tulisan di at