การจัดการหน่วยความจำ Memory Management นงลักษณ์ พรมทอง และวิเชษฐ์ พลายมาศ การจัดการหน่วยความจำ Memory Management
Learning Objectives เพื่อศึกษาแนวคิดพื้นฐานเกี่ยวกับการประสานเวลาของซีพียู ปัญหาและวิธีการแก้ไขเกี่ยวกับการประสานเวลา เพื่อเข้าใจเกี่ยวกับการจัดการหน่วยความจำวิธีต่างๆ และขั้นตอนวิธีของการจัดการหน่วยความจำ เพื่อวิเคราะห์เปรียบเทียบข้อดีข้อเสียของวิธีการจัดการวิธีต่างๆ
Agenda แนวคิดพื้นฐาน (Background) การสับเปลี่ยน (Swapping) การจัดสรรหน่วยความจำแบบพื้นที่ติดกัน (Contiguous Allocation) การสลับหน้า (Paging) การแบ่งส่วนหรือเซ็กเมนต์ (Segmentation) การผสมผสานหน่วยความจำการสลับหน้าและการแบ่งส่วน (Segmentation with Paging)
แนวคิดพื้นฐาน Background คำสั่งที่จะถูกดำเนินการได้โดยซีพียู จะต้องถูกดึงมาและเก็บที่ตำแหน่งในหน่วยความจำ รูปแบบการทำงานของรอบคำสั่งเครื่องและการปฏิบัติงานตามคำสั่ง (instruction-execution cycle) จะมีขั้นตอนการทำงาน ดังนี้ ไปนำมา (fetch) คือการเริ่มต้นการทำงานซึ่งระบบจะทำการดึงคำสั่งแรกจากหน่วยความจำ ถอดรหัส (decode) คือการทำงานต่อจากขั้นตอนที่ 1 โดยนำคำสั่งนี้ไปทำการถอดรหัส ซึ่งอาจจะได้ตัวดำเนินการหรือข้อมูล เพื่อใช้กับคำสั่งถัดไป กระทำการ (execution) คือการทำงานต่อจากขั้นตอนที่ 2 ซึ่งหลังจากนั้นคำสั่งจะทำงานตามตัวดำเนินการที่ได้ จัดเก็บ (store) ผลลัพธ์จะถูกเก็บกลับไปในหน่วยความจำหลักต่อไป
การกำหนดตำแหน่ง Background (2) โปรแกรมต้องนำรหัสเครื่อง (machine code) จากหน่วยเก็บเข้ามาไว้ในหน่วยความจำเพื่อให้พร้อมดำเนินการในรูปของกระบวนการ แถวคอยขาเข้า (Input queue) การสะสมของกระบวนการในดิสก์ที่รอยคอยอยู่ เพื่อที่จะเข้ามาทำงานในหน่วยความจำหลักเพื่อดำเนินการโปรแกรม เลือกกระบวนการในแถวคอยขาเข้า และดึงกระบวนการไปไว้ในหน่วยความจำหลัก แล้วกระบวนการจะทำงานเข้าถึงคำสั่งและข้อมูล หลังจากนั้น กระบวนการจะออกจากหน่วยความจำหลัก ทำให้หน่วยความจำหลักว่างลงสำหรับกระบวนการใหม่เข้ามาใช้งานได้
การกำหนดตำแหน่ง Background (3) ภาพที่ 6.1 การกำหนดเลขที่อยู่ให้กับกระบวนการในหน่วยความจำหลัก
การนำคำสั่งและข้อมูลเข้าสู่หน่วยความจำ Background (3) โปรแกรมผู้ใช้จะต้องทำงานหลายขั้นตอนจนกว่าจะถูกดำเนินการ (run) การกำหนดเลขที่อยู่ของโปรแกรม (คำสั่งและข้อมูล) เพื่อแปลงไปเป็นเลขที่อยู่ในหน่วยความจำหลัก มีขั้นตอนดังนี้ ช่วงเวลาแปล (Compile time) ถ้ารู้จักตำแหน่งหน่วยความจำไว้แล้ว สามารถแปลเลขที่อยู่สัมบูรณ์ (absolute address) ซึ่งเป็นตำแหน่งจริงในหน่วยความจำหลักได้เลย แต่ถ้าตำแหน่งเริ่มต้นเปลี่ยน ก็ต้องเริ่มแปลใหม่ ช่วงเวลาบรรจุ (Load time) ถ้ายังไม่รู้ว่าโปรแกรมจะทำงาน ณ เลขที่อยู่ใดในช่วงเวลาขณะที่แปลโปรแกรม จะต้องแปลเลขที่อยู่เป็นแบบย้ายได้ (relocatable) ช่วงเวลากระทำการ (Execution time) การผูกเลขที่อยู่จะถูกหน่วงเวลาไว้จนกระทั่งถึงช่วงเวลาดำเนินการ กระบวนการมีการย้ายตลอดการทำงานจากหน่วยความจำหลักตอนหนึ่งไปอีกตอนหนึ่ง การกำหนดตำแหน่งต้องมีการหน่วงเวลาจนกระทั่งมีการทำงานจริง (run time) จะต้องมีฮาร์ดแวร์เฉพาะเตรียมไว้สำหรับการทำงานลักษณะนี้ด้วย (e.g., base and limit registers)
ภาพที่ 6.2 ขั้นตอนต่างๆ ในการเรียกใช้งานของโปรแกรมผู้ใช้
พื้นที่ว่างของเลขที่อยู่แบบตรรกะและแบบกายภาพ Logical vs พื้นที่ว่างของเลขที่อยู่แบบตรรกะและแบบกายภาพ Logical vs. Physical Address Space แนวคิดเกี่ยวกับพื้นที่แบบตรรกะและแบบกายภาพ ถือเป็นแกนกลางของการจัดการหน่วยความจำ เลขที่อยู่แบบตรรกะ (Logical address) เลขที่อยู่ที่ถูกสร้างขึ้นโดยซีพียู บางทีเรียกว่า เลขที่อยู่เสมือน (virtual address) เลขที่อยู่แบบกายภาพ (Physical address) เลขที่อยู่ซึ่งถูกมองเห็นได้โดยหน่วยความจำ ถูกบรรจุเข้าที่เรจิสเตอร์เลขที่อยู่ของหน่วยความจำ (memory-address register) ในช่วงเวลาแปลและช่วงเวลาบรรจุ จะมีเลขที่อยู่แบบตรรกะและแบบกายภาพเหมือนกัน แต่ในช่วงเวลากระทำการ เลขที่อยู่ของทั้งสองแบบจะแตกต่างกัน กลุ่มของเลขที่อยู่แบบตรรกะทั้งหมดที่ถูกสร้างโดยโปรแกรมเรียกว่า พื้นที่ว่างของเลขที่อยู่แบบตรรกะ (logical address space) กลุ่มของเลขที่อยู่แบบกายภาพที่สอดคล้องกับเลขที่อยู่แบบตรรกะเหล่านั้นจะเรียกว่า พื้นที่ว่างของเลขที่อยู่แบบกายภาพ (physical address space)
หน่วยจัดการหน่วยความจำ Memory-Management Unit (MMU) เมื่อบรรจุกระบวนการเข้ามาในหน่วยความจำ Logical Address จะต้องถูกแปลงไปเป็น Physical Address เรียกวิธีการนี้ว่าการย้ายเลขที่อยู่ (Relocation) ฮาร์ดแวร์ทำหน้าที่แปลงเลขที่อยู่เสมือนให้เป็นเลขที่อยู่จริงแบบกายภาพคือ MMU เรจิสเตอร์ฐานทำหน้าที่เป็นเรจิสเตอร์สำหรับย้ายเลขที่อยู่ (relocate register) เพื่อใช้อ้างอิงเลขที่อยู่ในหน่วยความจำทุกครั้ง ต้องนำค่าอ้างอิงที่ได้มาบวกกับค่าเรจิสเตอร์ฐานเสียก่อนจึงจะได้เลขที่อยู่จริง โปรแกรมผู้ใช้จึงติดต่อกับเลขที่อยู่แบบตรรกะ (logical addresses) เท่านั้น จากนั้น MMU จะทำการแปลงเลขที่อยู่แบบตรรกะไปเป็นแบบกายภาพ (real physical) ให้เอง
ภาพที่ 6.3 การย้ายตำแหน่งแบบพลวัตโดยใช้เรจิสเตอร์ย้ายตำแหน่ง (Dynamic relocation using a relocation register)
การบรรจุแบบพลวัต Dynamic Loading เพื่อให้สามารถใช้หน่วยความจำหลักได้อย่างมีประสิทธิภาพสูงสุด วิธีการบรรจุแบบพลวัต (dynamic loading) เป็นการนำโปรแกรมไปไว้ในหน่วยความจำแบบสัมพัทธ์ (relative memory) โปรแกรมย่อย (routine) ที่ไม่ได้มีการทำงาน จะไม่ถูกนำมาไว้ในหน่วยความจำหลัก แต่จะนำไปไว้ในหน่วยความจำหลักเมื่อมีการเรียกใช้โปรแกรมย่อยนี้เท่านั้น ไม่จำเป็นต้องอาศัยคำสั่งพิเศษใดๆ จากระบบปฏิบัติการ แต่เป็นหน้าที่ของผู้ออกแบบโปรแกรมเอง ระบบปฏิบัติการอาจช่วยได้โดยการจัดเตรียมรูทีนจากคลัง (library routine) สำหรับใช้งานการบรรจุแบบพลวัตไว้ให้
การเชื่อมโยงแบบพลวัต Dynamic Linking OS บางชนิดจะสนับสนุนเฉพาะการเชื่อมโยงแบบคงที่ (static linking) การเชื่อมโยงแบบพลวัตนั้น การเชื่อมโยงโปรแกรมจะถูกหน่วงเวลาไว้ก่อน จนกว่าจะถึงเวลากระทำการ (execution time) ในขณะทำการเชื่อมโยงแบบพลวัต โปรแกรมย่อยจะมีการสร้างชุดคำสั่งเรียกระบบ (stub) ซึ่งมีขนาดเล็ก เพื่อใช้เรียกรูทีนจากคลังที่ต้องการขณะทำงาน stub จะทำงานโดยการเปลี่ยนโปรแกรมตัวเองเป็นตำแหน่งของโปรแกรมย่อยในระบบ และกระทำการกับโปรแกรมย่อยนั้น การเชื่อมโยงแบบพลวัตใช้กันอย่างแพร่หลายโดยเฉพาะใน routine library เรียกว่า การใช้คลังร่วมกัน (shared libraries)
ตัวอย่างการทำงานของโปรแกรม Static Linked Library (Link ก่อนรัน) ขนาดไฟล์ EXE จะใหญ่ Dynamic Linked Library (Link ตอนรัน) ขนาดไฟล์ EXE เล็ก จะมีไฟล์ DLL พ่วงเข้ามาด้วย ใช้ไฟล์ DLL ร่วมกันในหลายๆกระบวนการได้ โปรแกรมบน DOS เป็น Static linked
ปัญหาของการจองพื้นที่ หน่วยความจำมักจะมีน้อยกว่าความต้องการของทุกกระบวนการเสมอ มีหลายเทคนิคที่ใช้ในการจองพื้นที่ของกระบวนการ การซ้อนทับ (Overlay) การสับเปลี่ยน (Swapping) การจัดสรรพื้นที่แบบส่วนเดียว (Single Partition Allocation) การจัดสรรพื้นที่แบบหลายส่วน (Multiple Partition Allocation)
การซ้อนทับ Overlay เพื่อจัดสรรพื้นที่ว่างให้กระบวนการที่มีขนาดใหญ่กว่าขนาดของหน่วยความจำสามารถทำงานได้ การซ้อนทับ (overlay) คือ การเก็บคำสั่งและข้อมูลไว้ในหน่วยความจำเฉพาะที่จำเป็นต้องใช้ในขณะนั้นเท่านั้น ส่วนที่เหลือให้เก็บไว้ในหน่วยเก็บที่อื่นก่อน เมื่อจำเป็นต้องใช้จึงเรียกเอามาจากหน่วยเก็บดังกล่าวเข้ามาซ้อนทับพื้นที่เดิมในหน่วยความจำ ผู้เขียนโปรแกรมต้องออกแบบการแบ่งส่วนทั้งหมด ซึ่งเป็นงานที่ค่อนข้างยุ่งยากเพราะผู้เขียนโปรแกรมต้องรู้เกี่ยวกับโครงสร้างของโปรกรม การทำงาน ตลอดจนโครงสร้างข้อมูลที่ใช้ในโปรแกรมเป็นอย่างดี
การซ้อนทับ (2) Overlay พัฒนาจากธรรมชาติของโปรแกรม ที่มีการทำงานซ้ำๆ กันหลายๆ รอบ เช่น การแปลรหัสของ Compiler หรือ Assemble จะทำการแบ่งรหัสออกเป็นส่วนๆ จะมีบางส่วนที่ใช้ซ้ำกันในแต่ละรอบ หากเราโหลดเฉพาะข้อมูลที่จะใช้ในแต่ละรอบก็จะเป็นการประหยัด ข้อมูลในรอบก่อนหน้าที่ไม่ใช้จะถูกซ้อนทับ (Overlay) ไป
ภาพที่ 6.4 การซ้อนทับสำหรับตัวแปลภาษาแอสแซมบลีแบบแปลสองรอบ
การสับเปลี่ยน Swapping กระบวนการจำเป็นต้องอยู่ในหน่วยความจำหลักขณะทำงาน แต่อาจถูกสับเปลี่ยน (swap) ไปเก็บไว้ในหน่วยเก็บชั่วคราวได้แล้วถูกนำกลับมาใหม่เพื่อทำงานต่อ เป็นหลักการเดียวกับหน่วยความจำเสมือน (virtual Memory) หน่วยเก็บความจุสูง (Backing store) จานแม่เหล็กที่มีความเร็วสูง ขนาดใหญ่สามารถเก็บกระบวนการทั้งหมดในเวลาเดียวกันได้เพียงพอ และต้องสามารถอ่าน-เขียน ที่ตำแหน่งใดๆ ก็ได้โดยตรง (direct access) หมุนออกและหมุนเข้า (Roll out, roll in) การสับเปลี่ยนกระบวนการ เกิดในระบบที่ใช้ลำดับความสำคัญเป็นเกณฑ์ในการจัดตารางการทำงาน (priority base) ตัวจัดการหน่วยความจำหลักอาจสับเปลี่ยนงานที่มีความสำคัญต่ำออกไปชั่วคราว แล้วให้งานที่มีความสำคัญสูงกว่าเข้าทำงานจนเสร็จก่อนจึงสับเปลี่ยนงานที่มีความสำคัญต่ำกลับมาทำงานต่อ เวลาส่วนใหญ่ของการสลับงานคือ เวลาถ่ายโอน และเวลาถ่ายโอนทั้งหมดจะมีสัดส่วนแปรผันตรงกับจำนวนครั้งของการสับเปลี่ยนหน่วยความจำ
Schematic View of Swapping ภาพที่ 6.5 การสับเปลี่ยนสองกระบวนการโดยใช้จานแม่เหล็กเป็นหน่วยพักชั่วคราว
การจัดสรรพื้นที่แบบส่วนเดียว (Single Partition Allocation) จะแบ่งพื้นที่หน่วยความจำออกเป็น 2 ส่วน ระบบ (System) ผู้ใช้ (User) แต่ละส่วนจะใช้แยกจากกัน และงานคนละประเภท เช่นเดียวกับระบบเชิงกลุ่ม (Batch system) ซึ่ง DOS ใช้วิธีนี้ USER OS
การวางข้อมูลของกระบวนการ จะวางอย่างไร (ใน User Area) ให้ไม่ทับกับส่วน System วางให้ไกลจากกันมากที่สุด Process1 โอกาส Error ก็ยากขึ้น OS
การจัดสรรหน่วยความจำแบบพื้นที่ติดกัน Contiguous Allocation หน่วยความจำหลักถูกแบ่งเป็นสองส่วน ระบบปฏิบัติการฝังตัว (Resident OS), มักอยู่ในหน่วยความจำส่วนล่างพร้อมกับ interrupt vector กระบวนการผู้ใช้ อยู่ในหน่วยความจำส่วนบน ส่วนของ OS ที่ไม่ค่อยได้ใช้งานจะถูกแยกไปเก็บไว้บนดิสก์ เรียกว่า ภาวะชั่วครู่ (transient)
การจัดสรรหน่วยความจำแบบพื้นที่ติดกัน Contiguous Allocation หน่วยความจำหลักถูกแบ่งเป็นสองส่วน ระบบปฏิบัติการฝังตัว (Resident OS), มักอยู่ในหน่วยความจำส่วนล่างพร้อมกับ interrupt vector กระบวนการผู้ใช้ อยู่ในหน่วยความจำส่วนบน ส่วนของ OS ที่ไม่ค่อยได้ใช้งานจะถูกแยกไปเก็บไว้บนดิสก์ เรียกว่า ภาวะชั่วครู่ (transient) การจัดสรรพื้นที่แบบขนาดคงที่ (fixed-size partition) หรือแบบส่วนเดียว (Single-partition allocation) ชุดของเรจิสเตอร์ย้ายตำแหน่ง (Relocation-register scheme) จะใช้สำหรับป้องกับกระบวนการผู้ใช้จากกระบวนการอื่น และจากการเปลี่ยนรหัสของ OS และข้อมูล ชุดของเรจิสเตอร์ย้ายตำแหน่ง บรรจุด้วยค่าเลขที่อยู่เชิงกายภาพที่เล็กที่สุด, base register บางครั้งเรียก Offset บรรจุขอบเขตของที่อยู่เชิงตรรกะ ซึ่งแต่ละเลขที่อยู่จะต้องมีค่าน้อยกว่า limit register
ภาพที่ 6.6 Base register และ limit register ทำหน้าที่กำหนดขอบเขตเลขที่อยู่เชิงตรรกะ
ภาพที่ 6.7 ฮาร์ดแวร์สนับสนุนการใช้ย้ายตำแหน่งด้วยเรจิสเตอร์ฐานและเรจิสเตอร์ขอบเขต
การแบ่งพื้นที่แบบหลายส่วน (Multiple Partition Allocation) เป็นวิธีที่มีความยืดหยุ่นมากกว่าแบบ Single Partition มี 2 แบบ Fixed Sized Partition ทุกๆ Partition มีขนาดเท่าๆกัน Dynamic Allocation ขนาดของ Partition ปรับตามขนาดของกระบวนการ
การแบ่งส่วนแบบขนาดคงที่ Fix Sized Partition 500B 1000B ใช้ 2 Partition 2100B ใช้ 3 Partition เกิดปัญหาอะไร ? จะมีพื้นที่จองไว้แต่ไม่ได้ใช้งานเลย
การแบ่งส่วนแบบขนาดคงที่ Fix Sized Partition 1200B ใช้ 1200B 2580B ใช้ 2580B เกิดปัญหาอะไร ? เมื่อจองใกล้เต็มจะมีพื้นที่ขนาดเล็กที่ใช้ไม่ได้
การจัดสรรหน่วยความจำแบบพื้นที่ติดกัน Contiguous Allocation (cont.) การจัดสรรพื้นที่แบบหลายส่วน (Multiple-partition allocation) พื้นที่ว่าง (Hole) – บล็อกพื้นที่ว่างในหน่วยความจำ พื้นที่ว่างขนาดต่างๆ ที่กระจายตลอดหน่วยความจำ เมื่อกระบวนการมาถึง ก็จะถูกจัดสรรหน่วยความจำจากพื้นที่ว่างขนาดที่ใหญ่เพียงพอกับกระบวนการนั้น OS จะเก็บข้อมูลเกี่ยวกับ a) ส่วนที่ถูกจัดสรร (allocated partitions) b) ส่วนที่ว่าง (free partitions/hole) OS OS OS OS process 5 process 5 process 5 process 5 process 9 process 9 process 8 process 10 process 2 process 2 process 2 process 2
การแตกกระจาย Fragmentation จากการจองพื้นที่แบบ Multiple Partition จะทำให้เกิดสิ่งนี้ มี 2 ประเภท Internal Fragmentation (เกิดกับแบบ Fixed Sized) External Fragmentation (เกิดกับแบบ Dynamic) Fix Sized Dynamic P1 ใช้ ใช้จริง จอง ไม่มีใครใช้ได้ P2 ใช้ Internal Fragment External Fragment
การสูญเปล่าที่เกิดจากการแตกกระจาย Fragmentation การแตกกระจายแบบภายนอก (External Fragmentation) พื้นที่หน่วยความจำซึ่งว่างเป็นช่วงๆ ไม่ต่อเนื่องกัน มีขนาดเล็กเกินไปสำหรับงานที่รอคอยอยู่ การแตกกระจายแบบภายใน (Internal Fragmentation) การจัดสรรพื้นที่หน่วยความจำที่มีขนาดใหญ่เกินกว่าที่กระบวนการร้องขอ ส่วนที่เหลือไว้ยังไม่ได้ถูกนำไปใช้งาน การลดการแตกกระจายแบบภายนอกสามารถทำได้โดยการอัดแน่น/การกระชับพื้นที่ (compaction) การสับเปลี่ยนพื้นที่ว่างในระบบให้มาอยู่รวมกันเป็นผืนเดียวกันต่อเนื่องกัน สามารถทำได้เฉพาะกรณีที่การย้ายตำแหน่งเป็นแบบสัมพัทธ์และเกิดขึ้นในขณะทำงานเท่านั้น
การอัดแน่น Compaction สำหรับการจองพื้นที่แบบ Dynamic Allocation นั้นจะจองหน่วยความจำไปเรื่อยๆ หากจองไปเรื่อยๆก็จะเกิด External Fragmentation เราสามารถบีบอัดพื้นที่ที่อยู่กระจายกันให้มาติดกันได้ จะทำให้เหลือพื้นที่ว่างมากขึ้นและไม่เกิด External Fragmentation ข้อเสียก็คือทำงานช้าลง เพราะต้อง Copy ข้อมูลทีละไบท์
ปัญหาการจัดสรรหน่วยเก็บแบบพลวัต Dynamic Storage-Allocation Problem การจัดลงตัวครั้งแรก First-fit: การเลือกพื้นที่แรก (first hole) ที่พบว่ามีขนาดใหญ่กว่า หรือเท่ากับพื้นที่ที่ต้องการ การจัดแล้วพอดีที่สุด Best-fit: การเลือกพื้นที่ที่มีขนาดใกล้เคียงกับขนาดพื้นที่ที่ต้องการมากที่สุด (smallest hole) ซ(ทำให้เกิดช่องว่างใหม่เล็กที่สุด) การจัดแล้วเหลือมากที่สุด Worst-fit: การเลือกพื้นที่ที่มีขนาดใหญ่กว่าขนาดพื้นที่ที่ต้องการมากที่สุด (largest hole) (ทำให้เกิดช่องว่างใหม่ใหญ่ที่สุด) วิธีแรก First-Fit และ Best-Fit ดีกว่าวิธี Worst-Fit ในแง่ของเวลาที่ลดลง และประสิทธิผลในการใช้หน่วยเก็บข้อมูล
การจัดลงตัวครั้งแรก First Fit 20K เจอพื้นที่ว่างเมื่อไรก็จองทันที วิ่ง Scan หาจากบนลงล่าง ทำงานได้เร็ว ข้อมูลกระจุกตัวอยู่แต่ข้างบน อาจเกิด Fragment ที่มีขนาดใหญ่ได้ First
การจัดแล้วพอดีที่สุด Best-Fit 20K ทำการ Scan จากบนลงล่าง คำนวณในแต่ละพื้นที่ทั้งหน่วยความจำ ตรงไหนมีขนาดใกล้เคียงกับขนาดของ โปรเซสที่สุดก็จะจองตรงนั้น ระบบทำงานช้า เพราะคำนวณมาก เกิด Fragment ขนาดเล็ก แต่มีจำนวนมาก อาจต้อง Compact บ่อย 28K Best 23K
การจัดแล้วเหลือมากที่สุด Worst-fit 20K ทำการ Scan จากบนลงล่าง คำนวณในแต่ละพื้นที่ทั้งหน่วยความจำ ตรงไหนมีขนาดใหญ่กว่าขนาดของ โปรเซสที่สุดก็จะจองตรงนั้น ระบบทำงานช้า เพราะคำนวณมาก โอกาสเกิด Fragment น้อยลง 10K Worst 28K 5K
การสลับหน้า Paging การจัดสรรพื้นที่หน่วยความจำแบบตรรกะให้แต่ละกระบวนการที่ผ่านมานั้น ใช้ได้กับพื้นที่ว่างแบบกายภาพที่เรียงต่อเนื่องกันเท่านั้น การสลับหน้า (paging) สามารถทำให้กระบวนการเข้าไปอยู่ในหน่วยความจำหลักได้โดยไม่ต้องมีพื้นที่ที่เรียงต่อเนื่องกันทั้งกระบวนการ หน่วยความจำแบบกายภาพ (physical memory) จะถูกแบ่งเป็นส่วนๆ แต่ละส่วนมีขนาดเท่ากันเรียกว่า เฟรม (frame) หน่วยความจำแบบตรรกะ (logical memory) ก็จะถูกแบ่งออกเป็นส่วนๆ เรียกว่า หน้า (page) มีขนาดเท่ากับแต่ละเฟรม
การสลับหน้า Paging มีการจัดเก็บรายการเฟรมว่างไว้ ในการรันโปรแกรมขนาด n page ต้องค้นหาเฟรมว่างขนาด n เพื่อบรรจุโปรแกรม สร้างตารางหน้า (page table) เพื่อแปลงไปเป็นที่อยู่เชิงกายภาพ (physical addresses) อาจเกิด Internal fragmentation 1 โปรเซสมีขนาด 3 Pages Frames 2 1 Process แต่ละ Page จะใช้พื้นที่ใดก็ได้ ไม่ต้องติดกันก็ได้ Memory
วิธีการแปลงเลขที่อยู่ Address Translation Scheme ทุกตำแหน่งถูกกำหนดโดยซีพียู แบ่งเป็น 2 ส่วนคือ (page number (p)) และ ออฟเซตของหน้า (page offset (d)) หมายเลขหน้า Page number (p) – ใช้เป็นตัวชี้ไปยังตารางเลขหน้า (page table) ในตารางเลขหน้าที่จะมีค่าตำแหน่งฐาน หรือจุดเริ่มต้น (base address) ของหน้าจริงในหน่วยความจำหลัก ออฟเซตของหน้า Page offset (d) – ค่าตำแหน่งหน้าจริงที่รวมกับออฟเซตของหน้า จะเป็นตำแหน่งจริง (physical memory address) ในหน่วยความจำหลัก
Address Translation Architecture ฮาร์ดแวร์สำหรับการสลับหน้า
Paging Example แบบจำลองการสลับหน้าของหน่วยความจำแบบกายภาพและตรรกะ
Paging Example ตัวอย่างการสลับหน้าสำหรับหน่วยความจำขนาด 32 ไบต์ ออกเป็นหน้าขนาด 4 ไบต์
เฟรมว่าง Free Frames Before allocation After allocation
การคำนวณหา Address จริง (Physical Address) สำหรับโปรเซสจะมองเป็น p : d (Page : offset) Page = หมายเลขของ Page, offset = ตำแหน่งของข้อมูลที่อ้างอิงภายใน Page นั้นโดยนับจากขอบของ page 1 ข้อมูลของ Page ที่ 1 อยู่ห่างจากต้น Page ไป 30 ไบต์ 1 : 30 2 ต่อ -->
ตารางหน้า Page Table ในหน่วยความจำจะเก็บข้อมูลนี้ไว้ ในรูปแบบตาราง เป็นข้อมูลที่บอกว่า Page แต่ละตัวอยู่ที่ Frame ไหนบ้าง Page No. Frame No. 4 1 5 2 Page2 1 2 Page0 4 5 Page1
คำนวณโดยใช้ฮาร์ดแวร์ MMU จะคำนวณหา Physical Address ให้กับ CPU จะหา Frame No. ก่อนแล้วบวกกับ offset จาก Frame No. ก็หา Add. เริ่มต้นของ Frame ได้ Memory Real Addr. CPU p d f d page frame 4 1 5 2
หน้าร่วม (Shared Pages) แต่ละหน้ามีหน้าที่ (Function) แตกต่างกัน บาง Page สามารถใช้ร่วมกันได้ระหว่างหลายโปรเซส code1 code1 code1 code2 code2 code2 Memory data1 data1 data2 ประหยัดหน่วยความจำ มากกว่าการโหลดทั้งหมดจาก ทั้ง 2 โปรเซส data2 P1 P2
การแบ่งเป็นตอน/การแบ่งส่วน (Segmentation) จะโหลด main program ไปก่อนเพียง segment เดียว แล้วเมื่อมีการเรียก section อื่นๆก็จะโหลดเข้ามาในหน่วยความจำภายหลัง (Load on demand) ดังนั้น จะประหยัดกว่าโหลดทั้งหมดในครั้งเดียว
การแบ่งเป็นตอน/การแบ่งส่วน (Segmentation) โครงร่างของการจัดการหน่วยความจำที่สนับสนุนมุมมองของผู้ใช้ในภาพของหน่วยความจำ จะแบ่งข้อมูลออกเป็น Segment ตามฟังก์ชั่นการทำงาน แต่ละ Segment ไม่จำเป็นต้องมีขนาดเท่ากัน ดังนั้น โปรแกรมคือ หน่วยรวมของเซ็กเมนท์ เซ็กเมนท์ คือหน่วยทางตรรกะชนิดหนึ่งอย่างเช่น main program, procedure, function, method, object, local variables, global variables, common block, stack, symbol table, arrays
User’s View of a Program จะโหลด main program ไปก่อนเพียง segment เดียว แล้วเมื่อมีการเรียก section อื่นๆก็จะโหลดเข้ามาในหน่วยความจำภายหลัง (Load on demand) ดังนั้น จะประหยัดกว่าโหลดทั้งหมดในครั้งเดียว
Logical View of Segmentation 1 4 2 3 1 2 3 4 user space physical memory space
สถาปัตยกรรมของการแบ่งส่วน Segmentation Architecture ที่อยู่เชิงตรรกะประกอบด้วย 2 คอลัมน์ <segment-number, offset>, Segment table – แปลงไปเป็นที่อยู่เชิงกายภาพขนาด 2 มิติ ประกอบด้วย ส่วนฐาน base – กำหนดหมายเลขที่อยู่เชิงกายภาพเริ่มต้นที่อยู่ในหน่วยความจำ ส่วนจำกัด limit – ระบุความยาวของ segment. Segment-table base register (STBR) ชี้ไปยังที่อยู่ในหน่วยความจำของตารางเซ็กเมนท์ Segment-table length register (STLR) แสดงจำนวนของเซ็กเมนท์ที่ถูกใช้งานโดยโปรแกรม segment number s is legal if s < STLR.
Segmentation Architecture (Cont.) การย้ายที่อยู่ (Relocation) dynamic by segment table การใช้งานร่วมกัน (Sharing) shared segments same segment number การจัดสรร (Allocation) first fit/best fit external fragmentation
Segmentation Architecture (Cont.) เลขที่อยู่ตรรกะประกอบด้วย 2 ส่วน คือ หมายเลขส่วน (s), และ (2) ออฟเซตที่ชี้ไปยังส่วนนั้น (d) ใช้หมายเลขส่วนเพื่อเป็นตัวชี้ไปยังข้อมูลในตารางเลขส่วน ข้อมูลแต่ละช่องในตารางเลขส่วนมีค่าฐานและค่าจำกัด ระยะจากขอบ d จะมีค่าระหว่าง 0 ถึงค่าขอบเขตของส่วน ถ้า d มากกว่าขอบเขตตอนแล้วรายงานข้อมูลผิดพลาดไปยังระบบปฏิบัติการว่ามีการอ้างอิงตำแหน่งนอกขอบเขตตอน ถ้าค่า d ไม่เกินค่าขอบเขตตอน อุปกรณ์จะนำค่า d ไปบวกกับค่าฐานเป็นค่าตำแหน่งจริง ดังนั้น จะเห็นได้ว่าตารางเลขส่วนก็คือ แถวลำดับของคู่เรจิสเตอร์ฐานและจำกัด (base-limit) นั่นเอง
Segmentation Hardware
Implementation of Page Table Page-table base register (PTBR) จะชี้ไปยัง page table Page-table length register (PRLR) ใช้แสดงขนาดขนาดขออง page table วิธีการเช่นนี้ ต้องการการอ้างอิง 2 ส่วนของหน่วยความจำหลัก ได้แก่ หมายเลขส่วน และ ออฟเซ็ตที่ชี้ไปยังส่วนนั้น ส่วนแรกสำหรับ page table อีกส่วนหนึ่งสำหรับข้อมูล/คำสั่ง ปัญหาการอ้างอิงหน่วยความจำ 2 ส่วน สามารถแก้ได้โดยการใช้ฮาร์ดแวร์พิเศษที่รวดเร็วทำหน้าที่เป็นแคช เรียกว่า associative memory หรือ translation look-aside buffers (TLBs)
Associative Memory หน่วยความจำเชื่อมโยงทำหน้าที่สืบค้นคู่ขนาน Address translation (A´, A´´) ถ้า A´ คือเรจิสเตอร์เชื่อมโยง จะได้ frame# ออกไป มิฉะนั้น จะได้ frame # จากpage table ในหน่วยความจำ Page # Frame #
Paging Hardware With TLB
Effective Access Time Associative Lookup = time unit Assume memory cycle time is 1 microsecond Hit ratio – percentage of times that a page number is found in the associative registers; ration related to number of associative registers Hit ratio = Effective Access Time (EAT) EAT = (1 + ) + (2 + )(1 – ) = 2 + –
การป้องกันหน่วยความจำ Memory Protection การป้องกันหน่วยความจำทำได้โดยใช้บิตป้องกันแบบเชื่อมโยง (associating protection bit) เข้ากับแต่ละเฟรม Valid-invalid bit กำหนดไว้แต่ละรายการใน page table “valid” แสดงว่าหน้าที่เชื่อมโยงพื้นที่ว่างเชิงตรรกะของกระบวนการนั้น และคือหน้าที่ถูกต้องต้อง “invalid” แสดงว่า หน้านั้นไม่ใช่พื้นที่ว่างเชิงตรรกะของกระบวนการนั้น
Valid (v) or Invalid (i) Bit In A Page Table
โครงสร้างของตารางหน้า Page Table Structure การสลับหน้าแบบลำดับ (Hierarchical Paging) ตารางหน้าที่ถูกแฮช (Hashed Page Tables) ตารางหน้าย้อนกลับ (Inverted Page Tables)
ตารางการสลับหน้าแบบลำดับ Hierarchical Page Tables แบ่งพื้นที่ว่างเชิงตรรกะออกเป็นหลายตารางหน้า (multiple page tables) เทคนิคอย่างง่ายคือ ตารางหน้า 2 ระดับ (two-level page table)
ตัวอย่างการสลับหน้าแบบ 2 ระดับ Two-Level Paging Example ที่อยู่เชิงตรรกะ (ขนาด 4K page size บนเครื่อง 32 บิต) จะถูกแบ่งออกเป็น a page number ประกอบด้วย 20 bits a page offset ประกอบด้วย 12 bits เมื่อ page table มีการแบ่งหน้า page number จะถูกแบ่งออกเป็น a 10-bit page number a 10-bit page offset ดังนั้น ที่อยู่เชิงตรรกะจึงแสดงดังนี้ โดยที่ pi คือดัชนีที่ชี้ไปยัง page table ภายนอก, และ p2 คือ การแทนที่ภายในหน้านั้นของ page table ภายนอก page number page offset pi p2 d 10 10 12
Two-Level Page-Table Scheme
โครงสร้างการแปลงเลขที่อยู่ Address-Translation Scheme โครงสร้างการแปลงเลขที่อยู่สำหรับสถาปัตยกรรมการสลับหน้าแบบ two-level 32-bit
ตารางหน้าแฮช Hashed Page Tables พื้นที่ว่างร่วมกันที่น้อยกว่า 32 bits หมายเลขหน้าเสมือนคือหมายเลขที่ถูกแฮชไปเป็น page table ซึ่ง page table นี้บรรจุด้วยสายโซ่ของส่วนประกอบการแฮชไปยังตำแหน่งที่อยู่เดียวกัน หมายเลขหน้าเสมือน จะถูกเปรียบเทียบกับสายโซ่ที่สอดคล้องกัน ถ้าพบว่าสอดคล้องกัน ก็สามารถแปลงออกไปเป็นเฟรมเชิงกายภาพได้
Hashed Page Table
ตารางหน้าย้อนกลับ Inverted Page Table หนึ่งรายการต่อหน่วยความจำจริงหนึ่งหน้า รายการประกอบด้วยที่อยู่เสมือนของหน้าที่ถูกจัดเก็บไว้ในตำแหน่งของหน่วยความจำจริง พร้อมกับข้อมูลเกี่ยวกับกระบวนการที่ครอบครองหน้านั้น แต่ละ page table จำเป็ต่อการลดขนาดหน่วยความจำ แต่การเพิ่มเวลาจำเป็นสำหรับการค้นหาตารางที่ต้องการเมื่อหน้านั้นถูกอ้างถึง การใช้ตารางแฮช ก็เพื่อจำกัดจำนวนครั้งของการค้นหารายการตารางหน้า หรือให้สามารถค้นพบได้ในเวลาอันสั้น
Inverted Page Table Architecture
Shared Pages Shared code One copy of read-only (reentrant) code shared among processes (i.e., text editors, compilers, window systems). Shared code must appear in same location in the logical address space of all processes Private code and data Each process keeps a separate copy of the code and data The pages for the private code and data can appear anywhere in the logical address space
Shared Pages Example
Segmentation Memory-management scheme that supports user view of memory A program is a collection of segments. A segment is a logical unit such as: main program, procedure, function, method, object, local variables, global variables, common block, stack, symbol table, arrays
User’s View of a Program
Logical View of Segmentation 1 4 2 3 1 2 3 4 user space physical memory space
Example of Segmentation
Sharing of Segments
Segmentation with Paging – MULTICS The MULTICS system solved problems of external fragmentation and lengthy search times by paging the segments Solution differs from pure segmentation in that the segment-table entry contains not the base address of the segment, but rather the base address of a page table for this segment
MULTICS Address Translation Scheme
Segmentation with Paging – Intel 386 As shown in the following diagram, the Intel 386 uses segmentation with paging for memory management with a two-level paging scheme
Intel 30386 Address Translation
Linux on Intel 80x86 Uses minimal segmentation to keep memory management implementation more portable Uses 6 segments: Kernel code Kernel data User code (shared by all user processes, using logical addresses) User data (likewise shared) Task-state (per-process hardware context) LDT Uses 2 protection levels: Kernel mode User mode
End of Chapter 8