ข้อดีและข้อเสียของการสื่อสารระหว่างกระบวนการทำผ่านซ็อกเก็ตและหน่วยความจำที่ใช้ร่วมกันคืออะไร


9

ฉันเข้าใจว่าสองตัวเลือกอื่น ๆ อีกมากมายสำหรับการสื่อสารระหว่างกระบวนการสามารถ:

  1. แชร์หน่วยความจำ
  2. ซ็อกเก็ต

จริงๆแล้วฉันเห็นตัวเลือกทั้งสองนี้ถูกเปิดเผยโดย Intellij Idea สำหรับการดีบักแอปพลิเคชัน Java ฉันต้องการทราบว่าข้อดีและข้อเสียของแต่ละวิธีคืออะไร


วิธีการที่ใหม่กว่าคือ D-Bus
ott--

@ ott-- D-Bus ไม่ได้ใช้ซ็อกเก็ตโดเมน Unix หรือไม่

@BrianMarshall แท้จริงแล้วโดเมนและซ็อกเก็ต tcp / ip
ott--

มีคำตอบอยู่ที่นี่เช่นกัน: stackoverflow.com/a/1844919/632951
Pacerier

คำตอบ:


11

ข้อได้เปรียบบางประการสำหรับการปิดส่วนหัวของฉัน โปรดทราบว่าบางรายการเหล่านี้อาจไม่สามารถใช้ได้ในทุกกรณี นี่เป็นเพียงข้อสังเกตทั่วไป

ซ็อกเก็ต

ง่ายและควบคุม สามารถขยายไปยังซ็อกเก็ตเครือข่ายได้ตามความจำเป็นโดยมีการดัดแปลงเพียงเล็กน้อยหรือไม่มีเลย รูปแบบการเขียนโปรแกรมจำเป็นต้องมีการทำให้เป็นอนุกรมซึ่งในทางกลับกันคุณต้องคิดว่าข้อมูลที่ได้รับการถ่ายโอนจาก A ถึง B จริง ๆ แล้วการซิงโครไนซ์จำเป็นต้องมีอยู่แล้วภายในกลไกการสื่อสาร ไม่จำเป็นต้องทำข้อมูลให้ตรงกันอื่น ๆ

แชร์หน่วยความจำ

ไม่จำเป็นต้องมี syscall (ดังนั้นอาจเร็วกว่า) การแชร์ไม่ได้ต้องการข้อมูลที่จะถ่ายโอนอย่างชัดเจน - ข้อมูลสามารถทำให้ผู้รับไม่สามารถดึงข้อมูลได้ (แบนด์วิธไม่จำเป็นต้องสูญเสียการถ่ายโอนข้อมูลที่ผู้รับจะไม่ใช้) ไม่มีขั้นตอนการทำให้เป็นอนุกรม / การดีซีเรียลไลเซชันหมายความว่าไม่มีเวลาที่ใช้ในการสื่อสาร


4
+1: ซ็อกเก็ตขยายระบบการกระจายในขณะที่หน่วยความจำที่แชร์นั้นเร็วกว่ามาก
mouviciel

@tylerl เหตุใดหน่วยความจำที่แชร์จึงไม่ต้องการ syscall
Geek

@Geek: อ่านวิธีการใช้งานการจัดการหน่วยความจำเสมือนในระบบปฏิบัติการสมัยใหม่ โดยพื้นฐานแล้วภายใต้หน่วยความจำที่ใช้ร่วมกันของฮูดนั้นมีการใช้งานเกือบเหมือนกับหน่วยความจำกระบวนการปกติ มันจึงเกิดขึ้นว่าหน้าฟิสิคัลเดียวกันมีจุดประสงค์ในการแมปเข้ากับกระบวนการที่แตกต่างกัน 2 (หรือ N) แต่เมื่อมีการสร้างการแมปแล้ว * px = 5 จะสร้างชุดคำสั่งเดียวกันโดยไม่คำนึงว่า px จะชี้ไปที่ตัวแปรปกติหรือชี้ไปที่ส่วนของหน่วยความจำที่แชร์
DXM

