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?
Jawaban:
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.
sumber
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.
sumber
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 mengatakanConcurrency means, essentially, that task A and task B both need to happen independently of each other
. Jadi apa kesimpulannya?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:
Karena sifat komutatif dari tambahan, urutannya dapat diatur ulang tanpa memengaruhi kebenaran; pengaturan berikut akan menghasilkan jawaban yang sama:
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:
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:
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.
sumber
Eksekusi bersamaan adalah bentuk umum dari eksekusi paralel. Misalnya program paralel juga bisa disebut bersamaan tetapi sebaliknya tidak benar.
Untuk detail bacalah makalah penelitian ini Concepts of Concurrent Programming
sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber