Concurrency memiliki dua tugas yang berjalan secara paralel pada utas yang terpisah. Namun, metode asinkron berjalan secara paralel tetapi pada 1 utas yang sama. Bagaimana ini dicapai? Juga, bagaimana dengan paralelisme?
Apa perbedaan antara ketiga konsep ini?
multithreading
asynchronous
concurrency
GurdeepS
sumber
sumber
Jawaban:
Bersamaan dan paralel secara efektif adalah prinsip yang sama seperti yang Anda duga dengan benar, keduanya terkait dengan tugas yang dieksekusi secara bersamaan meskipun saya akan mengatakan bahwa tugas paralel harus benar-benar multitasking, dieksekusi "pada saat yang sama" sedangkan bersamaan dapat berarti bahwa tugas tersebut berbagi thread eksekusi sementara masih tampak mengeksekusi secara paralel.
Metode asinkron tidak secara langsung terkait dengan dua konsep sebelumnya, asinkron digunakan untuk menyajikan kesan penugasan serentak atau paralel, tetapi secara efektif pemanggilan metode asinkron biasanya digunakan untuk proses yang perlu melakukan pekerjaan jauh dari aplikasi saat ini dan kami tidak tidak ingin menunggu dan memblokir aplikasi kami menunggu tanggapan.
Misalnya, mendapatkan data dari database bisa memakan waktu tetapi kami tidak ingin memblokir UI kami menunggu data. Panggilan async mengambil referensi panggilan balik dan mengembalikan eksekusi ke kode Anda segera setelah permintaan ditempatkan dengan sistem jarak jauh. UI Anda dapat terus merespons pengguna saat sistem jarak jauh melakukan pemrosesan apa pun yang diperlukan, setelah mengembalikan data ke metode panggilan balik Anda, maka metode itu dapat memperbarui UI (atau menyerahkan pembaruan itu) yang sesuai.
Dari perspektif Pengguna, ini tampak seperti multitasking tetapi mungkin tidak.
EDIT
Mungkin perlu ditambahkan bahwa dalam banyak implementasi pemanggilan metode asinkron akan menyebabkan utas diputar, tetapi itu tidak penting, itu benar-benar tergantung pada operasi yang dijalankan dan bagaimana respons dapat diberitahukan kembali ke sistem.
sumber
Pendeknya,
Concurrency berarti banyak tugas yang memulai, menjalankan, dan menyelesaikan dalam periode waktu yang tumpang tindih, tanpa urutan tertentu. Paralelisme adalah ketika beberapa tugas ATAU beberapa bagian dari tugas unik benar-benar berjalan pada saat yang sama, misalnya pada prosesor multi-core.
Perbedaan antara konkurensi vs paralelisme
Sekarang mari kita buat daftar perbedaan yang luar biasa antara konkurensi dan paralelisme.
Concurrency adalah ketika dua tugas dapat mulai, dijalankan, dan selesai dalam periode waktu yang tumpang tindih. Paralelisme adalah ketika tugas secara harfiah dijalankan pada saat yang sama, misalnya. pada prosesor multi-core.
Concurrency adalah komposisi dari proses yang dieksekusi secara independen, sementara paralelisme adalah eksekusi simultan dari (kemungkinan terkait) perhitungan.
Concurrency adalah tentang berurusan dengan banyak hal sekaligus. Paralelisme adalah tentang melakukan banyak hal sekaligus.
Suatu aplikasi dapat bersamaan - tetapi tidak paralel, yang berarti bahwa ia memproses lebih dari satu tugas pada saat yang sama, tetapi tidak ada dua tugas yang dijalankan pada saat yang bersamaan.
Suatu aplikasi dapat paralel - tetapi tidak bersamaan, yang berarti bahwa ia memproses beberapa tugas sub-tugas dalam CPU multi-core pada saat yang bersamaan.
Suatu aplikasi bisa tidak paralel - atau bersamaan, yang berarti bahwa ia memproses semua tugas satu per satu, secara berurutan.
Suatu aplikasi dapat bersifat paralel - dan bersamaan, yang berarti bahwa ia memproses banyak tugas secara bersamaan dalam multi-core CPU secara bersamaan.
Konkurensi
Paralelisme
Metode asinkron
sumber
Konkurensi adalah ketika eksekusi beberapa tugas disisipkan, alih-alih setiap tugas dieksekusi secara berurutan.
Paralelisme adalah ketika tugas-tugas ini sebenarnya dieksekusi secara paralel.
Asynchrony adalah konsep yang terpisah (meskipun terkait dalam beberapa konteks). Ini merujuk pada fakta bahwa satu peristiwa mungkin terjadi pada waktu yang berbeda (tidak sinkron) dengan peristiwa lain. Diagram di bawah ini mengilustrasikan apa perbedaan antara eksekusi sinkron dan asinkron, di mana para aktor dapat berhubungan dengan berbagai utas, proses, atau bahkan server.
sumber
Setiap orang mengalami kesulitan untuk mengaitkan asinkron dengan paralelisme atau konkurensi karena asinkron bukan merupakan antonim terhadap paralel atau konkuren. Ini adalah antonim dari Sinkron. Yang hanya menunjukkan jika sesuatu, dalam hal ini utas, akan disinkronkan dengan yang lain, dalam hal ini utas lainnya.
sumber
Ada beberapa skenario di mana konkurensi dapat terjadi:
Asynchrony - Ini berarti program Anda melakukan operasi non-pemblokiran. Misalnya, ia dapat memulai permintaan untuk sumber daya jarak jauh melalui HTTP dan kemudian melanjutkan untuk melakukan beberapa tugas lain sambil menunggu respons diterima. Ini seperti ketika Anda mengirim email dan kemudian melanjutkan hidup Anda tanpa menunggu jawaban.
Paralelisme - Ini berarti bahwa program Anda memanfaatkan perangkat keras mesin multi-core untuk menjalankan tugas secara bersamaan dengan memecah pekerjaan menjadi tugas, yang masing-masing dieksekusi pada inti yang terpisah. Ini seperti bernyanyi di kamar mandi: Anda sebenarnya melakukan dua hal pada waktu yang bersamaan.
Multithreading - Ini adalah implementasi perangkat lunak yang memungkinkan berbagai utas dijalankan secara bersamaan. Program multithreaded tampaknya melakukan beberapa hal pada saat yang sama bahkan ketika itu dijalankan pada mesin single-core. Ini agak seperti mengobrol dengan orang yang berbeda melalui berbagai jendela IM; meskipun sebenarnya Anda bolak-balik, hasilnya adalah Anda melakukan banyak percakapan sekaligus.
sumber
Dari http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html
sumber
Paralel:Ini adalah istilah luas yang berarti bahwa dua potong kode mengeksekusi itu "pada saat yang sama". Tidak masalah apakah itu paralelisme "nyata" atau jika dipalsukan melalui beberapa pola desain yang cerdas. Intinya adalah bahwa Anda dapat memulai "tugas" pada saat yang sama dan kemudian mengendalikannya secara terpisah (dengan mutex dan semua trik yang sesuai). Tetapi biasanya Anda lebih suka menggunakan kata "paralel" hanya untuk paralelisme "benar", seperti pada: Anda mewujudkannya melalui multitasking non-kooperatif (baik melalui inti CPU / GPU, atau hanya pada tingkat perangkat lunak dengan membiarkan OS mengelolanya. pada level yang sangat rendah). Orang enggan mengatakan "paralel" hanya untuk kode sekuensial rumit yang memalsukan paralelisme, seperti yang akan Anda temukan di javascript jendela browser misalnya. Karenanya alasan mengapa orang di utas ini mengatakan "asinkron tidak ada hubungannya dengan paralelisme". Ya, tapi jangan membingungkan mereka.
Bersamaan: tidak mungkin ada konkurensi tanpa paralelisme (apakah disimulasikan atau nyata, seperti yang saya jelaskan di atas), tetapi istilah ini berfokus secara khusus pada kenyataan bahwa kedua sistem akan mencoba mengakses sumber daya yang sama pada saat yang sama di beberapa titik. Ini menekankan pada fakta bahwa Anda harus menghadapinya.
Asinkron : semua orang benar dengan mengatakan bahwa asinkron tidak terkait dengan paralelisme, tetapi membuka jalan untuk itu (beban ada pada Anda untuk membuat segala sesuatu paralel atau tidak - terus membaca).
"Asinkron" mengacu pada representasi paralelisme yang memformalkan tiga hal dasar yang biasanya terlibat dalam paralelisme: 1) menentukan inisialisasi tugas (katakan kapan dimulai dan parameter apa yang didapat), 2) apa yang harus dilakukan setelah selesai dan 3) Kode apa yang harus terus dilakukan di antara.
Tapi itu masih hanya sintaks (biasanya direpresentasikan sebagai metode panggilan balik). Di belakang layar, sistem yang mendasarinya mungkin hanya memutuskan bahwa apa yang disebut "tugas" hanyalah potongan-potongan kode untuk ditumpuk sampai selesai kode yang sedang dieksekusi. Dan kemudian ia melepaskan mereka satu per satu dan mengeksekusi mereka secara berurutan. Atau tidak. Mungkin juga membuat utas per tugas dan menjalankannya secara paralel. Siapa peduli? Bagian itu tidak termasuk dalam konsep;)
sumber
Ada sedikit semantik untuk dihapus di sini:
Konkurensi atau Paralelisme adalah masalah pertentangan sumber daya , sedangkan Asynchronous adalah tentang aliran kontrol .
Prosedur yang berbeda (atau operasi penyusunnya ) disebut Asynchronous, ketika tidak ada implementasi deterministik dari urutan pemrosesan mereka ; dengan kata lain, ada kemungkinan bahwa salah satu dari mereka dapat diproses pada waktu tertentu T. Menurut definisi, banyak prosesor (mis. CPU atau Orang) memungkinkan beberapa dari mereka untuk diproses pada waktu yang sama; pada satu prosesor, pemrosesan mereka disisipkan (mis. Utas).
Prosedur atau operasi asinkron disebut sebagai Bersamaan, ketika mereka berbagi sumber daya ; Konkurensi adalah kemungkinan pertikaian yang pasti pada waktu tertentu T. Paralelisme dijamin sepele ketika tidak ada sumber daya yang dibagikan (mis. Prosesor dan penyimpanan yang berbeda); jika tidak, kontrol Concurrency harus ditangani.
Karenanya prosedur atau operasi Asynchronous dapat diproses secara Paralel atau Bersamaan dengan yang lain.
sumber
Concurrency berarti menjalankan beberapa tugas pada saat yang bersamaan tetapi tidak harus secara bersamaan. Ketika Anda harus melakukan lebih dari satu tugas tetapi Anda memiliki satu sumber daya maka kami pergi untuk konkurensi. Dalam lingkungan inti tunggal concurrency dicapai dengan Context Switching.
Paralelisme adalah seperti melakukan lebih dari satu tugas secara bersamaan seperti Anda bisa bernyanyi dan mandi bersama. Sekarang Anda melakukan tugas secara Paralel.
Asynchronous adalah sesuatu yang terkait dengan eksekusi ulir dalam model asinkron ketika satu tugas dijalankan, Anda bisa beralih ke tugas yang berbeda tanpa menunggu yang sebelumnya selesai.
Pemrograman asinkron membantu kita mencapai konkurensi. Pemrograman asinkron dalam lingkungan multi-utas adalah cara untuk mencapai paralelisme.
sumber
"Sinkronisasi dan async adalah model pemrograman. Bersamaan dan paralel adalah cara tugas dijalankan ...". Sumber: https://medium.com/better-programming/sync-vs-async-vs-concurrent-vs-parallel-5754cdb60f66
Dengan kata lain, sinkronisasi dan async menjelaskan bagaimana program Anda dieksekusi ketika membuat panggilan fungsi (akankah ia menunggu atau akankah itu melanjutkan eksekusi?), Sementara secara bersamaan dan paralel menggambarkan bagaimana suatu fungsi (tugas) akan dieksekusi (concurrent = mungkin dieksekusi pada pada saat yang sama, paralel = dijalankan secara efektif pada saat yang sama).
sumber
CONCURRENCY VS PARALLELISM: concurrency pada satu titik waktu hanya satu tugas yang dapat dilakukan. contoh: paralelisme prosesor cpu tunggal pada satu titik kita bisa melakukan banyak tugas. contoh: prosesor dual core atau multi core
sumber
Di sini saya jelaskan dengan beberapa contoh
Paralelisme
Sebuah GPU menggunakan pemrosesan paralel untuk memproses blok kode yang sama (AKA kernel ) pada ribuan benang fisik dan logis. Idealnya, proses dimulai dan diakhiri untuk semua utas secara bersamaan. Sebuah inti CPU tunggal tanpa hyperthreading tidak dapat melakukan pemrosesan paralel.
Catatan: Saya katakan idealnya karena ketika Anda menjalankan kernel dengan ukuran panggilan 7M pada perangkat keras dengan utas 6M, ia harus menjalankan dua kali menjalankan kode yang sama pada semua utas 6M secara paralel sambil mengonsumsi semua utas 6M setiap kali.
Catatan: Paralelisme tidak terbatas pada GPU.
Konkurensi
Layanan web menerima banyak permintaan kecil secara waktu nyata dan perlu menangani setiap permintaan ini secara berbeda, kapan saja, dan terlepas dari permintaan lain atau pekerjaan internal apa pun. Namun Anda ingin layanan web tetap beroperasi setiap saat tanpa merusak kondisi data atau kesehatan sistem.
Bayangkan saja pengguna memperbarui catatan dan pengguna lain menghapus catatan yang sama pada saat yang sama.
Catatan : Permintaan ini biasanya menggunakan beberapa sumber daya penting seperti memori, koneksi database atau bandwidth. Namun Anda ingin layanan web menjadi responsif setiap saat. Asynchronous adalah kunci untuk membuatnya responsif , bukan konkurensi
Tidak sinkron
Satu proses berat (seperti operasi I / O) dapat dengan mudah memblokir GUI jika dijalankan pada utas GUI. Untuk menjamin respons UI , proses yang berat dapat dijalankan secara tidak sinkron. Lebih baik menjalankan operasi async yang sama satu per satu . mis. beberapa operasi IO-terikat dapat secara signifikan lebih lambat jika dijalankan pada saat yang sama, jadi lebih baik untuk mengantri mereka selesai untuk memulai
Catatan: operasi async yang dijalankan secara bersamaan (yaitu lebih dari satu kali dalam satu waktu) adalah operasi bersamaan.
Catatan: Konkurensi dan asinkron sering membingungkan satu sama lain. Concurrency mengacu pada bagian berbeda dari sistem yang bekerja bersama tanpa mengganggu satu sama lain (masalah ini sering diselesaikan dengan kunci, semafor atau mutex). Asynchronousy adalah bagaimana Anda mencapai daya tanggap (seperti threading).
* Catatan: Asynchronous dan Multithreading sering bingung satu sama lain. Kode asinkron tidak selalu melibatkan utas baru. itu bisa berupa operasi perangkat keras atau sebagaimana Stephan menyebutnya operasi murni, baca ini
misalnya dalam kode WPF + C # di bawah ini,
await Task.Run(()=> HeavyMethod(txt))
sedang memecahkan masalah asinkron, sementaratextBox.Dispatcher.Invoke
memecahkan masalah konkurensi:sumber
Saya akan membuatnya singkat dan menarik untuk membungkus kepala Anda di sekitar konsep-konsep ini.
Bersamaan vs Paralel - Cara tugas dieksekusi.
Synchronous vs. Asynchronous - Model-model pemrograman.
sumber