Traffine I/O

Bahasa Indonesia

2023-03-31

Multi-Proses dan Multi-Threading

Pendahuluan

Di dunia yang sekarang ini dengan tuntutan komputasi yang semakin meningkat, sangat penting untuk memanfaatkan kekuatan paralelisme guna memaksimalkan efisiensi dan kinerja program komputer. Konkurensi, eksekusi simultan dari beberapa tugas, memainkan peran penting dalam mencapai tujuan ini. Ada dua metode utama untuk mencapai konkurensi dalam perangkat lunak: multi-proses dan multi-threading. Memahami konsep dasar dan aplikasi praktis dari pendekatan ini sangat penting bagi setiap pengembang perangkat lunak atau ilmuwan komputer.

Multi processing and multi threading
Multithreading vs. Multiprocessing in Python

Multi-Proses

Multi-proses melibatkan eksekusi tugas konkuren dalam proses yang terpisah, masing-masing berjalan dalam ruang memori dan lingkungan sistem operasi tersendiri. Pemisahan ini memberikan isolasi, yang mencegah satu proses mempengaruhi proses lainnya jika terjadi kesalahan atau crash. Selain itu, multi-proses memungkinkan pemanfaatan yang lebih baik dari prosesor multi-core, karena setiap proses dapat dijadwalkan untuk dijalankan pada core yang terpisah. Namun, multi-proses bisa lebih memakan resource dan memerlukan mekanisme sinkronisasi dan komunikasi yang kompleks antar proses.

Proses vs. Thread

Proses adalah unit eksekusi program independen yang memiliki ruang memori, handle file, dan resource lainnya. Thread, di sisi lain, adalah unit eksekusi ringan dalam suatu proses, yang berbagi ruang memori dan resource yang sama. Multi-proses melibatkan menjalankan tugas konkuren dalam proses yang terpisah, sementara multi-threading menggunakan beberapa thread dalam proses yang sama.

Pembuatan dan Pengelolaan Proses

Membuat dan mengelola proses biasanya lebih memakan resource daripada mengelola thread. Sistem operasi menyediakan mekanisme untuk membuat, mengelola, dan mengakhiri proses. Setiap proses memiliki pengenal proses unik (PID) dan dapat menghasilkan proses anak menggunakan panggilan sistem seperti fork() atau spawn().

Komunikasi Antar Proses (IPC)

Proses berjalan dalam ruang memori terisolasi, yang berarti mereka tidak dapat mengakses data satu sama lain secara langsung. Untuk berbagi data atau berkomunikasi, proses menggunakan mekanisme IPC seperti pipa, antrian pesan, memori bersama, atau soket.

Mekanisme Sinkronisasi untuk Proses

Proses mungkin perlu menyinkronkan tindakan mereka untuk memastikan eksekusi yang tepat dari tugas konkuren. Primitif sinkronisasi umum untuk proses mencakup semafor, mutex, dan variabel kondisi. Mekanisme ini membantu mengoordinasikan akses ke resource bersama dan mencegah race condition.

Multi-Threading

Multi-threading melibatkan eksekusi tugas konkuren dalam proses yang sama menggunakan beberapa thread. Thread berbagi ruang memori yang sama dengan proses induknya, yang membuat komunikasi dan berbagi data antara mereka lebih efisien. Namun, model memori bersama ini meningkatkan risiko race condition dan masalah sinkronisasi lainnya. Multi-threading umumnya kurang memakan resource dibandingkan dengan multi-proses, tetapi memerlukan pengelolaan resource bersama yang hati-hati untuk menghindari bottleneck kinerja dan potensi deadlock.

Pembuatan dan Pengelolaan Thread

Thread adalah unit eksekusi ringan dalam proses, yang berbagi ruang memori dan resource yang sama dengan proses induknya. Membuat dan mengelola thread umumnya kurang memakan resource daripada mengelola proses. Sistem operasi dan bahasa pemrograman menyediakan mekanisme untuk membuat, mengelola, dan mengakhiri thread, seperti fungsi pthread_create() dalam bahasa C atau kelas Thread dalam bahasa Java.

Mekanisme Sinkronisasi Thread

Thread dalam proses berbagi memori, yang dapat menyebabkan race condition dan masalah sinkronisasi lainnya jika tidak dikelola dengan benar. Primitif sinkronisasi umum untuk thread mencakup mutex, semafor, variabel kondisi, dan barier. Mekanisme ini membantu mengoordinasikan akses ke resource bersama dan memastikan urutan eksekusi yang benar.

Thread Pools dan Executor

Mengelola thread secara manual bisa rumit dan rawan kesalahan. Thread pool dan executor menyediakan abstraksi tingkat tinggi untuk mengelola konkurensi. Thread pool adalah kumpulan thread yang telah dibuat sebelumnya yang dapat menjalankan tugas secara konkuren. Executor menyediakan mekanisme untuk mengirimkan tugas ke thread pool dan mengelola eksekusinya, seperti kelas ThreadPoolExecutor dalam Java atau modul concurrent.futures dalam Python.

Struktur Data Konkuren

