ฉันกำลังพยายามหาวิธีที่ระบบปฏิบัติการจัดการกับกระบวนการที่ไม่เกี่ยวข้องหลายกระบวนการโดยโหลด DLL/ไลบรารีที่ใช้ร่วมกันเดียวกัน OS ที่ฉันกังวลคือ Linux และ Windows แต่ก็มี Mac ในระดับที่น้อยกว่าเช่นกัน ฉันคิดว่าคำตอบสำหรับคำถามของฉันจะเหมือนกันสำหรับระบบปฏิบัติการทั้งหมด
ฉันสนใจเป็นพิเศษเกี่ยวกับการเชื่อมโยงอย่างชัดเจน แต่ฉันก็อยากรู้เกี่ยวกับการเชื่อมโยงโดยนัยด้วย ฉันคิดว่าคำตอบสำหรับทั้งสองจะเหมือนกันเช่นกัน
นี่เป็นคำอธิบายที่ดีที่สุดที่ฉันพบเกี่ยวกับ Windows:
ระบบจะรักษาจำนวนการอ้างอิงต่อกระบวนการในโมดูลที่โหลดทั้งหมด การเรียก LoadLibrary จะเพิ่มจำนวนการอ้างอิง การเรียกฟังก์ชัน FreeLibrary หรือ FreeLibraryAndExitThread จะลดจำนวนการอ้างอิง ระบบจะยกเลิกการโหลดโมดูลเมื่อจำนวนการอ้างอิงถึงศูนย์หรือเมื่อกระบวนการยุติลง (โดยไม่คำนึงถึงจำนวนการอ้างอิง) - http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx
แต่มันก็ทิ้งคำถามไว้บ้าง
1.) ทำกระบวนการที่ไม่เกี่ยวข้องโหลด DLL เดียวกันซ้ำซ้อน (นั่นคือ DLL มีอยู่ในหน่วยความจำมากกว่าหนึ่งครั้ง) แทนที่จะใช้การนับการอ้างอิงหรือไม่ (IE ลงในพื้นที่ที่อยู่ของแต่ละกระบวนการตามที่ฉันคิดว่าฉันเข้าใจ)
ถ้า DLL ถูกยกเลิกการโหลดทันทีที่กระบวนการสิ้นสุดลง นั่นทำให้ฉันเชื่อว่ากระบวนการอื่นๆ ที่ใช้ DLL เดียวกันทุกประการจะมีการโหลดซ้ำซ้อนลงในหน่วยความจำ มิฉะนั้น ระบบไม่ควรได้รับอนุญาตให้เพิกเฉยต่อจำนวนการอ้างอิง
2.) หากเป็นเช่นนั้นจริง จุดอ้างอิงในการนับ DLLs เมื่อคุณโหลดหลายครั้งในกระบวนการเดียวกันคืออะไร การโหลด DLL เดียวกันสองครั้งในกระบวนการเดียวกันจะมีประโยชน์อะไร เหตุผลเดียวที่เป็นไปได้ที่ฉันคิดได้ก็คือ ถ้า EXE อ้างอิงถึง DLL สองตัว และ DLL ตัวหนึ่งอ้างอิงถึงอีกตัวหนึ่ง ก็จะมีการเรียก LoadLibrar() อย่างน้อยสองครั้งและการเรียก FreeLibrary() สองครั้งสำหรับไลบรารีเดียวกัน
ฉันรู้ว่าดูเหมือนว่าฉันกำลังตอบคำถามของตัวเองที่นี่ แต่ฉันแค่ตั้งสมมุติฐานเท่านั้น ฉันอยากจะรู้ให้แน่ชัด