Perbedaan antara eksekusi "bersamaan" dan "paralel"?

107

Apa perbedaan antara istilah eksekusi bersamaan dan paralel ? Saya tidak pernah bisa memahami perbedaannya.

Tag mendefinisikan concurrency sebagai cara menjalankan dua proses secara bersamaan, tetapi saya pikir paralelisme adalah hal yang persis sama, yaitu: utas terpisah atau proses yang berpotensi dijalankan pada prosesor terpisah.

Juga, jika kita mempertimbangkan sesuatu seperti I / O yang tidak sinkron, apakah kita berurusan dengan konkurensi atau paralelisme?

blz
sumber
27
Singkatnya - bersamaan: banyak operasi berbeda terjadi sekaligus. paralel: operasi yang sama dipecah menjadi potongan-potongan kecil yang terjadi sekaligus.
Oded
3
@Oded, saya mengerti apa arti kata-kata itu, tapi saya mengalami kesulitan untuk memahami implikasinya. Apakah Anda memiliki contoh nyata?
blz
7
@ Oded, saya tidak benar-benar setuju dengan Anda, tidak ada dalam definisi mereka (baik umum atau diterapkan untuk pemrograman) melakukan pengertian "bersamaan" dan "paralel" menyebutkan apa pun tentang jumlah atau "ukuran" operasi.
Shivan Dragon
2
@Dilengkapi ketika Anda mengatakan "bit kecil".
Avner Shahar-Kashtan
2
@Oded: Ya, tapi ini tampaknya menjadi akar kesalahpahaman antara Anda dan ShivanDragon.
Avner Shahar-Kashtan

Jawaban:

97

Konkurensi dan paralelisme adalah dua konsep yang terkait tetapi berbeda.

Concurrency berarti, pada dasarnya, bahwa tugas A dan tugas B keduanya harus terjadi secara independen satu sama lain, dan A mulai berjalan, dan kemudian B mulai sebelum A selesai.

Ada berbagai cara untuk mencapai konkurensi. Salah satunya adalah paralelisme - memiliki banyak CPU bekerja pada tugas yang berbeda secara bersamaan. Tapi itu bukan satu-satunya cara. Lain adalah dengan pengalihan tugas, yang bekerja seperti ini: Tugas A bekerja hingga titik tertentu, maka CPU yang bekerja pada itu berhenti dan beralih ke tugas B, bekerja di sana untuk sementara waktu, dan kemudian beralih kembali ke tugas A. Jika irisan waktu cukup kecil, mungkin tampak bagi pengguna bahwa kedua hal itu dijalankan secara paralel, meskipun sebenarnya sedang diproses secara serial oleh CPU multitasking.

Mason Wheeler
sumber
4
Kasus B adalah bagaimana async IO bekerja, bukan?
blz
6
@blz: Benar. Ini juga cara kerja multitasking preemptive. Perbedaan utama adalah bahwa pada async IO, program memutuskan untuk memberikan waktunya dan memberitahu CPU untuk memproses sesuatu yang lain, sedangkan pada preemptive multitasking, jika thread yang berjalan tidak secara sukarela melepaskan CPU setelah cukup lama, OS akan melakukan preempts. saya t.
Mason Wheeler
1
Penjelasan terbaik dijatuhkan
Konrad
@MasonWheeler: Jika kita hanya memiliki 1 CPU, maka kita hanya dapat memiliki Concurrency, tidak ada Paralelisme. Baik? Paralelisme dapat dicapai dengan lebih dari 1 CPU. Baik? Dan jika itu benar dan jika kita hanya memiliki 1 CPU, maka Streaming dari Java 8 tidak ada gunanya.
Anish Mittal
1
Benar tentang beberapa poin pertama. Adapun yang terakhir, apakah paralelisme adalah satu-satunya manfaat yang Anda dapatkan dari Streams? Saya bukan pengembang Java, tetapi kesan saya adalah bahwa Java Streaming kira-kira setara dengan LINQ, dan yang memiliki manfaat nyata dalam ekspresi dan kemudahan pengembangan.
Mason Wheeler
37

