เห็นได้ชัดว่าการแลกเปลี่ยนเกิดขึ้นเมื่อหน้า RAM ที่ไม่ได้ใช้งานทำงานจริง
( อัปเดต:เนื่องจากมีความชัดเจนในความคิดเห็นนี่ไม่ใช่กรณีของคุณดังนั้นผู้ที่มีปัญหาเดียวกันสามารถข้ามไปยังกฎแนวนอนได้)
นั่นคือคุณมีโปรแกรมมากมายที่รันและเคอร์เนลสลับบางหน้า จากนั้นคุณเลิกโปรแกรมบางโปรแกรม เคอร์เนลทำเครื่องหมายหน้าเพจ RAM ว่าไม่ทำงาน แต่จะไม่สลับหน้ากลับไปที่ RAM จนกว่าจะต้องใช้หน้าเหล่านี้ ซึ่งส่งผลให้มีหน้าทั้งที่ไม่ใช้งานและสลับเปลี่ยน
ทำไมไม่แลกหน้าใน preemptively? เพราะนั่นจะเป็นการเดิมพันกับราคา: ในระยะยาวคุณจะแพ้ ลองนึกถึงตัวอย่างง่าย ๆ : สองโปรแกรม A และ B ที่ไม่พอดีกับ RAM ในเวลาเดียวกัน โปรแกรม A ยังคงทำงานอยู่และหน้าที่สลับเปลี่ยนทั้งหมดเป็นของ A โปรแกรม B ได้ถูกเลิกใช้และหน้าทั้งหมดที่ไม่ได้ใช้งานเป็นของ B
หากเคอร์เนลสลับหน้าเพจ A ของ preemptively และ imediately หลังจาก:
- โปรแกรม A ต้องการเข้าถึงหน้ามัน -> คุณชนะ - หน้าต่างๆอยู่ใน RAM แล้ว
- คุณเปิด B อีกครั้ง -> คุณแพ้ - คุณ "จ่าย" ค่าใช้จ่ายในการนำหน้าเว็บไปที่ RAM และตอนนี้คุณต้องส่งมันกลับมา
- คุณเปิดโปรแกรมอื่น C -> คุณจะเสียถ้า A และ C ไม่พอดีกับ RAM ในเวลาเดียวกัน หากพวกเขาพอดีคุณจะได้
นอกจากนี้ยังคำนึงถึงว่าการแลกเปลี่ยน (เขียนไปยังดิสก์) มีราคาแพงกว่าการแลกเปลี่ยน (อ่านจากดิสก์) ซึ่งทำให้ "เดิมพัน" นี้ยิ่งขี้เหร่มากขึ้น
กล่าวโดยย่อ: เชื่อใจเคอร์เนลของคุณและอย่าพยายามเอาชนะมัน
อัปเดต:
ปรากฎว่าหน่วยความจำที่ไม่ได้ใช้งานไม่ทำงานเนื่องจากการใช้การตรวจสอบกิจกรรมเพื่ออ่านบทความหน่วยความจำระบบทำให้หลายคนเชื่อว่ามันใช้งานได้ คำจำกัดความที่ให้ไว้ในบทความสำหรับหน่วยความจำที่ไม่ได้ใช้งานถูกต้อง:
ข้อมูลนี้อยู่ในหน่วยความจำ RAM แต่ไม่ได้ใช้งานอย่างรวดเร็ว แต่ก็ถูกใช้งานเมื่อไม่นานมานี้
แต่ตัวอย่างต่อไปนี้เป็นความเข้าใจผิดและเข้าใจง่ายเกินไป (เช่นตัวอย่างของฉันที่จะเปิดเผย):
ตัวอย่างเช่นถ้าคุณใช้ Mail แล้วออกจากนั้น RAM ที่ Mail ใช้นั้นถูกทำเครื่องหมายเป็นหน่วยความจำที่ไม่ได้ใช้งาน หน่วยความจำที่ไม่ใช้งานสามารถใช้งานได้โดยแอปพลิเคชั่นอื่นเช่นเดียวกับหน่วยความจำฟรี อย่างไรก็ตามถ้าคุณเปิด Mail ก่อนที่จะใช้หน่วยความจำที่ไม่ใช้งานโดยแอปพลิเคชันอื่น Mail จะเปิดเร็วขึ้นเพราะหน่วยความจำไม่ได้ใช้งานจะถูกแปลงเป็นหน่วยความจำที่ใช้งานแทนการโหลดจากไดรฟ์ที่ช้าลง
ฉันค้นหาแหล่งข้อมูลออนไลน์เพิ่มเติมและจบลงที่หัวข้อนี้ในรายการส่งเมลเคอร์เนลของดาร์วินซึ่งค่อนข้างมีข้อมูล Quoting Jim Magee (จากทีมดาร์วิน - ฉันคิดว่า):
กล่าวโดยย่อคือระบบเคอร์เนล VM เมื่อต้องรับมือกับความดันหน่วยความจำจะสแกนผ่านหน้าเว็บที่ใช้งานอยู่และพยายามรักษาระดับความสมดุลระหว่างการทำเครื่องหมายที่ใช้งานและไม่ได้ใช้งาน หน้าเว็บที่ไม่ใช้งานจะถูกสแกนเพื่อนำมาใช้ซ้ำในขณะที่ทำเครื่องหมายว่าไม่ใช้งาน หากมีการใช้ซ้ำหน้าเหล่านั้นจะถูกทำเครื่องหมายเป็นใช้งานอยู่และหน้าอื่น ๆ จะต้องย้ายจากใช้งานเป็นสถานะไม่ใช้งานเพื่อตรวจสอบว่ามีการใช้งานอยู่หรือไม่ ดังนั้นการไม่ใช้งานจึงเป็นการเรียกชื่อผิด มันเป็นชวเลขสำหรับ "อาจไม่ได้ใช้งานให้ลองยืนยันว่า"
ตามที่คุณค้นพบยอดคงเหลือภายในที่เรา (ปัจจุบัน) ตั้งเป้าไว้คือประมาณ 2/3 ที่ใช้งานอยู่กับ 1/3 ที่ไม่ได้ใช้งาน ...
สิ่งนี้อธิบายพฤติกรรมที่คุณสังเกตเห็น เช่นหน้าเว็บที่ไม่ใช้งานซึ่งคุณเห็นว่าเป็นของโปรแกรมที่ไม่ได้ใช้งาน ดังนั้นเมื่อคุณเริ่มโปรแกรมใหม่หน้าเว็บที่ไม่ใช้งานจะถูกสลับเป็น ในเวลาเดียวกันหน้าเว็บจากโปรแกรมอื่น ๆ ถูกทำเครื่องหมายว่าไม่ใช้งานเพื่อรักษาอัตราส่วน 2/1 ของการใช้งานกับการไม่ใช้งาน
ด้ายนอกจากนี้ยังมีคำแนะนำบางอย่างที่จะเรียนรู้เพิ่มเติมเกี่ยวกับ internals ดาร์วิน นอกจากนี้ยังมีข้อเสนอแนะบางอย่างในกรณีที่คุณเริ่มตรวจสอบการใช้หน่วยความจำเนื่องจากปัญหาเกี่ยวกับ beachball (ซึ่งมักจะมีส่วนเกี่ยวข้องกับเรื่องนี้เล็กน้อย)
ข้อสรุปยังคงเหมือนเดิม: วางใจเคอร์เนลของคุณและอย่าพยายามเอาชนะใคร :-)