Please enable JavaScript.
Coggle requires JavaScript to display documents.
บทที่7 การจัดการหน่วยความจำ - Coggle Diagram
บทที่7 การจัดการหน่วยความจำ
ประเภทของ
หน่วยความจำ
หน่วยความจำภายใน (Internal memory)
ประกอบด้วยรีจีสเตอร์ความเร็วสูง โดยหน่วยความจำส่วนนี้ถูกใช้
สำหรับเก็บคำสั่ง และข้อมูลที่ต้องการทำงานด้วยความเร็วสูงมาก
หน่วยความจำหลัก (Main memory)
เป็นหน่วยความจำความเร็วสูงใช้สำหรับเก็บคำสั่งและข้อมูลระหว่างการทำงาน โดยเป็นหน่วยความจำที่ซีพียูสามารถเข้าถึงได้โดยตรง
แนวคิดพื้นฐานการจัดการ
หน่วยความจำหลัก
หน้าที่ของระบบปฏิบัติการในการจัดการกับหน่วยความจำหลักมี4 ประการคือ
ควบคุมดูแลสถานะของแต่ละตำแหน่งของหน่วยความจำหลัก
ตัดสินว่าควรจัดสรรหน่วยความจำหลักขนาดเท่าไร ให้กับงานใด ณ ตำแหน่งใดของหน่วยความจำหลัก
จัดสรรหน่วยความจำหลักให้งานที่ได้เลือกแล้ว
ปลดปล่อยหน่วยความจำหลักให้ว่าง เมื่อทำงานเสร็จแล้ว
(Instruction-execution cycle)
จะมี
ขั้นตอนการทำงาน ดังนี้
ขั้นตอนที่ 1
ไปนำมา (Fetch)
คือ การเริ่มต้นการทำงานซึ่งระบบจะทำการดึงคำสั่งแรกจากหน่วยความจำ
ขั้นตอนที่ 2
ถอดรหัส (Decode)
คือ การทำงานต่อจากขั้นตอนที่ 1 โดยนำคำสั่งนี้ไปทำการถอดรหัส ซึ่งอาจจะได้ตัวดำเนินการหรือข้อมูล เพื่อใช้กับคำสั่งถัดไป
ขั้นตอนที่ 3
กระทำการ (Execution)
คือ การทำงานต่อจากขั้นตอนที่ 2 ซึ่งหลังจากนั้นคำสั่งจะทำงานตามตัวดำเนินการที่ได้
ขั้นตอนที่ 4
จัดเก็บ (Store)
ผลลัพธ์จะถูกเก็บกลับไปในหน่วยความจำหลักต่อไป
หน่วยความจำหลัก
การเชื่อมโยงตำแหน่ง (Address Binding)
การเขียนโปรแกรมระยะแรก มีการกำหนดตำแหน่งของหน่วยความจำหลักด้วยเลขที่อยู่สัมบูรณ์
(Absolute address)
คือ ตำแหน่งที่แน่นอนและมีอยู่จริงในหน่วยความจำหลัก
เกิดปัญหาในกรณีที่ตำแหน่งที่ระบุไว้ไม่ว่าง จะทำให้ไม่สามารถใช้งานโปรแกรมได้ทำให้ขาดความยืดหยุ่นในการใช้งาน และขาดคุณสมบัติการย้ายที่อยู่ (
Relocate)
มีการอ้างถึงหน่วยความจำหลักด้วยเลขที่อยู่สัมพัทธ์
(Relative address)
ซึ่งช่วยแก้ปัญหาของ การเขียนโปรแกรมโดยโปรแกรมสามารถโหลดลงตำแหน่งใดก็ได้ในหน่วยความจำหลัก
1. เวลาแปลโปรแกรม (Compile time)
2. เวลาโหลดโปรแกรม (Load time)
3. เวลากระท าการ (Execution time)
Dynamic Loading
Routine
จะไม่ถูกโหลด
จนกระทั่งถูกเรียกใช้งาน เป็นการใช้หน่วยความจำเป็นประโยชน์มากกว่าโปรแกรมย่อยที่ไม่ได้ใช้
Dynamic Linking and Shared Libraries
Linking
จะเลื่อนออกไปจนกระทั่งอยู่ในช่วง Execution time มีชุดคำสั่งเล็ก ๆ เรียกว่า Stub ใช้สำหรับ Locate
ตำแหน่งที่ว่างทางกายภาพกับตำแหน่งที่ว่างทางตรรกะ
ตำแหน่งที่ถูกสร้างโดยซีพียูมักหมายถึงตำแหน่งทางตรรกะส่วนตำแหน่งในหน่วยความจำจะหมายถึง
Physical address
เป็นตำแหน่งบนหน่วยความจำ
เมื่อบรรจุกระบวนการเข้ามาในหน่วยความจำLogical address จะต้องถูกแปลงไปเป็น
Physical address
เรียกวิธีการนี้ว่า
การย้ายเลขที่อยู่ (Relocation)
การจัดการหน่วย
ความจำหลัก
วิธีการซ้อนทับ (Overlays)
โพรเซสที่จะทำงานด้วยวิธีซ้อนทับ จะต้องถูกแบ่งออกเป็นส่วนย่อยที่อิสระต่อกัน คือแต่ละส่วนไม่
จำเป็นต้องถูกเรียกใช้งานพร้อมกัน
วิธีการสับเปลี่ยน (Swapping)
ระบบจำเป็นต้องนำบางโพรเซสออกจากหน่วยความจำหลักก่อน เพื่อให้หน่วยความจำหลักมีพื้นที่ว่างมากเพียงพอที่จะบรรจุโพรเซสอื่น เป็นการสับเปลี่ยน (Swap) ให้โพรเซสอื่นทำงาน
การจัดสรรหน่วยความจำแบบต่อเนื่อง
หน่วยความจำหลักจะถูกแบ่งออกเป็น 2 ส่วน
หน่วยความจำระดับล่าง
(Low memory)
ซึ่งเป็นส่วนของระบบปฏิบัติการ
หน่วยความจำระดับบน (
High memory
) ซึ่งเป็นส่วนที่ใช้ติดต่อกับส่วนของผู้ใช้
การจัดสรรพื้นที่แบบขนาดคงที่ (Fixed-Size Partition)
การแบ่งหน่วยความจำออกเป็นพาร์ติชั่น
การกำหนดขนาดของพาร์ติชั่นให้เปลี่ยนแปลงได้(Dynamic Partition)
การกำหนดขนาดพาร์ติชั่นคงที่ (Static Partition)
ก่อนทำงานจะจัดสรรหน่วยจำแบ่งเป็นส่วนๆ
การจัดการหน่วยความจำหลักแบบพาร์ติชั่นและย้ายที่อยู่
รวบรวมพื้นที่ว่างที่มีอยู่นั้นให้ติดกัน เรียกว่า
การอัดแน่น (Compaction)
ปัญหาการจัดสรรหน่วยเก็บแบบพลวัต
First-Fit
คือ เลือกช่องโหว่แรกที่พบและมีขนาดใหญ่เพียงพอกับพื้นที่ที่ต้องการ เป็นวิธีที่ง่ายที่สุดและเสียเวลาน้อยที่สุด
Best-Fit
คือ การเลือกช่องโหว่ที่เหมาะสมที่สุด ต้องหาเนื้อที่ว่างโดยต้องตรวจดูพื้นที่ว่าง
ทั้งหมดในระบบ
Worst-Fit
คือ การเลือกช่องโหว่ที่ใหญ่ที่สุด เป็นวิธีป้องกันไม่ให้เกิดปัญหาการเกิดเนื้อที่ว่าง
เล็ก ๆ
ปัญหาของการจัดการหน่วยความจำ
การสูญเปล่าของพื้นที่ย่อยภายนอก (External Fragmentation)
จะพบว่าพื้นที่ว่างถูกพื้นที่ใช้งานแบ่ง ทำให้พื้นที่ว่างต่อเนื่องยาว ๆ จนเกินไปจนไม่สามารถนำมาใช้งานได้
การสูญเปล่าของพื้นที่ย่อยภายใน (Internal Fragmentation)
ปัญหาที่เกิดจากการจองพื้นที่หน่วยความจำมากกว่าขนาดข้อมูล เป็นปัญหาที่เกิดขึ้นภายในพื้นที่ที่จองไว้
การแก้ปัญหาการสูญเปล่าของพื้นที่ย่อภายนอก
ทำได้โดยย้ายตำแหน่งของพื้นที่ใช้งานให้เลื่อนมาติดกัน ซึ่งเราเรียกว่า Compaction
การแบ่งพื้นที่เป็นหน้า
การจัดสรรหน่วยความจำทางกายภาพ
(paging model of physical memory) เป็นวิธีการแบ่งพื้นที่ให้มีขนาดคงที่ (Fixed-size block)
การจัดสรรหน่วยความจำทางตรรกะ
(paging model of logical memory) เป็นวิธีการแบ่งพื้นที่แบบบล็อก (Block) เรียกพื้นที่ส่วนนี้ว่า เพจ (Pages)
หมายเลขเพจ (Page number: p)
โดยหมายเลขเพจจะใช้ดรรชนี เพื่อชี้ไปยังตารางเพจซึ่งภายในบรรจุตำแหน่งเริ่มต้น
ขอบเขตเพจ (Page offset: d
) คือ ตำแหน่งจริงในหน่วยความจำ ที่นำมารวมกับตำแหน่งเริ่มต้นที่ได้จากตารางเพจ
การทำงานของ Paging
สามารถใช้จำนวนหน้าที่ไม่ติดกันได้ และในการจองพื้นที่ก็จะไม่เหลือพื้นที่ว่างคั่นไว้ จึงทำให้ไม่เกิดปัญหา External fragmentation
รูปแบบการแบ่งเพจในหน่วยความจำแบบตรรกะและหน่วยความจำแบบกายภาพ
แสดงฮาร์ดแวร์การแบ่งตาราง (Hardware Paging)
ฮาร์ดแวร์กับการสนับสนุนการแบ่งหน้า (Hardware Support)
การป้องกันหน่วยความจำ
บิตใช้งานได้ (Valid bit)
เป็นบิตสถานะที่บอกว่าข้อมูลในเพจถูกอ่านเข้าสู่หน่วยความจำทางกายภาพแล้ว และสามารถนำไปใช้งานได้ทันที
บิตใช้งานไม่ได้ (Invalid bit)
เป็นบิตสถานะที่บอกว่าข้อมูลในเพจนั้นไม่มีอยู่ในหน่วยความจำทางกายภาพแล้ว
ตารางเพจของบิตที่ใช้งานได้และไม่ได้
การใช้เพจร่วมกัน
โครงสร้างของตารางเพจ (Memory Protection)
โครงสร้างแบบลำดับชั้น
(Hierarchical paging) ระบบคอมพิวเตอร์สมัยใหม่จะสบับสนุนตำแหน่งพื้นที่ทางตรรกะ
หมายเลขเพจ (page number)
ขอบเขตเพจ (page offset)
โครงสร้างการแปลงเลขที่อยู่สำหรับสถาปัตยกรรมการสลับหน้าแบบ two-level
โครงสร้างแบบตารางเฮช (Hash page table
) ระบบคอมพิวเตอร์ที่จะใช้โครงสร้างแบบนี้
ต้องมีตำแหน่งขนาดพื้นที่มากกว่า 32 บิต
โครงสร้างเพจแบบผกผัน (Inverted page table)
ระบบคอมพิวเตอร์ที่จะใช้โครงสร้างแบบนี้ ต้องมีคุณสมบัติกำหนดโดยตารางเพจ
Paging และการแก้ไขปัญหา External Fragmentation
การจองพื้นที่ในเพจจิ้งจะจองเป็น nPage เสมอ โดยค่า n จะเป็นจำนวนเต็ม และ Page คือ
ปริมาณข้อมูลใน 1 หน้ากระดาษ
การแก้ปัญหา Internal Fragmentation
ปัญหา Internal fragmentation
คือ การใช้งานพื้นที่ไม่คุ้มค่า จากหลักการของเพจจิ้ง จะมีน้อยครั้งมากที่ขนาดของข้อมูลกับขนาดหน้าจะเท่ากันพอดี
การแบ่งส่วน
วิธีพื้นฐาน (Basic Method)
วิธีการนี้เป็นการจัดสรรพื้นที่ในหน่วยความจำหลักออกเป็นส่วน ๆ ตามขนาดของโปรแกรมหรือ
โมดูลย่อย เรียกพื้นที่นี้ว่า Segment
การสร้างตารางเลขตอน (Implementation of Segmentation Tables)
การแบ่งเป็นตอนจึงมีความ
ซับซ้อนกว่า (ซึ่งเป็นเหตุผลให้ เราอธิบายเรื่องการแบ่งเป็นหน้าก่อน)
การป้องกันและการใช้ตอนร่วมกัน (Protection and Sharing)
คือส่วนต่าง ๆ ของโปรแกรมที่มีลักษณะต่าง ๆ กัน ข้อมูลในตอนเดียวกันมักจะมีการใช้งานเหมือน ๆ กัน
ฮาร์ดแวร์(Hardware)
แต่หน่วยความจำจริงยังคงเป็นแบบมิติเดียว คือเป็นแถวของคำเรียงต่อกันไปจึงต้องมีวิธีการจับคู่ตำแหน่งทางตรรกะแบบสอง
การสูญเปล่าพื้นที่ย่อย(Fragmentation)
การแบ่งเป็นตอนมักทำให้เกิดการสูญเปล่าพื้นที่ย่อยภายนอก ซึ่งเกิดจากพื้นที่ว่างอยู่กระจัดกระจายกัน และแต่ละพื้นที่มีขนาดเล็กไป