Concurrency vs Parallelism

Baik konkurensi dan paralelisme digunakan dalam kaitannya dengan program multithread tetapi ada banyak kebingungan tentang persamaan dan perbedaan di antara keduanya. Pertanyaan besar dalam hal ini: apakah paralelisme konkurensi atau tidak? Meskipun kedua istilah tersebut tampak sangat mirip tetapi jawaban dari pertanyaan di atas adalah TIDAK, konkurensi dan paralelisme tidak sama. Sekarang, jika tidak sama, lalu apa perbedaan mendasar di antara keduanya?

Secara sederhana, konkurensi berkaitan dengan pengelolaan akses ke status bersama dari utas yang berbeda dan di sisi lain, paralelisme berkaitan dengan penggunaan banyak CPU atau intinya untuk meningkatkan kinerja perangkat keras.

Concurrency in Detail

Concurrency adalah saat dua tugas tumpang tindih dalam eksekusi. Ini bisa menjadi situasi di mana aplikasi sedang berkembang pada lebih dari satu tugas pada waktu yang sama. Kita dapat memahaminya secara diagram; beberapa tugas membuat kemajuan pada saat yang sama, sebagai berikut -

Tingkat Konkurensi

Pada bagian ini, kita akan membahas tiga level penting dari konkurensi dalam hal pemrograman -

Konkurensi Tingkat Rendah

Pada tingkat konkurensi ini, ada penggunaan operasi atom secara eksplisit. Kita tidak dapat menggunakan konkurensi semacam itu untuk pembuatan aplikasi, karena sangat rawan kesalahan dan sulit untuk di-debug. Bahkan Python tidak mendukung konkurensi semacam itu.

Konkurensi Tingkat Menengah

Dalam konkurensi ini, tidak ada penggunaan operasi atomik eksplisit. Ini menggunakan kunci eksplisit. Python dan bahasa pemrograman lainnya mendukung jenis konkurensi semacam itu. Kebanyakan pemrogram aplikasi menggunakan konkurensi ini.

Konkurensi Tingkat Tinggi

Dalam konkurensi ini, baik operasi atom maupun kunci eksplisit tidak digunakan. Python memilikiconcurrent.futures modul untuk mendukung konkurensi semacam itu.

Properti Sistem Konkuren

Agar program atau sistem bersamaan benar, beberapa properti harus dipenuhi olehnya. Properti yang terkait dengan penghentian sistem adalah sebagai berikut -

Properti kebenaran

Properti kebenaran berarti bahwa program atau sistem harus memberikan jawaban benar yang diinginkan. Sederhananya, kita dapat mengatakan bahwa sistem harus memetakan status program awal ke status akhir dengan benar.

Properti keamanan

Properti keamanan berarti bahwa program atau sistem harus tetap dalam a “good” atau “safe” menyatakan dan tidak pernah melakukan apapun “bad”.

Properti kehidupan

Properti ini berarti bahwa program atau sistem harus “make progress” dan itu akan mencapai kondisi yang diinginkan.

Aktor sistem konkuren

Ini adalah salah satu properti umum dari sistem konkuren yang di dalamnya terdapat beberapa proses dan utas, yang berjalan pada saat yang sama untuk membuat kemajuan pada tugas mereka sendiri. Proses dan utas ini disebut aktor dari sistem konkuren.

Sumber Daya Sistem Konkuren

Aktor harus memanfaatkan sumber daya seperti memori, disk, printer dll untuk melakukan tugas mereka.

Seperangkat aturan tertentu

Setiap sistem bersamaan harus memiliki seperangkat aturan untuk menentukan jenis tugas yang akan dilakukan oleh aktor dan waktu untuk masing-masing. Tugas dapat memperoleh kunci, berbagi memori, mengubah status, dll.

Hambatan Sistem Konkuren

Saat menerapkan sistem konkuren, pemrogram harus mempertimbangkan dua masalah penting berikut, yang dapat menjadi penghalang sistem konkuren -

Berbagi data

Masalah penting saat menerapkan sistem bersamaan adalah berbagi data di antara beberapa utas atau proses. Sebenarnya, pemrogram harus memastikan bahwa kunci melindungi data bersama sehingga semua akses ke data berseri dan hanya satu utas atau proses yang dapat mengakses data bersama pada satu waktu. Dalam kasus, ketika beberapa utas atau proses semuanya mencoba mengakses data bersama yang sama maka tidak semua kecuali setidaknya satu dari mereka akan diblokir dan akan tetap menganggur. Dengan kata lain, kita dapat mengatakan bahwa kita hanya dapat menggunakan satu proses atau utas pada saat kunci diberlakukan. Ada beberapa solusi sederhana untuk menghilangkan hambatan yang disebutkan di atas -