Ketika beberapa thread mengakses struktur data bersama, pengelolaan resource bersama sangat penting. Struktur data konkuren dirancang untuk diakses dengan aman oleh beberapa thread tanpa perlu sinkronisasi eksplisit. Contohnya termasuk ConcurrentHashMap dalam Java atau concurrent.futures.ThreadPoolExecutor dalam Python. Struktur data ini menggunakan mekanisme sinkronisasi internal untuk memastikan operasi yang aman untuk thread.

Membandingkan Multi-Proses dan Multi-Threading

Dalam bagian ini, saya akan mengkaji perbedaan utama antara multi-proses dan multi-threading, dengan fokus pada kinerja, skalabilitas, pengelolaan resource, dan kompleksitas.

Kinerja

Multi-proses seringkali dapat memberikan kinerja yang lebih baik dalam tugas yang terikat oleh CPU, karena setiap proses dapat dijadwalkan untuk dijalankan pada core yang berbeda, meminimalkan kontensi untuk resource pemrosesan. Namun, multi-threading bisa lebih efisien untuk tugas yang terikat oleh I/O, karena thread dalam proses dapat berbagi resource dan berkomunikasi satu sama lain dengan lebih efektif.

Skalabilitas

Multi-proses dapat meningkatkan skala pada sistem dengan beberapa core atau prosesor, karena proses dapat didistribusikan di antara resource ini. Di sisi lain, multi-threading bisa lebih skalabel dalam hal penggunaan memori, karena thread berbagi memori dengan proses induknya, mengurangi jejak memori secara keseluruhan.

Pengelolaan Resource

Multi-proses cenderung mengkonsumsi lebih banyak resource sistem, seperti memori dan file descriptor, karena overhead dalam membuat dan mengelola proses terpisah. Multi-threading, bagaimanapun, memerlukan pengelolaan resource bersama yang hati-hati untuk menghindari potensi masalah sinkronisasi dan kontensi resource, yang dapat menurunkan kinerja.

Kompleksitas

Mengimplementasikan multi-proses bisa lebih kompleks daripada multi-threading, terutama dalam hal komunikasi antar proses dan sinkronisasi. Namun, multi-threading memiliki tantangan tersendiri, seperti mengelola resource bersama dan menghindari race condition, deadlock, dan masalah sinkronisasi lainnya.

Bahasa Pemrograman Populer dan Pustaka untuk Konkurensi

Berbagai bahasa pemrograman dan pustaka menawarkan berbagai tingkat dukungan untuk multi-proses dan multi-threading. Dalam bagian ini, saya akan membahas secara singkat fitur konkurensi yang tersedia dalam bahasa populer seperti Python, Java, C++, dan Go.

  • Python
    Python menyediakan modul multiprocessing untuk multi-proses dan modul threading untuk multi-threading. Selain itu, modul concurrent.futures menawarkan antarmuka tingkat tinggi untuk mengeksekusi callable secara asinkron.

  • Java
    Java memiliki dukungan bawaan untuk multi-threading melalui kelas java.lang.Thread dan paket java.util.concurrent, yang mencakup berbagai utilitas konkurensi, seperti thread pool, sinkronisator, dan struktur data konkuren.

  • C++
    C++11 memperkenalkan header <thread>, yang menyediakan dukungan untuk multi-threading. Pustaka Standar C++ juga mencakup berbagai primitif sinkronisasi dan struktur data konkuren dalam header <mutex>, <condition_variable>, dan <future>.

  • Go
    Go dirancang dengan konkurensi dalam pikiran, menampilkan goroutine ringan dan saluran untuk komunikasi di antara mereka. Paket sync menyediakan primitif sinkronisasi, dan paket context memungkinkan pembatalan dan waktu tunggu dalam operasi konkuren.

Aplikasi Praktis Multi-Proses dan Multi-Threading

Konkurensi digunakan dalam berbagai domain untuk meningkatkan kinerja dan responsivitas. Dalam bagian ini, saya akan menjelajahi beberapa aplikasi praktis di mana multi-proses dan multi-threading umumnya digunakan.

  • Server Web
    Server web menangani beberapa permintaan secara bersamaan, seringkali menggunakan multi-threading atau multi-proses untuk mendistribusikan permintaan masuk ke resource yang tersedia, meningkatkan responsivitas dan kapasitas.

  • Komputasi Ilmiah
    Dalam komputasi ilmiah, paralelisme sangat penting untuk mengolah dataset besar dan melakukan perhitungan yang kompleks. Multi-proses dan multi-threading dapat secara signifikan mengurangi waktu eksekusi tugas-tugas yang intensif secara komputasi.

  • Pengolahan Big Data
    Konkurensi sangat penting untuk mengolah sejumlah besar data secara real-time. Kerangka kerja big data, seperti Apache Hadoop dan Apache Spark, menggunakan multi-proses dan multi-threading untuk mendistribusikan tugas secara efisien di antara kluster mesin.

  • Pengolahan Video
    Tugas pengolahan video, seperti pengkodean, dekode, dan pengeditan, dapat sangat menuntut secara komputasi. Multi-threading dan multi-proses dapat digunakan untuk memparalelkan tugas-tugas ini dan meningkatkan waktu pemrosesan.

Referensi

https://www.tutorialspoint.com/concurrency_in_python/concurrency_in_python_quick_guide.htm

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!