Kedua konsep tersebut saling terkait, tetapi berbeda.

Konkurensi berarti bahwa dua atau lebih perhitungan terjadi dalam kerangka waktu yang sama, dan biasanya ada semacam ketergantungan di antara mereka.

Paralelisme berarti bahwa dua atau lebih perhitungan terjadi secara bersamaan.

Singkatnya, konkurensi menggambarkan masalah (dua hal perlu terjadi bersama-sama), sementara paralelisme menggambarkan solusi (dua inti prosesor digunakan untuk menjalankan dua hal secara bersamaan).

Paralelisme adalah salah satu cara untuk mengimplementasikan konkurensi, tetapi itu bukan satu-satunya. Solusi populer lainnya adalah pemrosesan interleaved (alias coroutine): membagi kedua tugas menjadi langkah-langkah atom, dan beralih bolak-balik di antara keduanya.

Sejauh ini contoh paling terkenal dari konkurensi non-paralel adalah cara kerja JavaScript: hanya ada satu utas, dan panggilan balik asinkron apa pun harus menunggu sampai potongan kode sebelumnya selesai dieksekusi. Ini penting untuk diketahui, karena menjamin fungsi apa pun yang Anda tulis adalah atomik - tidak ada panggilan balik yang dapat mengganggu sampai ia kembali. Tetapi itu juga berarti bahwa "loop sibuk" tidak akan berfungsi - Anda tidak dapat mengatur batas waktu dan kemudian loop sampai itu menyala, karena loop akan mencegah callback timeout dari mengeksekusi.

tammmer
sumber
8
Anda mengatakan itu Concurrency means that two or more calculations happen within the same time frame, and there is usually some sort of dependency between them.Tapi pengguna yang menulis jawaban yang diterima mengatakan Concurrency means, essentially, that task A and task B both need to happen independently of each other. Jadi apa kesimpulannya?
nbro
dapatkah Anda menjelaskan mengapa model JavaScript bersamaan? Dari definisi Anda tentang konkurensi, dua atau lebih perhitungan harus terjadi dalam kerangka waktu yang sama. Namun dalam perhitungan JavaScript diurutkan secara berurutan menggunakan satu antrian.
damluar
4
Dengan "dalam kerangka waktu yang sama", saya tidak harus berarti "secara bersamaan", hanya saja kerangka waktu keseluruhan di mana mereka terjadi tumpang tindih. Hal ini dapat dicapai secara paralel (mis. Dua inti prosesor, masing-masing menjalankan salah satu tugas), tetapi juga dapat dicapai dengan membuat serialisasi eksekusi secara lengkap (lakukan tugas 1 terlebih dahulu, ingat hasilnya, lalu lakukan tugas 2, lalu laporkan keduanya) , atau dengan memotong dan menyisipkan potongan. Yang terakhir adalah apa yang dilakukan JS.
tammmer
9

Saya percaya jawaban ini lebih benar daripada jawaban yang ada dan mengeditnya akan mengubah esensinya. Saya telah mencoba menautkan ke berbagai sumber atau halaman wikipedia sehingga orang lain dapat menegaskan kebenaran.


Concurrency: properti suatu sistem yang memungkinkan unit program, algoritma, atau masalah dieksekusi out-of-order atau dalam urutan parsial tanpa mempengaruhi hasil akhir 1 2 .

Contoh sederhana dari ini adalah penambahan berturut-turut:

0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45

Karena sifat komutatif dari tambahan, urutannya dapat diatur ulang tanpa memengaruhi kebenaran; pengaturan berikut akan menghasilkan jawaban yang sama:

(1 + 9) + (2 + 8) + (3 + 7) + (4 + 6) + 5 + 0 = 45

Di sini saya telah mengelompokkan angka menjadi pasangan yang akan berjumlah 10, sehingga memudahkan saya untuk sampai pada jawaban yang benar di kepala saya.