Pembatasan Berbagi Data

Solusi paling sederhana adalah tidak membagikan data yang bisa berubah. Dalam hal ini, kita tidak perlu menggunakan penguncian eksplisit dan penghalang konkurensi karena data bersama akan diselesaikan.

Bantuan Struktur Data

Sering kali, proses bersamaan perlu mengakses data yang sama pada waktu yang sama. Solusi lain, selain menggunakan kunci eksplisit, adalah menggunakan struktur data yang mendukung akses bersamaan. Misalnya, kita bisa menggunakanqueuemodul, yang menyediakan antrian aman untuk thread. Kami juga bisa menggunakanmultiprocessing.JoinableQueue kelas untuk konkurensi berbasis multiprosesing.

Transfer Data yang Tidak Dapat Diubah

Terkadang, struktur data yang kita gunakan, misalnya antrian konkurensi, tidak sesuai, maka kita dapat meneruskan data yang tidak dapat diubah tanpa menguncinya.

Transfer Data yang Dapat Diubah

Sebagai kelanjutan dari solusi di atas, misalkan jika diperlukan untuk melewatkan hanya data yang dapat berubah, daripada data yang tidak dapat diubah, maka kita dapat melewatkan data yang dapat diubah yang hanya dapat dibaca.

Berbagi Sumber Daya I / O

Masalah penting lainnya dalam mengimplementasikan sistem konkuren adalah penggunaan sumber daya I / O oleh utas atau proses. Masalah muncul ketika satu utas atau proses menggunakan I / O untuk waktu yang lama dan lainnya menganggur. Kami dapat melihat penghalang semacam itu saat bekerja dengan aplikasi berat I / O. Ini dapat dipahami dengan bantuan contoh, meminta halaman dari browser web. Ini adalah aplikasi yang berat. Di sini, jika kecepatan data diminta lebih lambat daripada kecepatan konsumsi data maka ada penghalang I / O dalam sistem konkuren kami.

Skrip Python berikut adalah untuk meminta halaman web dan mendapatkan waktu yang dibutuhkan jaringan kami untuk mendapatkan halaman yang diminta -

import urllib.request

import time

ts = time.time()

req = urllib.request.urlopen('http://www.tutorialspoint.com')

pageHtml = req.read()

te = time.time()

print("Page Fetching Time : {} Seconds".format (te-ts))

Setelah menjalankan skrip di atas, kita bisa mendapatkan waktu pengambilan halaman seperti yang ditunjukkan di bawah ini.

Keluaran

Page Fetching Time: 1.0991398811340332 Seconds

Kami dapat melihat bahwa waktu untuk mengambil halaman lebih dari satu detik. Sekarang bagaimana jika kami ingin mengambil ribuan halaman web yang berbeda, Anda dapat memahami berapa lama waktu yang dibutuhkan jaringan kami.

Apa itu Paralelisme?

Paralelisme dapat didefinisikan sebagai seni membagi tugas menjadi beberapa tugas yang dapat diproses secara bersamaan. Ini berlawanan dengan konkurensi, seperti yang dibahas di atas, di mana dua atau lebih peristiwa terjadi pada waktu yang sama. Kita bisa memahaminya secara diagram; tugas dipecah menjadi sejumlah subtugas yang dapat diproses secara paralel, sebagai berikut -

Untuk mendapatkan lebih banyak ide tentang perbedaan antara konkurensi dan paralelisme, pertimbangkan poin-poin berikut -

Bersamaan tapi tidak paralel

Sebuah aplikasi bisa bersamaan tetapi tidak paralel artinya ia memproses lebih dari satu tugas pada saat yang sama tetapi tugas tersebut tidak dipecah menjadi subtugas.

Paralel tetapi tidak bersamaan

Sebuah aplikasi bisa paralel tapi tidak bersamaan artinya hanya bekerja pada satu tugas dalam satu waktu dan tugas yang dipecah menjadi subtugas dapat diproses secara paralel.

Baik paralel maupun bersamaan

