Mengapa saya harus tahu pemrograman bersamaan?

17

Pemrograman bersamaan cukup sulit bagi saya: bahkan melihat slide dasar tampaknya menantang bagi saya. Tampaknya sangat abstrak.

Apa manfaat mengetahui konsep pemrograman bersamaan dengan baik? Apakah ini akan membantu saya dalam pemrograman teratur dan berurutan? Saya tahu ada kepuasan untuk memahami bagaimana program kami bekerja, tetapi apa lagi?

Adel
sumber
3
Saya pikir ini agak off topy, tapi bisa juga top ony jika Anda mengedit semua hal pribadi (meskipun pemrograman bersamaan cukup sulit untuk semua orang ) dan meminta manfaat teknis konkret dari konsep-konsep tersebut.
yannis
1
Manfaatnya harus cukup jelas. Anda dapat menulis program yang dapat memanfaatkan semua peningkatan kinerja yang tersedia melalui pembagian kerja yang ditawarkan oleh program bersamaan. Tidak mudah bagi siapa pun. Ini konsep yang sangat menantang saat ini.
Rig
3
Kami tidak dapat membantu Anda mendapatkan motivasi untuk mempelajari sesuatu, tetapi pertanyaan umum tentang mengapa seseorang harus tahu tentang konkurensi adalah topik yang cukup.
2
Saya tahu pemrograman bersamaan. Saya dapat mengatakan bahwa slide yang Anda berikan tidak membantu untuk memahami. Sebagai gantinya, pergi ke pesta dengan filsuf makan .
mouviciel
1
Tenang, bahkan yang terhebat merasa kesulitan: informit.com/articles/article.aspx?p=1193856
SK-logic

Jawaban:

32

Berikut ini adalah motivasi yang cepat dan mudah: Jika Anda ingin membuat kode untuk apa pun kecuali sistem terkecil, terlemah, Anda akan menulis kode bersamaan.

Ingin menulis untuk cloud? Hitung instance di cloud kecil. Anda tidak mendapatkan yang besar, Anda mendapatkan banyak yang kecil. Tiba-tiba aplikasi web kecil Anda adalah aplikasi bersamaan. Jika Anda mendesainnya dengan baik, Anda bisa melemparkan lebih banyak server saat Anda mendapatkan pelanggan. Lain Anda harus belajar bagaimana sementara instance Anda memiliki rata-rata memuat beban.

OK, Anda ingin menulis aplikasi desktop? Semuanya memiliki dual-atau-lebih-core-CPU. Kecuali mesin yang paling murah. Dan orang-orang dengan mesin paling murah mungkin tidak akan membayar mahal untuk perangkat lunak mahal Anda, bukan?

Mungkin Anda ingin melakukan pengembangan ponsel? Hai, iPhone 4S memiliki CPU dual-core. Sisanya tidak akan jauh di belakang.

Video game? Xbox 360 adalah sistem multi-CPU, dan Sony PS3 pada dasarnya adalah sistem multi-core.

Anda tidak bisa melepaskan diri dari pemrograman bersamaan kecuali jika Anda mengerjakan masalah kecil yang sederhana.

Pembaruan 2016 : Pengulangan saat ini dari Raspberry Pi $ 35 dibangun di sekitar sistem quad-core pada chip yang ditujukan untuk ponsel. Kemajuan dramatis dalam AI telah dibuat sebagian karena ketersediaan kartu grafis high-end sebagai mesin komputasi paralel.