Komputasi Paralel: jenis komputasi di mana banyak perhitungan atau pelaksanaan proses dilakukan secara bersamaan 3 4 . Dengan demikian komputasi paralel memanfaatkan properti konkurensi untuk mengeksekusi banyak unit program, algoritma, atau masalah secara bersamaan.

Melanjutkan dengan contoh penambahan berturut-turut, kita dapat mengeksekusi bagian-bagian berbeda dari jumlah secara paralel:

Execution unit 1:  0 + 1 + 2 + 3 + 4 = 10
Execution unit 2:  5 + 6 + 7 + 8 + 9 = 35

Kemudian pada akhirnya kami menjumlahkan hasil dari setiap pekerja untuk mendapatkan 10 + 35 = 45.

Sekali lagi, paralelisme ini hanya mungkin karena penambahan berturut-turut memiliki sifat konkurensi.

Konkurensi dapat dimanfaatkan oleh lebih dari sekedar paralelisme. Pertimbangkan pre-emption pada sistem single-core: selama periode waktu sistem dapat membuat kemajuan pada beberapa proses yang berjalan tanpa ada yang menyelesaikan. Memang, contoh I / O asinkron adalah contoh umum dari konkurensi yang tidak memerlukan paralelisme.


Kebingungan

Di atas relatif mudah. Saya curiga orang menjadi bingung karena definisi kamus tidak serta-merta cocok dengan yang diuraikan di atas:

  • Bersamaan: terjadi atau ada secara bersamaan atau berdampingan 5 .
  • Konkurensi: fakta dari dua atau lebih peristiwa atau keadaan yang terjadi atau ada pada saat yang sama Dari pencarian di google: "define: concurrency" .

Kamus mendefinisikan "concurrency" sebagai fakta kejadian, sedangkan definisi dalam bahasa sehari-hari adalah properti laten dari suatu program, properti, atau sistem. Padahal terkait hal-hal ini tidak sama.


Rekomendasi Pribadi

Saya merekomendasikan menggunakan istilah "paralel" ketika eksekusi simultan dipastikan atau diharapkan, dan untuk menggunakan istilah "bersamaan" ketika tidak pasti atau tidak relevan jika eksekusi simultan akan digunakan.

Karena itu saya akan menggambarkan simulasi mesin jet pada beberapa core sebagai paralel.

Saya akan menggambarkan Makefiles sebagai contoh konkurensi. Makefiles menyatakan dependensi dari setiap target. Ketika target bergantung pada target lain, ini menciptakan pemesanan parsial. Ketika hubungan dan resep didefinisikan secara komprehensif dan benar, ini membangun properti konkurensi: ada urutan parsial sehingga urutan tugas tertentu dapat diatur ulang tanpa memengaruhi hasilnya. Sekali lagi, konkurensi ini dapat dimanfaatkan untuk membangun beberapa aturan secara bersamaan tetapi konkurensi tersebut adalah properti dari Makefile apakah paralelisme digunakan atau tidak.

Levi Morrison
sumber
6

Eksekusi bersamaan adalah bentuk umum dari eksekusi paralel. Misalnya program paralel juga bisa disebut bersamaan tetapi sebaliknya tidak benar.

  1. Eksekusi bersamaan dimungkinkan pada prosesor tunggal (beberapa utas, dikelola oleh penjadwal)
  2. Eksekusi paralel tidak dimungkinkan pada prosesor tunggal tetapi pada beberapa prosesor. (Satu proses per prosesor)

Untuk detail bacalah makalah penelitian ini Concepts of Concurrent Programming


sumber
1
"Eksekusi paralel tidak dimungkinkan pada prosesor tunggal tetapi pada beberapa prosesor" - selain dari, tentu saja, di mana ada jalur eksekusi paralel dalam prosesor, mis. Sistem yang mengeksploitasi Parallelism Level Instruksi (alias arsitektur "superscalar", misalnya prosesor Intel sejak Pentium, ARM Cortex, dan sebagian besar prosesor high-end lainnya), dan Single Instruction Multiple Data, juga dikenal sebagai arsitektur data-paralel (mis. MMX / SSE / dll). Belum lagi pengaturan eksotis seperti prosesor dataflow, dan sebagainya.
Jules
3