ในทางเทคนิคคุณไม่จำเป็นต้องทำให้เป็นอนุกรมข้อมูลผ่านซ็อกเก็ตหากปลายทางสามารถรับสตรีมไบต์ดิบในรูปแบบที่คุณส่ง คนส่วนใหญ่เป็นอันดับที่เห็นได้ชัดเพื่อให้พวกเขาสามารถส่งถึงใคร
gbjbaanb

1
@gbjbaanb ฉันคิดว่าในทางเทคนิคแล้วคุณเป็นอันดับข้อมูลถ้ามันได้รับการส่งเป็นสตริงลำดับของบิตไม่ว่าโครงสร้างการเข้ารหัสคืออะไร
tylerl

6

ซ็อกเก็ตเป็นแบบหนึ่งต่อหนึ่ง คุณต้องใช้ซ็อกเก็ตหลายตัวหากคุณต้องการส่งสิ่งเดียวกันไปยังหลายกระบวนการ ด้วยหน่วยความจำที่แชร์คุณสามารถมีผู้อ่านหลายคนและนักเขียนหลายคน

ซ็อกเก็ตเป็นทรัพยากรเข้มข้น แต่ละข้อความจะต้องผ่านระบบปฏิบัติการ ด้วยหน่วยความจำที่ใช้ร่วมกันคุณจะแมปหน่วยความจำที่แชร์ แต่เมื่อเข้าไปในหน่วยความจำของแอปพลิเคชันของคุณและจากนั้นก็เป็นของคุณที่จะใช้ อย่างไรก็ตามคุณยังคงต้องผ่านระบบปฏิบัติการเมื่อคุณใช้หน่วยความจำที่แชร์ ดูด้านล่าง

ซ็อกเก็ตได้รับการซิงโครไนซ์ (ตราบใดที่คุณไม่ได้ใช้ UDP) ด้วยหน่วยความจำที่ใช้ร่วมกันคุณแทบจะต้องมีกลไกเพิ่มเติมเพื่อบอกกระบวนการอื่น ๆ ว่าเป็นเรื่องปกติ / ไม่เป็นไรที่จะอ่านหรือเขียนไปยังหน่วยความจำที่ใช้ร่วมกัน อย่าทำเช่นนี้และคุณจะพบปัญหากับหน่วยความจำที่เสียหาย ตัวอย่าง: สมมติว่ากระบวนการ A เริ่มอ่านหน่วยความจำแบบแบ่งใช้ แต่รับการสับเปลี่ยนระหว่างการอ่าน กระบวนการ B เขียนไปยังหน่วยความจำที่แชร์อันเดียวกัน เมื่อโพรเซส A รีสตาร์ทและอ่านหน่วยความจำที่ใช้ร่วมกันต่อไปสิ่งที่มันได้อ่านคือความผิดพลาดของข้อมูลเก่าและใหม่ เพื่อป้องกันปัญหานี้คุณยังคงต้องผ่านระบบปฏิบัติการเมื่อคุณใช้หน่วยความจำที่ใช้ร่วมกัน

ค่อนข้างง่ายในการแปลงชุดแอพพลิเคชั่นซ็อกเก็ตเป็นแอพที่ใช้ซ็อกเก็ตเครือข่าย คุณสามารถแพร่กระจายการประมวลผลไปยังเครื่องจักรทั้งหมดในห้องปฏิบัติการของคุณหรือแม้แต่ไกลออกไป ไม่สามารถทำได้ด้วยหน่วยความจำที่แชร์ คุณถูกล็อคเครื่องหนึ่งด้วยโซลูชันที่อิงกับหน่วยความจำที่ใช้ร่วมกัน

ซ็อกเก็ตมีไว้สำหรับปริมาณข้อมูลที่น้อยหน่วยความจำที่ใช้ร่วมกันสำหรับข้อมูลจำนวนมาก มีกลไกต่าง ๆ ในการแก้ปัญหาต่าง ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.