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