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