การจัดการหน่วยความจำเสมือนในระบบปฏิบัติการ Linux

1 แนวคิดของหน่วยความจำเสมือน (Virtual Memory)
หน่วยความจำเสมือน (Virtual Memory) เป็นเทคนิคของระบบปฏิบัติการที่ใช้ในการแยกพื้นที่ของแอดเดรสที่โพรเซสมองเห็น (Logical Address หรือ Virtual Address) ออกจากที่อยู่จริงในหน่วยความจำกายภาพ (Physical Address) ของ RAM โดยใช้กลไก Paging ร่วมกับการทำงานของ MMU (Memory Management Unit) ที่อยู่ภายในซีพียู ทำให้ระบบสามารถ:
ให้โพรเซสมองเห็น Address Space ขนาดใหญ่กว่าหน่วยความจำกายภาพได้ เช่น 64-bit Linux ให้พื้นที่ผู้ใช้ 128 TB ต่อโพรเซส
แยกพื้นที่หน่วยความจำของแต่ละโพรเซสออกจากกัน เพิ่มความปลอดภัยและเสถียรภาพ
ใช้พื้นที่บนดิสก์ (Swap) เป็นส่วนขยายของ RAM ผ่านกลไก Demand Paging
แชร์เพจระหว่างโพรเซสได้ เช่น Shared Library, Copy-on-Write (COW)
ภาพรวม Address Space ของโพรเซสใน Linux 64-bit
2 กลไก Address Translation และ Page Table ใน Linux
CPU ส่งคำขอด้วย Virtual Address ผ่าน MMU เพื่อแปลงเป็น Physical Address โดยใช้ Page Table หลายระดับ (Multi-Level Page Table) เพื่อประหยัดพื้นที่ Linux บน x86-64 ใช้ตารางเพจ 4 หรือ 5 ระดับ ดังนี้:
PGD: Page Global Directory
P4D: Page 4 Directory (เฉพาะเมื่อเปิด 5-level paging)
PUD: Page Upper Directory
PMD: Page Middle Directory
PTE: Page Table Entry ชี้ไปยัง Page Frame ใน RAM
ขนาดเพจมาตรฐานของ x86-64 Linux คือ 4 KB และรองรับ Huge Page 2 MB และ 1 GB เพื่อลดจำนวน TLB Miss สำหรับงานที่ใช้หน่วยความจำขนาดใหญ่
Translation Lookaside Buffer (TLB)
TLB เป็นแคชความเร็วสูงภายใน CPU ที่จดจำผลการแปลง Virtual Physical Address ล่าสุด หาก TLB Hit จะแปลงแอดเดรสได้ทันทีโดยไม่ต้องค้นใน Page Table ที่อยู่ใน RAM หาก TLB Miss CPU จะต้อง Walk Page Table ซึ่งช้ากว่าหลายเท่า การใช้ Huge Page ช่วยเพิ่ม TLB Hit Rate ได้อย่างมาก
3 Demand Paging และ Page Fault ใน Linux
Linux ใช้กลยุทธ์ Demand Paging กล่าวคือ จะโหลดเพจของโปรแกรมเข้าสู่ RAM ก็ต่อเมื่อโพรเซสอ้างอิงถึงเพจนั้นจริง การออกแบบนี้ช่วยให้การเริ่มต้นโปรแกรมเร็ว และประหยัด RAM ไปใช้กับโปรแกรมอื่น
ประเภทของ Page Fault
Minor Page Fault: เพจที่ขออยู่ใน RAM แล้ว (เช่น page cache หรือ shared library ที่โพรเซสอื่นโหลดไว้) เพียงสร้าง mapping ใหม่ - เร็วมาก
Major Page Fault: เพจไม่อยู่ใน RAM ต้องอ่านจากดิสก์ (Swap หรือไฟล์) - ช้ากว่า Minor Fault หลายเท่า
Invalid Page Fault: โพรเซสอ้างอิงแอดเดรสที่ไม่ได้รับอนุญาต Kernel จะส่งสัญญาณ SIGSEGV (Segmentation fault) ทำให้โพรเซสตาย
การตรวจสอบ Page Fault ใน Linux
4 พื้นที่ Swap ใน Linux
Swap เป็นพื้นที่ในหน่วยความจำสำรอง (โดยทั่วไปเป็น Disk Partition หรือ Swap File) ที่ Linux ใช้เก็บเพจของโพรเซสที่ไม่ได้ใช้งานบ่อย เพื่อปลดปล่อย RAM ให้กับเพจที่ใช้งานบ่อยกว่า Swap จึงเป็นส่วนหนึ่งของ Virtual Memory เพิ่มเติมจาก RAM
ประเภทของ Swap ใน Linux
Swap Partition: พาร์ทิชันแยกที่ฟอร์แมตด้วย
mkswapใช้บูตเข้าด้วยswaponในไฟล์/etc/fstab- รูปแบบดั้งเดิม เร็วและเสถียรSwap File: ไฟล์ปกติบนระบบไฟล์ เช่น ext4 ที่ถูกกำหนดเป็น swap ปรับขนาดได้ง่ายโดยไม่ต้องแบ่งพาร์ทิชันใหม่ - เป็นแนวทางที่ Ubuntu/Fedora แนะนำในปัจจุบัน
zswap / zram: แคชใน RAM ที่บีบอัดเพจก่อนสลับลงดิสก์ ทำให้ใช้ RAM ได้มากขึ้นโดยไม่ต้องอาศัยดิสก์มากนัก เหมาะกับ SSD/Embedded ที่ต้องลดการเขียนดิสก์
คำสั่งจัดการ Swap