ObscureRobot
sumber
1
Sementara saya setuju secara prinsip, mengatakan itu Everything has a dual-or-more-core-CPU. Except the least expensive machines.agak masuk akal. Banyak orang memiliki mesin single-core, bukan karena murah, tetapi karena mereka senang dengan apa yang mereka miliki dan melihat tidak perlu melakukan upgrade. Yang mengatakan, berpikir dalam hal konkurensi akan membantu scheduler pada sistem single-core juga, sehingga tidak sia-sia usaha mana saja Anda dapat mengasumsikan preemptive multitasking, baik (yang merupakan setiap lingkungan multitasking sebagian besar pengembang akan datang dalam kontak dengan, hari ini).
CVn
1
ok - itu agak berlebihan, tetapi perangkat keras baru cenderung multi-core. Saya tidak melihat itu pergi. Jadi jika Anda seorang siswa hari ini memikirkan pekerjaan yang akan Anda lakukan secara profesional di masa depan, aman untuk berasumsi bahwa Anda akan bekerja pada sistem multicore.
ObscureRobot
Saya ingin tahu apakah saya tidak setuju dengan jawaban Anda sebanyak yang Anda tidak setuju dengan lol saya;)
1
Cara saya membacanya, ada kernel yang mirip dengan apa yang kami berdua katakan, @ acidzombie24. Saya mengatakan bahwa pengembang harus tahu cara menangani konkurensi karena akan ada di mana-mana. Anda mengatakan bahwa Anda tidak harus pandai pemrograman konkuren selama Anda ... menghindari perangkap sistem bersamaan :)
ObscureRobot
Saya setuju bahwa sangat berguna untuk mengetahui tentang konkurensi, tetapi tidak setuju bahwa Anda hanya bisa menghindarinya karena "masalah kecil, sederhana". Anda dapat jauh dari konkurensi, bahkan dalam sistem non-sepele, misalnya jika Anda mengandalkan kerangka kerja yang ada dan server aplikasi. Setelah infrastruktur tersedia, saya bisa menjadi pengembang junior yang menulis layanan baru untuk aplikasi web dan hampir tidak tahu apa-apa tentang konkurensi atau paralelisme.
Andres F.
21

Dari tahun 1970 hingga sekitar tahun 2002, prosesor menggandakan kecepatannya setiap 18 bulan. Jadi sebagai programmer, Anda hanya perlu menunggu dan program Anda akan berjalan lebih cepat. Masalahnya adalah bahwa sekitar tahun 2002 peraturan berubah. Sekarang mereka tidak membuat prosesor cepat lebih besar, mereka membuat prosesor lebih lambat lebih kecil tetapi menempatkan mereka dalam kelompok. Komputer yang saya kerjakan sekarang memiliki 4 core, dan Chips dengan hingga 8 core (dan 4 thread per core) ada. Tak lama lagi kita akan memiliki chip dengan core lebih banyak.

Jadi, jika Anda menulis sebuah program yang tidak bersamaan, Anda akan menemukan bahwa Anda menggunakan 1 inti atau utas, tetapi CPU lainnya tidak melakukan apa-apa. Jadi jika Anda memiliki 16 core 1 akan menjalankan program Anda dan 15 lainnya duduk di sana!

Masalah dengan konkurensi adalah bahwa hal itu non deterministik. Artinya, Anda tidak tahu persis urutan urutan utas yang berbeda-beda. Pemrogram tradisional telah mencoba menyelesaikannya dengan menggunakan kunci dan sejenisnya. Ini telah menyebabkan BANYAK rasa sakit. Memiliki beberapa bentuk keadaan yang bisa berubah yang dapat diakses lebih dari satu utas dengan bebas sering kali merupakan formula untuk rasa sakit dan heisnebug!

Akhir-akhir ini kecenderungannya adalah beralih ke bahasa fungsional yang dengan ketat mengontrol keadaan yang bisa berubah. Ada dua cara dasar bahwa bahasa fungsional menangani konkurensi. Yang pertama adalah dengan menggunakan passing pesan. Ini paling baik ditunjukkan oleh Erlang. Di Erlang secara umum tidak ada kondisi Shared antara proses. Mereka berkomunikasi bukan dengan berbagi memori tetapi pesan yang saya sampaikan. Ini harus masuk akal bagi Anda karena kami sedang melakukannya sekarang. Saya mengirimkan informasi ini kepada Anda dengan mengirimkan Anda pesan, bukan dengan Anda mengingatnya dari otak saya! Dengan beralih ke pesan yang melewati sebagian besar bug pengunci hanya pergi. Selain itu pesan dapat dikirimkan melalui jaringan serta dalam satu node.

Metode lainnya adalah STM, yang merupakan singkatan dari Software Transcriptional Memory, This hadir dalam clojure dan Haskell (dan lainnya). Dalam memori STM dibagi tetapi perubahan hanya dapat dilakukan melalui transaksi. Sebagai orang-orang Database yang menemukan semua hal ini pada tahun 1970-an, sangat mudah untuk memastikan bahwa kami melakukannya dengan benar.

