Apa pro dan kontra dari proses komunikasi Inter dilakukan melalui soket vs memori bersama?

9

Saya mengerti bahwa dua dari lebih banyak pilihan untuk komunikasi antar proses dapat:

  1. Berbagi memori
  2. 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.

Kutu buku
sumber
Metode yang lebih baru adalah D-Bus.
ott--
@ ott - Bukankah D-Bus menggunakan soket domain Unix sendiri?
@BrianMarshall Memang, domain dan soket tcp / ip.
ott--
Ada juga jawaban di sini: stackoverflow.com/a/1844919/632951
Pacerier

Jawaban:

11

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.

tylerl
sumber
4
+1: soket ditingkatkan ke sistem terdistribusi sedangkan memori bersama jauh lebih cepat.
mouviciel
@tylerl Mengapa Memori bersama tidak memerlukan syscall?
Geek
@ Geek: Baca tentang cara manajemen memori virtual diimplementasikan dalam OS modern. Pada dasarnya, di bawah kap memori bersama diimplementasikan hampir identik dengan memori proses normal. Kebetulan bahwa halaman fisik yang sama sengaja dipetakan menjadi 2 (atau N) proses yang berbeda. Tetapi begitu pemetaan itu ditetapkan, * px = 5 menghasilkan set instruksi yang sama tanpa peduli apakah px menunjuk ke variabel biasa atau jika itu menunjuk ke dalam segmen memori bersama.
DXM
secara teknis Anda tidak perlu membuat cerita bersambung data melalui soket jika tujuan dapat menerima aliran byte mentah dalam format yang Anda kirim. Kebanyakan orang jelas membuat cerita bersambung sehingga mereka dapat mengirim ke siapa pun.
gbjbaanb
1
@ gbjbaanb Saya pikir secara teknis Anda membuat serialisasi data jika itu ditransmisikan sebagai string sekuensial bit, tidak peduli apa struktur pengkodeannya.
tylerl
6

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.

David Hammen
sumber