Pemrosesan paralel adalah bagian dari pemrosesan bersamaan.

Pemrosesan serentak menjelaskan dua tugas yang terjadi secara tidak serempak, artinya urutan pelaksanaan tugas tidak ditentukan sebelumnya. Dua utas dapat berjalan secara bersamaan pada inti prosesor yang sama dengan menyisipkan instruksi yang dapat dieksekusi. Misalnya, utas 1 berjalan untuk 10 ms, utas 2 berjalan untuk 10 ms, dll.

Pemrosesan paralel adalah jenis pemrosesan bersamaan di mana lebih dari satu set instruksi dijalankan secara bersamaan. Ini bisa berupa beberapa sistem yang bekerja pada masalah umum seperti dalam komputasi terdistribusi, atau beberapa inti pada sistem yang sama.

ConditionRacer
sumber
0

Pernyataan tdammer mendekati, sisanya adalah semua selain intinya. Dia berkata:

"Sederhananya, konkurensi menggambarkan masalah (dua hal perlu terjadi bersama), sementara paralelisme menggambarkan solusi (dua inti prosesor digunakan untuk menjalankan dua hal secara bersamaan"

Mari kita menganalisis kata-katanya.

Arus berarti terjadi sekarang, aktual, relevan pada saat ini. Con berarti menentang, melawan, tidak menyelaraskan dengan.

Paralel berarti dalam arah yang sama tanpa menyeberang, tanpa berada di jalan masing-masing.

Jadi, konkurensi menyiratkan bersaing untuk sumber daya yang sama. Paralelisme tidak. Proses paralel mungkin menggunakan sumber daya yang sama tetapi tidak dianggap sebagai masalah, itu bukan masalah. Dengan konkurensi, ini adalah masalah yang harus dihadapi.

Martin Maat
sumber
"Arus berarti terjadi sekarang, aktual, relevan pada saat ini. Con berarti menentang, melawan, tidak menyelaraskan dengan." - kutipan diperlukan. Saya sangat meragukan kedua pernyataan ini. Sementara "saat ini" dapat memiliki arti yang disebutkan di sini dalam bahasa Inggris, itu bukan arti yang digunakan dalam kata "bersamaan"
Hulk
1
Saya pikir terjemahan concurrent from Latin adalah "untuk berjalan bersama". Awalan 'con' sering kali berarti bersama , seperti dalam konspirasi (untuk bernafas bersama) konsekuensi (hasil bersama atau mengikuti) menyimpulkan (berdekatan) dll. Ini adalah sisi bahasa yang menjengkelkan bahwa sesuatu dapat memiliki makna yang berlawanan, sanksi adalah contoh favorit saya .
@no comprende Dalam hal ini (saat ini) berjalan bersama makna tampaknya lebih cocok. Karena tidak ada pro-saat ini ... Dalam bahasa Belanda, konkuren adalah kata benda yang berarti pesaing. Keberanian adalah hal biasa, bergerak di sekitar Anda. Itu juga koran. Sesuatu yang aktif sekarang. "Rekening courant" adalah akun berjalan. Saya merasa konkurensi menyiratkan con (!) Conict. Perebutan sumber daya yang sama. Berjalan di ruang yang sama. Mungkin karena makna Belanda (pesaing).
Martin Maat
Apa yang akan Dijkstra katakan, saya ingin tahu?
-1

Jelas, istilah tersebut digunakan secara berbeda dalam budaya yang berbeda.

Pemahaman saya adalah sebagai berikut:

Paralelisme adalah cara untuk mempercepat pemrosesan. Apakah Anda melakukan perkalian matriks pada satu inti, pada banyak inti atau bahkan dalam GPU, hasilnya sama (atau program Anda rusak). Itu tidak menambahkan fungsionalitas baru ke beberapa program, hanya kecepatan.

