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?
concurrency
Adel
sumber
sumber
Jawaban:
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.
sumber
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).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.
sumber
Karena concurrency dapat meledak di wajah Anda ketika Anda mengharapkannya ...
sumber
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 .
sumber
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.
sumber
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.
sumber
Pelajari wawasan sistem operasi. Membaca kode sumber penjadwal dan driver perangkat akan membantu; mereka pasti berbarengan.
sumber