ที่จริงแล้วสิ่งที่คุณอธิบายทำให้เกิดความสับสนในการทำบอลลูนและ 'การผสานหน้าเดียวกัน' ฉันจะพยายามอธิบายอย่างละเอียดทั้งสองอย่างเพื่อให้เห็นความแตกต่างที่ชัดเจน
บอลลูนหน่วยความจำ
นี่เป็นเคล็ดลับเพื่อให้แน่ใจว่าหน่วยความจำบางส่วนที่จัดสรรให้กับเครื่องเสมือนแขกยังคงสามารถใช้งานได้โดยแขกคนอื่นหรือโฮสต์ (แคช ฯลฯ ) มันทำในวิธีต่อไปนี้:
เคอร์เนลของแขกถูกฉีดด้วยไดรเวอร์ซึ่งจะตรวจสอบการใช้งานหน่วยความจำของแขกและ 'ขโมย' หน่วยความจำที่ไม่ได้ใช้บางส่วน (จัดสรรให้ตัวเองในพื้นที่หน่วยความจำของแขกดังนั้นจึงมั่นใจได้ว่าไม่มีสิ่งใดบนแขก
จากนั้นจะแจ้งโฮสต์เคอร์เนลว่าในความเป็นจริงสามารถลบหน้าหน่วยความจำเหล่านี้ออกจากแกนกลางได้ซึ่งจะไม่ถูกใช้ในเกสต์ (จนกว่าแขกจะได้รับความกดดันจากหน่วยความจำ ณ จุดที่บอลลูนจะยุบและใช้งาน ช่วงเหล่านี้อีกครั้ง)
ในที่สุดเคอร์เนลสามารถจัดสรรหน่วยความจำเดียวกันที่แน่นอนให้กับแขกคนอื่นและทำให้การใช้งานหน่วยความจำทั้งหมดมีประสิทธิภาพมากขึ้นถ้าแขกกำลังทำงานด้วยหน่วยความจำว่างมากมาย
การผสานหน้าเดียวกัน
เทคนิคนี้ระบุหน้าหน่วยความจำที่เหมือนกันซึ่งด้วยเหตุผลบางอย่างยังไม่ได้ทำเครื่องหมายว่า 'เสมือนอ่านอย่างเดียว' ด้วยการคัดลอกเมื่อเขียนและทำเครื่องหมายว่าเป็นเช่นนั้น
ตอนนี้ในระดับ OS มีความต้องการที่ จำกัด สำหรับเทคนิคเหล่านี้ เพียงแค่พอเวลาส่วนใหญ่เมื่อคุณมีหน้าหน่วยความจำที่เหมือนกันพวกเขาจะอ่านอย่างเดียว (บางครั้งแม้ไม่มี CoW) เนื่องจากส่วนใหญ่เป็นรหัสแอปพลิเคชันห้องสมุด ฯลฯ พวกเขาจะเปิดผ่านแผนที่แมปหน่วยความจำ มีเพียงสำเนาเดียวในแกนกลาง (หากมีเลยก็สามารถคัดลอกออกมาได้อย่างสมบูรณ์และอนุญาตให้เพจดังกล่าวเข้าจากร้านค้าหลักได้ตามต้องการ)
ในระดับ OS เสมือนจริงใช้หลักการเดียวกันนี้ในระบบย่อยของผู้เยี่ยมชมแต่ละระบบ อย่างไรก็ตามเคอร์เนลโฮสต์ไม่มีความคิดว่าแขกสองคนส่วนใหญ่ใช้รหัสเดียวกันและกำลังแชร์หน่วยความจำเดียวกัน - แขกไม่ได้สื่อสารเพื่อประสานงานนั้น
นี่คือเหตุผลที่บางครั้งมันสามารถสแกนทั้งระบบเพื่อหาหน้าหน่วยความจำที่เหมือนกันซึ่งส่วนใหญ่แล้วพวกมันจะเหมือนกันในระบบปฏิบัติการของแขกไม่ได้อยู่ในแต่ละระบบ - เคอร์เนลของแขกทำให้งานที่ดี ดังนั้นในสภาพแวดล้อมแบบ VM ทั่วไปที่โฮสต์เคอร์เนลหนึ่งตัวจัดการแขกมากกว่า 50 คนการประหยัดหน่วยความจำนั้นค่อนข้างมาก
ทั้งสองในครั้งเดียว
Ballooning และ Same-Page-Merging สามารถอยู่ร่วมกันได้เป็นอย่างดีเพื่อให้ได้หน่วยความจำมากเกินพอสำหรับระบบที่เหมือนกัน
เพื่อตอบคำถามของคุณ - การผสานหน้าเดียวกันและบางครั้งเปิดใช้งานในระดับระบบปฏิบัติการ มันเกี่ยวข้องกับการแบ่งปันเพจที่ถูกตีความและอาจจบลงด้วยการเหมือนกันโดยไม่ต้องมีไฟล์สำรองที่เหมือนกัน
ในตัวอย่าง Chromium ของคุณ - ไบนารีกระบวนการเองซ้ำซ้อนกันแล้วผ่านแผนที่เริ่มต้นแบบอ่านอย่างเดียว - พวกเขาแบ่งปันพื้นที่หน่วยความจำเดียวกันที่แน่นอน แคชหน้า (เนื้อหาของแท็บ) มักจะใช้ร่วมกันระหว่างกระบวนการ (อ่านอย่างเดียวคัดลอกเมื่อเขียน) เนื่องจากวิธีการแคชดิสก์ได้รับการจัดการ - ไฟล์บนดิสก์เดียวกันสามารถเปิดได้พร้อมกันระหว่างกระบวนการที่แตกต่างกันใน VM - ความรู้สึกที่ดีที่สุด
ข้อได้เปรียบจะเห็นได้ชัดที่สุดกับสถานะที่ใช้ร่วมกันของเครื่องมือ Javascript ที่แตกต่างกัน - แต่ฉันไม่แน่ใจว่าพวกเขาได้รับการจัดสรรในรูปแบบหน่วยความจำเดียวกันแน่นอนเพื่อให้แน่ใจว่าหน้าหน่วยความจำทั้งหมดเหมือนกัน
สิ่งนี้แตกต่างกันในระบบมือถือ ตัวอย่างเช่น Android ใช้ KSM อย่างกว้างขวางเพื่อขจัดรหัสซ้ำกันระหว่างแอปพลิเคชันที่แตกต่างกัน
ไม่ว่าในกรณีใดคุณสามารถเปิดใช้งานด้วยตนเองบน Linux (Kernel SamePage Merging) คนขับส่งออกสถิติต่าง ๆ ที่หลังจากอ่านคำตอบนี้คุณควรจะสามารถตีความและตัดสินใจด้วยตัวเองว่ามันเหมาะสมกับวัตถุประสงค์ของคุณหรือไม่
https://www.kernel.org/doc/Documentation/vm/ksm.txt