Sebenarnya saya sedikit disederhanakan, Clojure dan Haskell dapat melakukan message passing, dan Erlang dapat melakukan STM.

Penafian Saya penulis Pemrograman Layanan Web dengan Erlang , yang akan keluar dalam rilis awal dalam beberapa minggu ke depan.

Zachary K
sumber
1
@Zachary K: adakah pendekatan yang memadukan bahasa fungsional dengan bahasa asli sehingga bagian-bagian yang intensif komputasi diimplementasikan dalam bahasa asli tetapi mereka menyediakan antarmuka yang dapat dikonsumsi oleh server yang ditulis dalam bahasa fungsional?
rwong
Tidak 100% yakin, tapi baik Clojure dan Scala ada di JVM, jadi di situlah saya akan mulai. Mungkin lihatlah kerangka Akka. Saya belum menggunakannya tetapi mendengarkan pembicaraan tentang Akka beberapa waktu lalu dan sepertinya itu mungkin cukup keren. Untuk saat ini saya sedang melakukan Erlang dan Javascript yang menghabiskan sebagian besar waktu saya!
Zachary K
1
@ rwong: .NET memungkinkan programmer menggunakan C # atau bahasa non-fungsional lainnya untuk beberapa bagian aplikasi mereka dan F #, bahasa fungsional, untuk yang lain.
Kevin
5

Karena concurrency dapat meledak di wajah Anda ketika Anda mengharapkannya ...

fortran
sumber
4
+1000000000000000000000000000000000000000000
8
Concurrency adalah Inkuisisi Spanyol baru [/ python] [seperti pada: tidak ada yang mengharapkan ...]
ObscureRobot
1
@ObscureRobot dua kali lebih lucu! (penjelasan tidak diperlukan :-p)
fortran
4

Aturan pertama pemrograman bersamaan adalah "Sulit". Aturan kedua pemrograman konkuren adalah "It. Is. Difficult" .. !!

Serius meskipun, ada dua pendekatan umum untuk pemrograman bersamaan, multi-threading dan multi-pemrosesan. Multi-pemrosesan adalah yang termudah untuk dipahami karena itu hanya berarti memiliki beberapa contoh proses yang berjalan untuk menyelesaikan tugas. Ini cukup mudah dilakukan pada sistem berbasis Unix melalui panggilan ke fork / gabung, tetapi tidak begitu mudah pada sistem Windows.

Multi-threading mungkin merupakan pendekatan yang kebanyakan orang pikirkan ketika berbicara tentang konkurensi. Tidak sulit untuk memulai banyak utas dalam suatu aplikasi, tetapi iblis ada dalam perinciannya. Anda perlu mengoordinasi pembagian data antara utas (biasanya menggunakan kunci) yang dapat menyebabkan kebuntuan atau data dalam keadaan tidak valid. Anda juga perlu memahami cara berkomunikasi antara utas menggunakan konsep seperti semaphores, variabel kondisional dll.

Keuntungan dari semua ini adalah begitu Anda memahaminya, Anda dapat lebih efektif menggunakan perangkat keras yang mendasarinya. Hari-hari ini sudah menjadi norma bagi prosesor untuk memiliki banyak core. Dengan memanfaatkan pemrograman konkuren Anda dapat membuat core ini bekerja untuk Anda, dan aplikasi Anda akan mendapatkan peningkatan kecepatan.

Kerugiannya adalah Anda harus mulai berpikir tentang bagaimana Anda akan membagi aplikasi Anda menjadi beberapa bagian kecil yang dapat dijalankan pada utas yang berbeda. Ini jauh lebih sulit daripada kedengarannya. Juga, solusi yang sangat konkuren dapat menjadi canggung pada unit test karena urutan pelaksanaannya kurang deterministik.

Saat ini sebagian besar bahasa dikirimkan dengan abstraksi atas kebanyakan primitif bersamaan untuk membuat hidup sedikit lebih mudah. Sebagai contoh, .NET 4 dikirimkan dengan Pustaka Paralel Tugas yang membuat hidup sedikit lebih mudah. Di tanah Jawa mereka punya paket Concurrency .

