Memberantas Kesesatan Dalam Concurrency Design

oky saputraoky saputra
5 min read

Berawal dari kesesatan saya tentang konsep concurrency, saya melakukan tapa di gunung puntang, dan berakhir mendapatakan wahyu dari talk bapak Rob Pike.
Tulisan ini hanya hasil terjemahan pribadi terkait dari presentasi bapak rob pike tentang concurrency untuk sumbernya bisa di lihat di sini :
- video
- slide

Concurrency vs Parallelism

Concurrency adalah :

  • "Programming as the composition of independently execution process"

  • Proses yang di maksud adalah proses secara umum, bukan linux process

kalau di bahasa indonesia, concurrency adalah "cara memprogram yang tersusun dari proses eksekusi yang independent"

Parallelism adalah :

  • "Programming as the simultaneous execution of (possibly related) computations."

kalau di bahasa indonesia, parallelism adalah "cara memprogram dimana eksekusi dari sebuah komputasi berjalan secara serentak (simultaneous), bisa saling terkait atau tidak "

kata bapak rop pike :

  • "Concurrency is about dealing with a lot of things at once"

  • "Parallelism is about doing a lot of things at once"

  • "Concurrency is about structure, parallelism is about execution."

  • "Concurrency provides a way to structure a solution to solve a problem that may(but not necessarily) be parallelizable"

Kalau kita bahasa indonesia :

  • "Konkurensi adalah tentang menangani banyak hal sekaligus"

  • "Paralelisme adalah melakukan banyak hal sekaligus" Yang membedakan dari ke-dua hal di atas adalah "menangani banyak hal" & "melakukan banyak hal" tetap persamanya adalah sama-sama dalam satu waktu. Jadi concurrency itu tentang struktur (menyusun), parallelism itu tentang eksekusi (pelaksanaan)

Jadi Concurrency itu menyediakan cara untuk menyusun sebuah solusi untuk menyelesaikan sebuah masalah yang bisa saja secara bersamaan (parallel) bisa juga tidak

Concurrency + communication

kata bapak C. A. R. Hoare di paper-nya yang berjudul "Communicating Sequential Processes (CACM 1978)" :

  • "concurrency is a way to structure a program by breaking it into pieces that can be executed independently"

  • "communication is the mean to coordinate the independent executions"

Agar concurrency bisa berfungsi kita membutuhkan communication, karena hasil dari pekerjaan yang di pecah ke dalam banyak bagian dan di kerjakan secara independen butuh di satukan, di sinilah communication di butuhkan untuk menyatukan hasil pekerjaan tersebut.

Simulasi Masalah

Berikut akan di gambarkan tentang masalah yang akan di selesaikan dengan concurrency & parallelizm

Single Gopher

  • Disini kita melihat 1 gopher memindahkan tumpukan ke pembakaran, karena hanya ada satu gopher akan membutuhkan waktu yang sangat lama untuk menyelesaikanya

More gophers!

  • lalu kita tambah 1 gopher lagi, jadi ada 2 gopher, tetapi ini tidak akan membantu, karena gopher yang kedua membutuhkan alat (keranjang) untuk memindahkan tumpukan ke pembakaran

More gophers and more carts

  • dengan begini, kita memberi 2 gopher keranjang akan mempercepat untuk menyelesaikan tumpukan pindah ke pembakaran

  • tetapi di sini kita punya masalah, kita harus melakukan sinkronisasi terhadap 2 gopher tersebut agar tidak saling berebut tumpukan, oleh karena itu kita butuh komunikasi

  • metode komunikasi nya dengan mengunakan message

Double everything

  • dengan membagi tumpukan menjadi 2 kita menghindarkan gopher saling berebut tumpukan buku

  • eksekusi pasti akan menjadi jauh lebih cepat

  • di sini akan ada 2 buku yang pindahkan secara bersamaan, ini bisa kita sebut parallel

Concurrent composition

  • apakah penyelesaian masalah diatas benar parallel ? jawabnya, tergantung

  • bagaimana jika hanya satu gopher yang bergerak dalam satu waktu ? jawabnya, ini berjalan secara konkuren, tetapi tidak pararel

  • namun, masalah di atas bisa diparallelkan secara otomatis

  • setelah memahami solusi di atas coba kita gunakan model yang lain untuk menyelesaikan masalah di atas

Another design

  • ketiga gopher diatas, akan bekerjasama, tetapi bisa ada ada kemungkinan penundaan pekerjaan, karena gopher 2 harus mengembalikan keranjang kosong ke gohper 1

  • tetapi ke-3 gopher bisa menyatukan pekerjanya dengan koordinasi (komunikasi)

Finer-grained concurrency

  • sekarang kita tambahkan 1 gopher lagi yang pekerjanya hanya mengembalikan keranjang yang kosong

  • ke 4 gopher akan bekerja untuk solusi yang lebih baik, masing-masing melakukan satu tugas sederhana

  • jika kita mengatur ke 4 gopher melakukan pekerjaan dengan benar (tidak masuk akal tetapi bukan tidak mungkin), pekerjaan jadi 4x lebih cepat dari design awal

Observation

  • pada kasus di atas kita meningkatkan performance dengan menambahkan concurrent procedure

  • lebih banyak gopher yang melakukan pekerjaan, pekerjaan tersebut berjalan lebih baik

Concurrent procedures

Di atas ada 4 prosedur (pekerjaan) yang berbeda di lakukan oleh gopher

  1. memuat buku kedalam keranjang

  2. memindahkan keranjang ke tempat pembakaran

  3. membongkar tumpukan dari keranjang untuk di masukan ke pembakaran

  4. mengembalikan keranjang yang kosong

disini kita lihat masing-masing prosedur berjalan secara independent untuk menyelesaikan masalah di atas dan bisa saja Masing-masing tadi berjalan secara parallel

More parallelization!

  • disini kita akan membuat solusinya menjadi lebih parallel kita gandakan solusi sebelumnya sehingga menjadi 8 gopher

  • kesimpulanya ketika kita sudah memahami konsep concurrency dengan baik, kita bisa mengoptimalkan solusi tersebut dengan membuatnya menjadi parallel

Or maybe not parallelization at all

  • kita lihat gambar di atas, bisa saja kita tidak perlu menambahkan parallelism, bayangkan hanya ada 1 gopher yang melakukan semua pekerjaan diatas

  • tetapi tetap solusi di atas itu benar secara konsep concurrency

Another Design

  • di atas adalah design yang berbeda untuk solusi dari masalah sebelumnya

  • disini kita melihat ada sekumpulan gopher yang menumpuk buku untuk di consume oleh gopher yang lain agar bisa di bawa ke tempat pembakaran

  • cara ini juga benar secara concurrency

Lesson

  • jadi sebetulnya banyak cara untuk memecah proses

  • cara memecah proses itulah yang di sebut concurrent design

  • begitu kita berhasil memecah proses tersebut (concurrent desing) dan menjalankan secara parallel, ketika terjadi kegagalan pada parallelization, kita mudah untuk membetulkanya

Back to Computing

Pada masalah di atas, bisa kita ibaratkan sebagai berikut :

  • tumpukan buku => content web

  • gopher => CUP

  • keranjang => marshaling, rendering, atau networking

  • tempat pembakaran => proxy, browser, atau consumer dengan begini GO bisa menjadi solusi untuk concurrent desing pada web services yang skalabel untuk melayani web kontent

0
Subscribe to my newsletter

Read articles from oky saputra directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

oky saputra
oky saputra