Pendahuluan

Berikut penjelasan awal tentang Thread .

Tentang Concurrency .

Tentang Paralelism .

Jadi Thread secara sederhana adalah :

bagian eksekusi sebuah proses yang bisa dijalankan terpisah.

Sementara Concurrency, berarti :

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

Dan Paralelism, berarti :

beberapa core CPU dapat memproses banyak Thread secara “benar-benar” bersamaan, atau pada waktu yang sama.


Concurrency vs Paralelism


Concurrency dan Paralelism sebenarnya sudah berbeda dari definisinya sendiri.

Concurrency adalah mengenai banyak task yang dijalankan “seakan-akan” bersamaan oleh satu core CPU.

Sementara Paralelism adalah mengenai Concurrency yang dijalankan pada banyak core CPU.

Sehingga akan ada kemungkinan bahwa beberapa task akan “benar-benar” dijalankan bersamaan dan pada waktu yang sama oleh banyak core CPU.

Tetapi tentunya, secara “benar-benar” bersamaan ini tidak semua Thread yang ada, karena Thread yang ada biasanya lebih banyak dibandingkan jumlah Core CPU yang ada.

Concurrency dan Paralelism pada akhirnya akan bermuara pada ukuran-ukuran metriks untuk performansi, seperti :

  • CPU Utilization, bagaimana membuat semua core CPU sibuk dan memproses sebanyak mungkin instruksi yang dibutuhkan.
  • Throughput, yaitu ukuran berapa banyak proses/thread yang selesai dilakukan CPU dalam satu unit waktu.
  • Turnaround time, yaitu ukuran berapa lama sebuah proses dieksekusi.
  • Waiting time, yaitu berapa lama sebuah proses menunggu di antrian CPU scheduling agar bisa dijalankan.
  • dll

Bagi yang mau melihat sisi performansi dari sebuah proses, maka istilah-istilah diatas menjadi patokan dalam menganalisa sebuah code program atau arsitektur sebuah teknologi.


Paralelism tanpa Concurrency ?


Paralelism sepertinya hampir selalu dikaitkan dengan Concurrency.

Atau istilahnya Paralelism dianggap sebagai superset dari Concurrency.

Atau Paralelism dianggap sebagai Concurrency di level multi core CPU.

Sementara Concurrency adalah di level single core CPU.

Tetapi apakah Paralelism bisa terjadi juga tanpa Concurrency ?

Hmm, secara konsep bisa saja.

Misalnya case :

  • Algoritma yang memakai konsep Divide And Conquer seperti Merge Sort, yang memecah deretan object menjadi bagian kecil, lalu dimerge. secara natual, bagian-bagian kecil tersebut bisa diassign ke unit Thread yang berbeda di core yang berbeda pada saat yang bersamaan. Tentunya dengan kebutuhan untuk efektifitas. Tidak diperlukan concurrency di sini. Walaupun bisa saja kita membuat Concurrency di level core CPU kalau ternyata kita tidak punya multicore CPU.

  • Kasus algoritma fungsional memakai fungsi parallelStream, di Java 8. Kita bahas di Java Fungsional Reduce.

Contohnya sbb :

 1import java.util.List;
 2
 3public class DemoReduce {
 4
 5	public static void main(String[] args) {
 6
 7      List<Integer> nilaiMahasiswa = List.of(80,65,76,10);
 8
 9      Integer minValue = nilaiMahasiswa
10			             .parallelStream()
11			             .reduce(3, (a, b) -> a + b);
12      System.out.println(minValue);
13	}
14}

Hasilnya :

243
Mestinya hasil yang benar adalah 234 , sementara dengan parallelStream : 243, berbeda 9 angka.

Bagaimana penjelasannya ?

Ok, ParallelStream berarti fungsi aggregasi yang kita definisikan akan di jalankan di thread yang berbeda, sebanyak core CPU yang komputer kita miliki.

Coba kita lihat yang terjadi untuk ParallelStream dengan 4 core, adalah :

CPU core pertama -->  3 (identity) + 80 (data pertama) = 83
CPU core kedua   -->  3 (identity) + 65 (data kedua) = 68
CPU core ketiga  -->  3 (identity) + 76 (data ketiga) = 79
CPU core keempat -->  3 (identity) + 10 (data keempat) = 13

--> Hasil : 243

Akumulasi --> (83 + 68 + 79 + 13) = 243

Kelihatan kalau setiap core akan memproses dengan caranya sendiri.


Concurrency tanpa Paralelism ?


Concurrency tanpa Paralelism tentu saja bisa terjadi, di komputer yang hanya punya satu core CPU.


Sebuah proses tanpa Concurrency dan juga tanpa Paralelism ?


Tentu saja bisa..

Sebuah program kecil yang cuma penambahan angka saja, tidak perlu misalnya dipecah menjadi banyak task/thread, tidak butuh Concurrency, apalagi Paralelism.

Atau program kecil yang cuma beberapa instruksi saja dan dianggap sebagai sebuah Thread saja.


Sekiaan…