Aplikasi tidak bisa paralel atau bersamaan. Artinya, ini hanya berfungsi pada satu tugas pada satu waktu dan tugas tersebut tidak pernah dipecah menjadi subtugas.

Baik paralel dan bersamaan

Sebuah aplikasi bisa paralel dan bersamaan artinya keduanya bekerja pada banyak tugas sekaligus dan tugas tersebut dipecah menjadi subtugas untuk mengeksekusinya secara paralel.

Perlunya Paralelisme

Kita dapat mencapai paralelisme dengan mendistribusikan subtugas di antara inti CPU tunggal yang berbeda atau di antara beberapa komputer yang terhubung dalam jaringan.

Pertimbangkan poin penting berikut untuk memahami mengapa perlu mencapai paralelisme -

Eksekusi kode yang efisien

Dengan bantuan paralelisme, kita dapat menjalankan kode kita secara efisien. Ini akan menghemat waktu kita karena kode yang sama di beberapa bagian berjalan secara paralel.

Lebih cepat dari komputasi sekuensial

Komputasi sekuensial dibatasi oleh faktor fisik dan praktis yang karenanya tidak mungkin mendapatkan hasil komputasi yang lebih cepat. Di sisi lain, masalah ini diselesaikan dengan komputasi paralel dan memberi kita hasil komputasi yang lebih cepat daripada komputasi sekuensial.

Lebih sedikit waktu eksekusi

Pemrosesan paralel mengurangi waktu eksekusi kode program.

Jika kita berbicara tentang contoh kehidupan nyata dari paralelisme, kartu grafis komputer kita adalah contoh yang menyoroti kekuatan sebenarnya dari pemrosesan paralel karena memiliki ratusan inti pemrosesan individu yang bekerja secara independen dan dapat melakukan eksekusi pada waktu yang sama. Karena alasan ini, kami juga dapat menjalankan aplikasi dan game kelas atas.

Memahami prosesor untuk implementasi

Kami tahu tentang konkurensi, paralelisme, dan perbedaan di antara keduanya, tetapi bagaimana dengan sistem yang akan mengimplementasikannya. Sangatlah penting untuk memiliki pemahaman tentang sistem, yang akan kita implementasikan, karena itu memberi kita keuntungan untuk mengambil keputusan yang tepat saat merancang perangkat lunak. Kami memiliki dua jenis prosesor berikut -

Prosesor inti tunggal

Prosesor inti tunggal mampu menjalankan satu utas pada waktu tertentu. Prosesor ini menggunakancontext switchinguntuk menyimpan semua informasi yang diperlukan untuk utas pada waktu tertentu dan kemudian memulihkan informasi tersebut nanti. Mekanisme peralihan konteks membantu kami membuat kemajuan pada sejumlah utas dalam satu detik dan sepertinya sistem bekerja pada banyak hal.

Prosesor inti tunggal hadir dengan banyak keunggulan. Prosesor ini membutuhkan daya yang lebih sedikit dan tidak ada protokol komunikasi yang rumit antara banyak inti. Di sisi lain, kecepatan prosesor inti tunggal terbatas dan tidak cocok untuk aplikasi yang lebih besar.

Prosesor multi-core

Prosesor multi-inti memiliki beberapa unit pemrosesan independen yang juga disebut cores.

Prosesor semacam itu tidak memerlukan mekanisme pengalihan konteks karena setiap inti berisi semua yang dibutuhkan untuk menjalankan urutan instruksi yang tersimpan.

Fetch-Decode-Execute Cycle

Inti prosesor multi-core mengikuti siklus untuk dieksekusi. Siklus ini disebutFetch-Decode-Executesiklus. Ini melibatkan langkah-langkah berikut -

Mengambil

Ini adalah langkah pertama dari siklus, yang melibatkan pengambilan instruksi dari memori program.

Membaca sandi

Instruksi yang baru diambil akan diubah menjadi serangkaian sinyal yang akan memicu bagian lain dari CPU.

Menjalankan

Ini adalah langkah terakhir di mana instruksi yang diambil dan didekodekan akan dijalankan. Hasil eksekusi akan disimpan dalam register CPU.

Satu keuntungan di sini adalah bahwa eksekusi di prosesor multi-inti lebih cepat daripada prosesor inti tunggal. Sangat cocok untuk aplikasi yang lebih besar. Di sisi lain, protokol komunikasi yang kompleks antara beberapa inti menjadi masalah. Beberapa inti membutuhkan daya lebih dari prosesor inti tunggal.