Perbedaan antara Concurrency dan Parallelism
Sebelum kita mulai, mari kita tinjau lebih dalam tentang apa itu Concurrency dan mengapa kita harus lebih mementingkan problem dalam concurrency dibanding harus membuat sub proses(threading). Pada Era Modern saat ini, Bahasa pemrograman yang bersifat Higher Level seperti GO, Erlang, dsb lebih fokus untuk mengatasi masalah pada concurrency dan lebih sedikit dalam mengontrol parallelism. Bahasa Pemrogramman Higher Level dianjurkan untuk mencoba menangani concurrency dengan menggunakan beberapa abstract yang memungkinkan mengendalikan kedua bidang dalam hal kontrol dan komunikasi.
Namun apa itu concurrency? dan mengapa bahasa pemrograman Higher Level lebih fokus terhadap Concurrency dibandingkan Parallelism?
Concurrency ialah kemampuan suatu program untuk menangani multiple order atau request. Dimana setiap order atau requestyang masuk bisa ditumpuk / dibebani oleh satu proses. Kita analogikan sebuah proses sebagai seorang pelayan restoran. Berdasarkan konsep concurrency, pelayan tersebut memiliki ability untuk menghandle multiple outstanding order. Pelayan tersebut bisa saja mengambil semua pesanan dan ditumpuk menjadi satu.
Akan tetapi, masalah yang akan muncul ialah pelayan tersebut akan kebingungan dan kelelahan dengan banyaknya pesanan yang ditujukan ke dia, dan ordernya diselesaikan secara berurutan sehingga prosesnya berjalan lama. Oleh sebab itu, muncul proses yang diamakan Parallelism, yaitu kemampuan suatu program untuk menghandle lebih dari satu order/request secara bersamaan. Kita menggunakan analogi yang sama, yaitu pelayan restoran. Dalam Parallelism, kita memiliki banyak pelayan (anggap seperti threading/sub proses) yang dapat membantu menghandle request yang masuk agar prosesnya lebih cepat sehingga order/request yang masuk lebih cepat diproses/ditangani.
Namun dalam kasus ini, kekurangan dari parallelism ialah untuk menghire pelayan baru membutuhkan cost yang tidak sedikit. Sama halnya dengan program, cost yang dibutuhkan prosesor untuk membuat thread baru sangatlah besar dan sangat membebani kernel space dikarenakan parallelism terjadi di dalam core processor. Kita tidaklah mungkin menyelesaikan setiap request yang masuk secara bersamaan dengan membuat thread baru, karena akan mempengaruhi kecepatan load pada proses yang kita buat. Kalau dengan multicore processor, kita masih mungkin untuk mengeksekusi lebih dari satu thread secara besamaan. Namun, pada single core processor, hal ini jelas tidaklah mungkin. Analogi parallelism yang tadi kita jadikan gambaran untuk kasus ini, meskipun kita memiliki banyak pelayan, akan tetapi jika kita hanya memiliki 1 koki.
Meskipun kita memberi pesanan ke beberapa pelayan (meningkatkan thread atau core cpu), kita tidak bisa memastikan pesanan dapat diproses secara paralel jika hambatan ada pada koki di dapur (I / O atau dunia luar). Karena pelayan satu harus menunggu orderan pelayan lain selesai terlebih dahulu sebelum ordernya bisa diproses.
Salah satu contoh penyelesaian Concurrency secara Higher Level ialah Membuat suatu Thread Pool, dimana pool tersebut mengatur order/request yang akan masuk dan memberi tugas kepada thread yang ada. Order/request tersebut akan ditampung ke dalam pool berbentuk queue sehingga kita tau mana order/proses yang lebih dulu di proses. Kita hanya perlu membuat beberapa thread yang dapat dipakai secara berkali-kali.
Keuntungan menggunakan Thread pool ini ialah kita tidak perlu membuat thread baru untuk membuat proses baru dan lebih fokus mengatur concurrency yang ada sehingga beban yang ditanggung oleh kernel space tidak terlalu berat.