Sedangkan concurrency adalah tentang hal-hal yang tidak bisa Anda lakukan secara berurutan. Misalnya, melayani 3 halaman web yang berbeda secara bersamaan untuk 3 klien, sambil menunggu permintaan berikutnya. (Meskipun Anda dapat mensimulasikan ini sampai taraf tertentu melalui interleaving, seperti yang dilakukan di masa lalu.) Perhatikan bahwa perilaku program bersamaan tidak bersifat deterministik. Misalnya tidak jelas, mana dari 3 klien yang akan dilayani terlebih dahulu. Anda dapat menjalankan beberapa tes dan mendapatkan hasil yang berbeda setiap kali mengenai pesanan permintaan akan selesai. Sistem run-time harus menjamin bahwa a) semua klien akan dilayani dan b) dalam jumlah waktu yang wajar.

Biasanya, kuda kerja dari komputasi paralel tidak menyadari, juga tidak peduli, paralelisme. Sementara tugas bersamaan seringkali secara eksplisit menggunakan komunikasi antar-proses atau antar-benang - seperti memblokir antrian, sinkronisasi dan mekanisme penguncian.

Ingo
sumber
-1

Menurut pendapat saya, dari perspektif pemrograman aplikasi tidak ada perbedaan antara dua konsep ini dan memiliki dua kata membingungkan untuk kebingungan. Saya pikir interleaving thread dilakukan untuk mensimulasikan pemrosesan multicore kembali pada hari-hari ketika multicore tidak mungkin. Mengapa kita punya kata untuk pola pikir usang ini?

Mason Wheeler dan Penguin telah memberikan jawaban yang sama. Satu Core dengan pengalihan tugas dan atau multicore bersamaan, multicore = paralel.

Pendapat saya adalah bahwa kedua istilah ini harus digabungkan menjadi satu dan saya berusaha untuk menghindari mengatakan "bersamaan". Saya kira pada level pemrograman OS perbedaannya penting, tetapi dari sudut pandang programmer aplikasi itu tidak terlalu penting. Saya telah menulis mapReduce, Spark, MPI, cuda, openCL, dan multithreaded c ++ dan saya tidak pernah berhenti dan berpikir jika pekerjaan itu berjalan dengan benang yang disisipkan atau dengan beberapa inti.

Misalnya, ketika saya menulis multithreaded c ++ kadang-kadang saya tidak yakin berapa banyak core yang akan saya dapatkan, meskipun ada cara untuk membuat permintaan pada berapa banyak core yang Anda dapatkan seperti yang dijelaskan di sini https://stackoverflow.com/questions/2166425/ bagaimana-untuk-struktur-ac-aplikasi-untuk menggunakan-prosesor-multicore . Dalam percikan saya hanya melakukan pemetaan dan mengurangi operasi dan tidak tahu bagaimana jvm menangani mereka pada tingkat perangkat keras. Pada GPU saya pikirsetiap utas ditugaskan untuk prosesor sederhana itu sendiri, tetapi saya selalu menyinkronkan utas saya di mana pun masalah mungkin muncul. Dengan MPI, komunikasi antara mesin ditentukan secara eksplisit, tetapi kita dapat melakukan interleave fungsi yang berjalan pada beberapa mesin pada inti tunggal dan menggabungkan hasilnya melalui fungsi ulir tunggal yang sesuai. Dan bagaimana jika kita menggunakan MPI untuk mengoordinasikan sekelompok mesin inti tunggal, masing-masing dengan multithreading? Apa bedanya? Saya tidak akan mengatakan apa-apa. Sebut semuanya "paralel" dan selesai dengan itu.

Julian Cienfuegos
sumber
2
Perbedaannya masih relevan sampai sekarang. Anda hanya dapat memiliki paralelisme hingga jumlah inti CPU yang dimiliki perangkat keras Anda, namun banyak program memiliki ratusan perhitungan bersamaan yang terjadi sekaligus, jauh lebih banyak daripada jumlah inti yang dimiliki perangkat keras. Kegagalan untuk memahami perbedaan ini dapat menyebabkan programmer gagal memahami mengapa program paralel mereka berjalan lebih lambat dari versi single threaded mereka (atau sejumlah kecil thread).
Lie Ryan