Saya mengerti bahwa dua dari lebih banyak pilihan untuk komunikasi antar proses dapat:
- Berbagi memori
- Soket
Sebenarnya saya melihat dua opsi ini diekspos oleh Intellij Idea untuk debugging aplikasi Java. Saya ingin tahu apa pro dan kontra dari setiap pendekatan.
Jawaban:
Beberapa keuntungan untuk masing-masing dari kepala saya. Perhatikan bahwa beberapa item ini mungkin tidak berlaku dalam semua kasus; ini hanya pengamatan umum.
Soket
Sederhana dan terkontrol. Dapat diperluas ke soket jaringan seperlunya dengan sedikit atau tanpa modifikasi. Model pemrograman memerlukan serialisasi, yang pada gilirannya mengharuskan Anda untuk berpikir tentang data apa yang sebenarnya ditransfer dari A ke B. Sinkronisasi diperlukan untuk mekanisme komunikasi; tidak perlu sinkronisasi lainnya.
Berbagi memori
Tidak perlu memerlukan syscall (karena itu berpotensi lebih cepat). Berbagi tidak secara eksplisit mengharuskan data untuk ditransfer - data dapat tersedia bahwa penerima tidak mengambil (bandwidth tidak harus disia-siakan mentransfer data yang tidak akan digunakan penerima). Tidak ada langkah serialisasi / deserialisasi berarti tidak ada waktu yang dihabiskan untuk overhead komunikasi.
sumber
Soket adalah satu-ke-satu. Anda memerlukan beberapa soket jika ingin mengirim hal yang sama ke beberapa proses. Dengan memori bersama, Anda dapat memiliki banyak pembaca, dan juga banyak penulis.
Soket padat sumber daya. Setiap pesan melewati OS. Dengan memori bersama, Anda memetakan memori bersama tetapi sekali ke memori aplikasi Anda dan sejak saat itu adalah milik Anda untuk digunakan. Namun, Anda masih harus melalui OS saat menggunakan memori bersama; Lihat di bawah.
Soket disinkronkan (selama Anda tidak menggunakan UDP). Dengan memori bersama, Anda hampir pasti membutuhkan beberapa mekanisme tambahan untuk memberi tahu proses lain bahwa OK / tidak OK untuk membaca atau menulis ke memori bersama. Jangan lakukan ini dan Anda akan mengalami masalah dengan memori yang rusak. Contoh: Misalkan proses A mulai membaca memori bersama sebagian, tetapi ditukar keluar sebagian membaca. Proses B menulis ke potongan memori yang sama. Ketika proses A restart dan terus membaca memori bersama, apa yang telah dibaca adalah kesalahan data lama dan baru. Untuk mencegah hal ini, Anda masih melalui OS ketika Anda menggunakan memori bersama.
Cukup mudah untuk mengonversi set aplikasi berbasis soket ke aplikasi yang menggunakan soket jaringan. Anda dapat menyebarkan pemrosesan ke semua mesin di lab Anda, atau bahkan lebih jauh. tidak bisa melakukan ini dengan memori bersama. Anda dikunci ke satu mesin dengan solusi berbasis memori bersama.
Soket dimaksudkan untuk volume data yang rendah, memori bersama untuk volume data yang besar. Mekanisme yang berbeda ada untuk menyelesaikan masalah yang berbeda.
sumber