Sean
sumber
1
Itu mendapat perintah besarnya jika Anda melarikan diri dari kunci secepat mungkin. Gunakan STM atau aktor dan semua yang Anda katakan hilang. Tentu saja itu berarti pindah dari Jawa ke bahasa-bahasa seperti Scala, Erlang atau Clojure. (walaupun saya berpendapat bahwa ini juga hal yang baik)
Zachary K
@ Zakary: Ini mungkin hal yang baik, tetapi jika Anda bekerja di toko .NET, misalnya, itu tidak praktis. STM mungkin menjadi opsi di masa depan, tetapi saat ini ini bukan pilihan dalam bahasa umum.
Sean
Clojure berjalan di .net, dan ada F #. Saya berani bertaruh bahwa ada juga implementasi STM untuk C #.
Zachary K
3

Baru-baru ini saya memiliki tugas yang sangat menarik untuk dilakukan dimana multiprosesor menyelamatkan saya. Saya pada dasarnya harus melakukan banyak permintaan ke beberapa server terpisah, berurusan dengan jumlah data yang sangat kecil, tetapi banyak permintaan.

Bekerja dengan PHP, saya melakukan hal-hal dengan cara lama, dan waktu terbaik yang saya peroleh setelah beberapa jam kerja menghasilkan ~ 120 detik untuk menjalankan tes tertentu (banyak permintaan + penundaan jaringan + tidak ada async)

Tapi itu hampir tidak cukup dibandingkan dengan apa yang saya butuhkan, dan setelah gagal total dengan PHP multiprocessing, saya beralih ke Python.

Setelah beberapa jam, saya menjalankan skrip multiprosesor Python yang berjalan dalam 20 detik, dan setelah sedikit mengutak-atik timeout dan tidak. utas yang akan digunakan, saya turun ke ~ 10 detik .

Ini untuk situs web yang ditulis 100% dalam PHP, kecuali skrip Python 100 baris tunggal. Dan semuanya bekerja dengan sempurna.

Kesimpulan saya adalah bahwa bahkan jika itu tidak akan membantu Anda setiap hari, Anda mungkin menghadapi situasi di mana mengetahui setidaknya dasar-dasar pemrograman bersamaan akan sangat membantu Anda.

Semoga sukses, dan senang coding!

PS: Saya tidak mencoba untuk mem-bash PHP, tetapi PHP bukan alat yang tepat untuk pekerjaan yang sedang dilakukan.

PS2: Mengetahui teknologi baru, atau cara baru dalam melakukan sesuatu dapat membuka pintu ke dunia baru yang penuh kemungkinan.

Vlad Preda
sumber
2

Jika Anda melakukan segala jenis pengembangan web, konkurensi berperan, setidaknya dengan sebagian besar bahasa. Misalnya, saya menggunakan pegas untuk pengembangan web dan setiap permintaan baru masuk sebagai utasnya sendiri. Oleh karena itu, jika ada permintaan yang akhirnya mengakses objek bersama, di mana negara dapat diubah dari suatu variabel, konkurensi merupakan faktor yang sangat besar dan harus dipertimbangkan. Jika tidak, maka data dapat diedit dengan cara yang tidak dapat diprediksi dan kerusakan data dapat terjadi. Tidaklah penting untuk mengetahui setiap detail terakhir tentang konkurensi, tetapi mempelajari potongan pada suatu waktu adalah penting untuk lebih memahami pemrograman aplikasi web, jika Anda bekerja pada aplikasi desktop, mungkin itu tidak begitu penting kecuali jika Anda perlu menjalankan banyak utas.

programmx10
sumber
-1

Pelajari wawasan sistem operasi. Membaca kode sumber penjadwal dan driver perangkat akan membantu; mereka pasti berbarengan.

jj1bdx
sumber
2
Konkurensi untuk programmer biasanya digunakan untuk program Anda sendiri yang berjalan dalam beberapa kejadian.
Saya mencoba menekankan bahwa Anda tidak dapat menulis program bersamaan sendiri tanpa mengetahui rincian algoritma penjadwalan dari kernel OS.
jj1bdx
Kenapa tidak? Jika Anda menggunakan mekanisme penguncian dengan benar, algoritma penjadwalan OS tidak penting.