Ketika melihat pemrograman konkuren, dua istilah yang umum digunakan yaitu konkuren dan paralel.
Dan beberapa bahasa pemrograman secara khusus mengklaim dukungan untuk pemrograman paralel, seperti Java .
Apakah ini berarti pemrograman paralel dan konkuren sebenarnya berbeda?
terminology
parallel-computing
concurrency
nish1013
sumber
sumber
Jawaban:
Dari "A Sophomoric ∗ Pengantar Paralelisme dan Memori Bersama-Memori Bersama" oleh Dan Grossman (versi 16 November 2013)
sumber
Selain jawaban Nish, izinkan saya merekomendasikan buku Simon Marlow tentang Pemrograman Paralel dan Bersamaan di Haskell atau tutorialnya yang lebih pendek . Mereka menjawab pertanyaan pertama Anda dari perspektif Haskell, sehingga mereka bisa lebih cocok untuk pembaca yang cenderung secara teoritis (Haskell adalah murni bahasa pemrograman yang malas dan fungsional, yang jauh lebih dekat dengan Matematika daripada bahasa lain).
Mengutip dari sana:
Saya merekomendasikan membaca sisanya dalam tutorial (hal.4), tetapi izinkan saya mengutip beberapa bagian lain dari bagian ini, karena ini menghubungkan kedua paradigma pemrograman dengan karakteristik kuantitatif dan kualitatif dari program, seperti efisiensi, modularitas, dan determinisme.
sumber
Conurrency dan paralelisme berbeda dalam masalah yang mereka pecahkan dan sebabkan, tetapi mereka tidak independen.
Konkurensi
Menjalankan dua tugas secara bersamaan berarti bahwa langkah-langkah individual dari kedua tugas dijalankan secara interleaved. Jika Anda mengabaikan paralelisme, Anda dapat mengasumsikan bahwa hanya satu pernyataan yang dieksekusi pada suatu titik waktu, tetapi Anda (a priori) tidak memiliki jaminan tugas mana yang dapat dijalankan untuk langkah selanjutnya.
Ini berguna dalam beberapa hal:
Beberapa tantangan utama adalah:
Paralelisme
Menjalankan dua tugas secara paralel berarti bahwa pernyataan dieksekusi pada saat yang sama . Ini terutama berguna untuk:
Tantangan utama meliputi:
Lihat juga pertanyaan ini untuk membedakan komputasi paralel dan terdistribusi.
sumber
Jawaban yang sedikit ideal, mungkin ...
Concurrency adalah properti dari bagaimana suatu program ditulis . Jika suatu program ditulis menggunakan konstruksi seperti fork / join, kunci, transaksi, operasi perbandingan-dan-pertukaran atom, dan sebagainya, maka itu bersamaan.
Paralelisme adalah properti dari bagaimana suatu program dijalankan . Jika suatu program dieksekusi pada lebih dari satu unit komputasi secara bersamaan, maka ia dijalankan secara paralel.
sumber
Ada banyak jawaban untuk ini, tetapi bisa membingungkan. Saya suka berpikir seperti ini, dan mungkin itu membantu ?:
Pemrograman bersamaan adalah kode yang tidak peduli dengan urutan eksekusi. Java adalah bahasa yang buruk untuk pemrograman bersamaan, tetapi ada perpustakaan dan kerangka kerja untuk membantu. JavaScript adalah bahasa yang sangat baik untuk pemrograman bersamaan, dan seringkali sulit ketika Anda ingin menulis sesuatu yang tidak bersamaan (misalnya, jika Anda ingin memaksakan urutan eksekusi). Pemrograman bersamaan sangat bagus untuk pemrograman yang digerakkan oleh acara (di mana urutan eksekusi ditentukan oleh pendengar acara, seperti kode yang berjalan di browser Anda yang bekerja ketika Anda mengklik tombol atau mengetik ke dalam kotak).
Contohnya termasuk membuat seratus permintaan HTTP. Di NodeJS, solusi paling sederhana adalah membuka semua 100 permintaan sekaligus dengan metode panggilan balik, dan ketika respons kembali, metode dijalankan setiap kali. Itu pemrograman bersamaan. Di Ruby, solusi paling sederhana (paling umum) adalah membuka permintaan dan menangani respons, membuka permintaan berikutnya dan menangani respons, dll. Untuk banyak permintaan, NodeJS lebih mudah dilakukan secara tepat waktu, meskipun Anda harus hati-hati untuk menghindari memalu server atau memaksimalkan koneksi keluar Anda (mudah dilakukan karena kesalahan). Anda dapat menulis Ruby secara bersamaan, tetapi bukan bagaimana sebagian besar kode Ruby ditulis, dan sedikit menyakitkan untuk melakukannya.
Pemrograman paraleladalah kode yang dapat dijalankan secara bersamaan di banyak utas atau proses. Ini memungkinkan Anda untuk mengoptimalkan kinerja dengan menjalankan kode di beberapa CPU (seringkali termasuk beberapa mesin, seperti yang Anda lakukan dengan sesuatu seperti Akka). Karena NodeJS bukan multi-threaded dan tidak ada eksekusi paralel, Anda tidak perlu khawatir menulis kode threadsafe (dan sebagian besar kode JavaScript yang saya lihat bukan threadsafe). Di Jawa, meskipun bahasa tidak menjadikan pemrograman bersamaan sebagai pola normal, pemrograman paralel sangat terintegrasi, dan Anda sering harus khawatir tentang keamanan utas. Jika Anda menulis situs web di Java, biasanya ini akan dijalankan dalam wadah yang menjalankan setiap permintaan dalam utas terpisah di memori yang sama,
Beberapa hal di atas tergantung pada ruang lingkup dan batasan yang Anda bicarakan. Saya bekerja di Situs Web. Kebanyakan kode Java yang saya lihat bukan pemrograman bersamaan. Tentu, jika Anda memperkecil cukup, urutan yang diminta pelanggan tidak penting, tetapi jika Anda memperbesar lebih jauh dari itu, urutan hal-hal yang dieksekusi ditentukan oleh kode. Tetapi kode ini ditulis sehingga permintaan dapat dieksekusi secara paralel dengan banyak objek bersama yang harus diamankan.
Sementara itu, sebagian besar kode JavaScript yang saya lihat bersamaan: ditulis sedemikian rupa sehingga urutan pelaksanaannya tidak penting di banyak tingkatan. Tetapi tidak ditulis untuk mendukung eksekusi paralel dalam memori bersama. Tentu, Anda dapat menjalankan kode yang sama secara paralel di beberapa proses, tetapi objek tidak dibagi, jadi itu bukan pemrograman paralel dalam arti yang berarti.
Untuk bacaan tambahan, saya sangat suka ilustrasi di jawaban atas pertanyaan ini di sini: https://www.quora.com/What-are-the-differences-between-parallel-concurrent-and-asynchronous-programming
sumber