Pendahuluan

Berikut penjelasan awal tentang Thread .

Jadi Thread secara sederhana adalah :

bagian eksekusi sebuah proses yang bisa dijalankan terpisah.

definisinya cukup abstrak, karena pada kenyataannya implementasinya juga berbeda-beda tergantung dari implementasi di OS maupun software nya.


1 physical core CPU handling banyak Thread ?


Pertanyaan nya adalah misalnya dengan Core CPU yang cuma 1 , atau Core Thread CPU yang cuma 1, bagaimana menangani banyak Thread ?

Atau bagaimana CPU yang secara fisik cuma satu, handling Thread Kernel atau Thread Software yang begitu banyak ?

Sehingga ada istilah MultiThreading ?

Logisnya adalah satu Core CPU hanya bisa memproses satu proses/Thread pada satu waktu.

Sehingga logisnya pula, bahwa 1 Core CPU memproses banyak Thread adalah dalam bentuk “Semu” ,“Seakan-akan”, dan “tidak kasat mata”.

“Ghoib” lah :D.

Inilah yang kita sebut Concurrency.

Concurrency artinya satu core CPU memproses Thread secara bergantian dalam hitungan milliseconds, untuk menimbulkan efek bahwa satu CPU menjalankan banyak proses dalam satu waktu.

Katakanlah 10 milidetik adalah waktu yang dischedulekan untuk satu core CPU untuk memproses satu Thread.

Dan 1 milidetik adalah waktu untuk switch thread / process.

Maka kalau ada misalnya 3 proses yang berbeda pada saat yang bersamaan.

  • proses cek saldo
  • proses transfer uang
  • proses tarik tunai

Lalu kita misalkan dengan 1 Core CPU, maka 1 Core nya tersebut dengan kondisi diatas akan melakukan :

  • milidetik 1 - 10 melakukan proses cek saldo. Tetapi belum selesai.
  • milidetik 11 melakukan switch ke thread proses transfer uang.
  • milidetik 12 - 17 melakukan proses transfer uang, dan selesai.
  • milidetik 18 melakukan switch ke thread proses cek saldo lagi.
  • milidetik 19 - 28 melakukan proses cek saldo lagi, dan selesai.
  • milidetik 29 melakukan switch ke thread proses tarik tunai.
  • milidetik 30 - 35 melakukan proses tarik tunai, tetapi belum selesai
  • milidetik 35 - 40 tidak dilakukan proses switch karena next thread nya tetap proses tarik tunai, dan selesai.

Maka kita bisa lihat bahwa secara “kasat mata” bahwa Core CPU telah berhasil menjalankan secara Concurrent 3 buah proses secara bersamaan dari rentang waktu milidetik 1 s/d milidetik 40.

Kurang dari 1 detik !!. untuk 3 proses.

Dari sisi kita sebagai manusia, maka concurrency “kelihatan” seperti berbarengan, padahal tetap saja bergantian.

Karena Thread yang punya Time Slicing / Potongan waktu CPU dalam hitungan milidetik.

Tentunya pengaturan Time Slicing ini tergantung dari Operating System (OS) nya dan memakai beberapa teknik optimasi dan Algoritma Scheduling tertentu.

Dan kalau kita lihat kasus diatas, untuk 3 proses untuk 3 program code yang berbeda dalam satu waktu.

Kompleksitasnya akan bertambah ketika kasusnya misalnya 9 proses untuk 3 program code yang berbeda.

Misalnya :

  • ada 2 proses cek saldo yang masuk secara bersamaan.
  • ditambah 4 proses transfer uang yang masuk secara bersamaan.
  • ada 3 proses tarik tunai yang masuk secara bersamaan.

Maka tetap saja Concurreny berlaku diantara proses-proses diatas.

Hal yang natural dan sering kita temui misalnya di :

  • Web request, yang menangani xx request dalam satu waktu.
  • Kasus berbasiskan event yang menerima banyak event yang sama dalam satu waktu.
  • dll.

Tantangan dalam Concurrency


Concurrency merupakan cara natural komputer dalam menangani banyak proses.

Tetapi tentunya banyak tantangannya :

  • Bagaimana mengoptimalkan pengaturan Scheduler ketika ternyata eksekusi proses/thread pendek-pendek, atau sangat bervariatif ?
  • Bagaimana kalau proses yang ada ternyata perlu prioritas untuk dieksekusi lebih duluan ?
  • Kalaupun ada prioritas, bagaimana mencegah agar Thread yang prioritas rendah tidak mengalami Starvation atau Thread dengan prioritas rendah tidak akan pernah dieksekusi.
  • Bagaimana mencegah terjadinya Deadlock karena banyak Thread yang saling menunggu satu sama lain.
  • Bagaimana mencegah terjadinya Race Condition karena banyak Thread yang saling menimpa sebuah data sharing pada satu waktu.
  • Bagaimana kalau CPU nya terdiri dari banyak Core CPU atau Thread CPU (versi Virtual Core dari CPU) ?
  • Bagaimana program dari Software Engineer mengakomodasi fitur Thread ini sambil tetap mempertahankan kebenaran dari eksekusi program ?
  • dll.

Dan sebenarnya Thread ini ada levelnya, maka kompleksitas pembahasan nya pun akan banyak.

Misalnya :

  • Thread level kernel / Operating System.
  • Thread level user, dengan memakai thread pool atau tidak.

Sehingga memang akan banyak pembahasan mengenai Thread ini kalau mau didalami.

Akan tetapi tentu saja akan kembali lagi kepada konsep Concurrency yang kita bahas diatas.

Kita lanjut ke Paralelism .