Please enable JavaScript.
Coggle requires JavaScript to display documents.
บทที่ 7 การจัดการหน่วยความจำ - Coggle Diagram
บทที่ 7
การจัดการหน่วยความจำ
7.1 ประเภทของหน่วยความจำ หน่วยความจำเป็นทรัพยากรสำคัญของระบบคอมพิวเตอร์ ทำหน้าที่เก็บข้อมูลต่าง ๆ รวมทั้งคำสั่ง และผลลัพธ์ที่ได้จากการทำงาน โดยลำดับชั้นของหน่วยความจำแบ่งออกเป็น 3 กลุ่ม คือ
หน่วยความจำหลัก (Main memory) หน่วยความจำหลัก เป็นหน่วยความจำความเร็วสูงใช้สำหรับเก็บคำสั่งและข้อมูลระหว่างการทำงาน โดยเป็นหน่วยความจำที่ซีพียูสามารถเข้าถึงได้โดยตรง และรวดเร็ว
หน่วยความจำสำรอง (Secondary memory) หน่วยความจำสำรองเป็นหน่วยความจำที่มีความเร็วน้อยกว่าหน่วยความจำสองประเภทแรก ใช้สำหรับเก็บข้อมูลที่มีขนาดใหญ่ และเป็นข้อมูลที่ยังไม่ต้องการนำมาประมวลผล
หน่วยความจำภายใน (Internal memory) หน่วยความจำภายในหรือเรียกว่า
หน่วยความจำแคช (Cache memory)ประกอบด้วยรีจีสเตอร์ความเร็วสูง โดยหน่วยความจำส่วนนี้ถูกใช้สำหรับเก็บคำสั่ง และข้อมูลที่ต้องการทำงานด้วยความเร็วสูงมาก
7.2 แนวคิดพื้นฐานการจัดการหน่วยความจำหลัก
หน้าที่ของระบบปฏิบัติการในการจัดการกับหน่วยความจำหลักมี4 ประการคือ
ตัดสินว่าควรจัดสรรหน่วยความจำหลักขนาดเท่าไร ให้กับงานใด ณ ตำแหน่งใดของ
หน่วยความจำหลัก
จัดสรรหน่วยความจำหลักให้งานที่ได้เลือกแล้ว
ควบคุมดูแลสถานะของแต่ละตำแหน่งของหน่วยความจำหลัก
ปลดปล่อยหน่วยความจำหลักให้ว่าง เมื่อทำงานเสร็จแล้ว
คำสั่งที่จะถูกดำเนินการได้โดยซีพียู จะต้องถูกดึงมาและเก็บที่ตำแหน่งในหน่วยความจำรูปแบบการทำงานของรอบคำสั่งเครื่องและการปฏิบัติงานตามคำสั่ง
ขั้นตอนที่ 2 ถอดรหัส (Decode) คือ การทำงานต่อจากขั้นตอนที่ 1 โดยนำคำสั่งนี้ไปทำการ
ถอดรหัส ซึ่งอาจจะได้ตัวดำเนินการหรือข้อมูล เพื่อใช้กับคำสั่งถัดไป
ขั้นตอนที่ 3 กระทำการ (Execution) คือ การทำงานต่อจากขั้นตอนที่ 2 ซึ่งหลังจากนั้นคำสั่งจะ
ทำงานตามตัวดำเนินการที่ได้
ขั้นตอนที่ 1 ไปนำมา (Fetch) คือ การเริ่มต้นการทำงานซึ่งระบบจะทำการดึงคำสั่งแรกจาก
หน่วยความจำ
ขั้นตอนที่ 4 จัดเก็บ (Store) ผลลัพธ์จะถูกเก็บกลับไปในหน่วยความจำหลักต่อไป
7.3 หน่วยความจำหลัก หน่วยความจำหลัก เป็นศูนย์กลางของการทำงานต่าง ๆ ของระบบคอมพิวเตอร์ในปัจจุบันประกอบไปด้วยอาร์เรย์ขนาดใหญ่ (Large array) ซึ่งภายในประกอบไปด้วยเวิร์ด (Words) และไบต์(Bytes) โดยแต่ละไบต์จะมีแอดเดรส (Address) บอกตำแหน่งของตัวเอง
7.3.1 การเชื่อมโยงตำแหน่ง (Address Binding) การเขียนโปรแกรมระยะแรก มีการกำหนดตำแหน่งของหน่วยความจำหลักด้วยเลขที่อยู่สัมบูรณ์ ตำแหน่งที่แน่นอนและมีอยู่จริงในหน่วยความจำหลักมีการระบุตำแหน่งของหน่วยความจำที่โปรแกรมจะต้องถูกโหลดเพื่อนำไปใช้งาน
เวลาแปลโปรแกรม (Compile time) หน่วยความจำหลักเลขที่อยู่สัมบูรณ์มาผ่านการแปลด้วยคอมไพเลอร์จะได้อ็อบเจ็กโปรแกรมที่มีการหน่วยความจำหลักด้วยเลขที่อยู่สัมบูรณ์มาผ่านการแปลด้วยคอมไพเลอร์จะได้อ็อบเจ็กโปรแกรมที่มีการอ้างถึงตำแหน่งของหน่วยความจำหลักด้วยเลขที่อยู่สัมบูรณ์
เวลาโหลดโปรแกรม (Load time)เมื่อนำโปรแกรมต้นฉบับที่มีการระบุตำแหน่งของหน่วยความจำหลักด้วยเลขที่อยู่สัมพัทธ์มาผ่านการแปลด้วยคอมไพเลอร์จะได้อ็อบเจ็กของโปรแกรมที่มีการอ้างถึงตำแหน่งของหน่วยความจ าหลักด้วยเลขที่อยู่สัมพัทธ์
เวลากระทำการ (Execution time)โปรแกรมต้นฉบับถูกแบ่งออกเป็นส่วน ๆ โดยแต่ละส่วนจะถูกใช้ไม่พร้อมกันเมื่อนำโปรแกรมผ่านตัวคอมไพเลอร์จะได้ออบเจ็กโปรแกรมที่อ้างถึงตำแหน่งที่อยู่ในหน่วยความจำหลักด้วยเลขที่อยู่เชิงสัมพัทธ์และเก็บโปรแกรมไว้ในหน่วยความจำสำรองเทื่อต้องการใช้งานจะทำการโหลดเฉพาะส่วนของโปรแกรมที่ต้องการใช้งานเท่านั้น
7.3.2 Dynamic Loading Routine จะไม่ถูกโหลด จนกระทั่งถูกเรียกใช้งาน เป็นการใช้หน่วยความจำเป็นประโยชน์มากกว่า
โปรแกรมย่อยที่ไม่ได้ใช้ (Unused routine)จะไม่ถูกโหลดมาในหน่วยความจำหลักซึ่งมีประโยชน์สำหรับ
โปรแกรมขนาดใหญ่
7.3.3 Dynamic Linking and Shared Libraries Linking จะเลื่อนออกไปจนกระทั่งอยู่ในช่วง Execution time มีชุดคำสั่งเล็ก ๆ เรียกว่า Stub ใช้
สำหรับ Locate ไลบรารีของโปรแกรมย่อยที่เหมาะสมในหน่วยความจำหลัก Stub จะแทนที่ตัวเองด้วย
แอดเดรสของโปรแกรมย่อยและจะทำงานตามโปรแกรมย่อยนั้น
7.4 ตำแหน่งที่ว่างทางกายภาพกับตำแหน่งที่ว่างทางตรรกะ ตำแหน่งที่ถูกสร้างโดยซีพียูมักหมายถึงตำแหน่งทางตรรกะ (Logical address) ส่วนตำแหน่งในหน่วยความจำจะหมายถึง ตำแหน่งทางกายภาพ
Logical และ Physical address
7.5 การจัดการหน่วยความจำหลัก หน้าที่ของระบบปฏิบัติการในการจัดการกับหน่วยความจำหลัก คือ การควบคุมดูแลสถานะของแต่ละตำแหน่งของหน่วยความจำหลัก
7.5.1 วิธีการซ้อนทับ (Overlays) ดังนั้นหากมีความจำเป็นที่ต้องใช้โพรเซสที่มีขนาดมากกว่าขนาดของหน่วยความจำหลักสามารถทำได้โดยวิธีซ้อนทับ (Overlays)
7.6 การจัดสรรหน่วยความจำแบบต่อเนื่อง หน้าที่ของระบบปฏิบัติการในการจัดสรรพื้นที่หน่วยความจำในหน่วยความจำให้มีประสิทธิภาพสูงสุด
หน่วยความจำระดับบน (High memory) ซึ่งเป็นส่วนที่ใช้ติดต่อกับส่วนของผู้ใช้
หน่วยความจำระดับล่าง (Low memory) ซึ่งเป็นส่วนของระบบปฏิบัติการ
7.6.1 การจัดสรรพื้นที่แบบขนาดคงที่ (Fixed-Size Partition) การจัดสรรพื้นที่แบบขนาดคงที่หรือแบบส่วนเดียว(Single-partition allocation) ชุดของรีจิสเตอร์ย้ายตำแหน่ง (Relocation-register scheme) จะใช้สำหรับป้องกันการทำงานโพรเซสของผู้ใช้จากโพรเซสอื่น และจากการเปลี่ยนรหัสของระบบปฏิบัติการ
7.6.2 การแบ่งหน่วยความจำออกเป็นพาร์ติชั่น การแบ่งหน่วยความจำหลักออกเป็นส่วนย่อย ๆ หรือแบ่งออกเป็นพาร์ติชั่น(Partition) แต่ละพาร์ติชั่นถูกใช้สำหรับงาน 1 งาน จำนวนงานที่สามารถทำงานได้พร้อมกันจะถูกกำหนด
7.6.2.1 การกำหนดขนาดพาร์ติชั่นคงที่ (Static Partition) วิธีนี้ก่อนจะมีการทำงานใด ๆ หน่วยความจำหลักต้องถูกจัดสรรแบ่งออกเป็นส่วน ๆ ที่มีขนาดแน่นอน ซึ่งการแบ่งส่วนอาจกำหนดโดยโอเปอเรเตอร์ของระบบคอมพิวเตอร์
7.6.2.2 การกำหนดขนาดของพาร์ติชั่นให้เปลี่ยนแปลงได้(Dynamic Partition) วิธีนี้เป็นการแบ่งส่วนของหน่วยความจำหลักแบบไดนามิก (Dynamic) ที่มีการจัดสรรหน่วยความจำหลักให้โพรเซสต่าง ๆตามขนาดที่ผู้ใช้ร้องขอเมื่อมีการขอใช้หน่วยความจำหลัก
7.6.3 การจัดการหน่วยความจำหลักแบบพาร์ติชั่นและย้ายที่อยู่ เนื่องจากวิธีการจัดการหน่วยความจำหลักแบบพาร์ติชั่นมีปัญหาเรื่องการแตกกระจาย ซึ่งสามารถแก้ปัญหาได้ด้วยการรวบรวมพื้นที่ว่างที่มีอยู่นั้นให้ติดกัน เรียกว่า การอัดแน่น (Compaction)แต่การที่
ระบบเคลื่อนย้ายโพรเซสที่ถูกบรรจุในพาร์ติชั่นต่าง ๆ เข้าไปอยู่ในพื้นที่บริเวณที่ติดกัน
7.7 ปัญหาการจัดสรรหน่วยเก็บแบบพลวัต
First-Fit คือ เลือกช่องโหว่แรกที่พบและมีขนาดใหญ่เพียงพอกับพื้นที่ที่ต้องการ เป็นวิธีที่ง่าย
ที่สุดและเสียเวลาน้อยที่สุด
Best-Fit คือ การเลือกช่องโหว่ที่เหมาะสมที่สุด ต้องหาเนื้อที่ว่างโดยต้องตรวจดูพื้นที่ว่างทั้งหมดในระบบ เพื่อหาเนื้อที่ว่างที่มีขนาดเท่ากัน หรือใกล้เคียงกับขนาดของโพรเซสจริง
Worst-Fit คือ การเลือกช่องโหว่ที่ใหญ่ที่สุด เป็นวิธีป้องกันไม่ให้เกิดปัญหาการเกิดเนื้อที่ว่างเล็ก ๆ เป็นจำนวนมากอย่าง Best-Fit
7.8 ปัญหาของการจัดการหน่วยความจำ
7.8.1 การสูญเปล่าของพื้นที่ย่อยภายนอก (External Fragmentation)เป็นปัญหาที่เกิดจากการขอพื้นที่หน่วยความจำ เมื่อทำงานในการแจกพื้นที่และตามเก็บพื้นที่ไปสักช่วงเวลาหนึ่ง จะพบว่าพื้นที่ว่างถูกพื้นที่ใช้งานแบ่ง ทำให้พื้นที่ว่างต่อเนื่องยาว ๆ
7.8.2 การแก้ปัญหาการสูญเปล่าของพื้นที่ย่อยภายนอก ทำได้โดยย้ายตำแหน่งของพื้นที่ใช้งานให้เลื่อนมาติดกัน ซึ่งเราเรียกว่า Compaction แต่การทำเช่นนี้ต้องแลกด้วยต้นทุน (Cost) คือ ค่าใช้จ่ายที่ระบบต้องเสียไปในการทำงาน
7.9 การแบ่งพื้นที่เป็นหน้า เพจจิ้ง (Paging) คือ การแบ่งหน่วยความจำเป็นหน้า ๆ ขนาดเท่ากัน หลักการของเพจจิ้ง คือหน่วยความจ าจะถูกแบ่งออกเป็นพื้นที่เท่า ๆ กัน เรียงต่อกันไปเรื่อย ๆ ไม่มีช่องว่าง จนหมดพื้นที่หน่วยความจำ การจองหน่วยความจำจะจองเป็นตัวเลขลงตัวเสมอ
การจัดสรรหน่วยความจำทางกายภาพ (paging model of physical memory) เป็น
วิธีการแบ่งพื้นที่ให้มีขนาดคงที่ (Fixed-size block) เรียกพื้นที่ส่วนนี้ว่า เฟรม (Frames)
2). การจัดสรรหน่วยความจำทางตรรกะ (paging model of logical memory) เป็นวิธีการ
แบ่งพื้นที่แบบบล็อก (Block) เรียกพื้นที่ส่วนนี้ว่า เพจ (Pages)
หมายเลขเพจ (Page number: p) โดยหมายเลขเพจจะใช้ดรรชนี(Index)เพื่อชี้ไปยังตารางเพจ (Page table)ซึ่งภายในบรรจุต าแหน่งเริ่มต้น (Base address) ของแต่ละเพจในหน่วยความจ าทางกายภาพ
ขอบเขตเพจ (Page offset: d) คือ ตำแหน่งจริงในหน่วยความจำที่นำมารวมกับตำแหน่งเริ่มต้นที่ได้จากตารางเพจ เพื่อใช้คำนวณหาตำแหน่งของหน่วยความจำทางกายภาพ
7.10 การป้องกันหน่วยความจำ “กลุ่มบิตป้องกัน (Associating protection bits)” ให้กับทุก ๆ เฟรมที่อยู่ในหน่วยความจำ ซึ่งแบ่งบิตสถานะออกเป็น 2 บิต คือ
บิตใช้งานได้ (Valid bit) เป็นบิตสถานะที่บอกว่าข้อมูลในเพจถูกอ่านเข้าสู่หน่วยความจำทาง
กายภาพแล้ว และสามารถนำไปใช้งานได้ทันที
บิตใช้งานไม่ได้ (Invalid bit) เป็นบิตสถานะที่บอกว่าข้อมูลในเพจนั้นไม่มีอยู่ในหน่วยความจำทางกายภาพแล้ว และไม่สามารถนำไปใช้งานได้อาจเกิดจากกรณีที่ระบบปฏิบัติการยังไม่ได้อ่านข้อมูลจากเพจเข้าสู่หน่วยความจำหลัก
7.11 การใช้เพจร่วมกัน เป็นวิธีการแบ่งปันการใช้เพจร่วมกันในรูปแบบการแบ่งเวลา (Time sharing) โดยข้อมูลนั้นจะ
เป็นข้อมูลที่ใช้อยู่ในลักษณะไม่สามารถเปลี่ยนแปลงข้อมูลได้ (Non-self-modifying code)ในขณะที่มีการประมวลผลแต่ใช้งานร่วมกันได้ เรียกข้อมูลชนิดนี้ว่า “Reentrant Code” หรือ “Pure Code”
7.11.1 โครงสร้างของตารางเพจ (Memory Protection)
โครงสร้างแบบลำดับชั้น (Hierarchical paging) ระบบคอมพิวเตอร์สมัยใหม่จะสบับสนุน
ตำแหน่งพื้นที่ทางตรรกะ
หมายเลขเพจ (page number)
ขอบเขตเพจ (page offset)
โครงสร้างแบบตารางเฮช (Hash page table) ระบบคอมพิวเตอร์ที่จะใช้โครงสร้างแบบนี้ต้องมีตำแหน่งขนาดพื้นที่มากกว่า 32 บิต โดยค่าของเฮชจะอยู่ภายในหมายเลขเพจเสมือน (Virtual-page number)
ค่าดรรชนีที่ชี้ไปยังเฟรมเพจ (Page frame)
ค่าของพอยเตอร์ ที่ชี้ไปยังหน่วยเชื่อมโยงในลิงก์ลิสต์
ค่าหมายเลขเพจเสมือน (Virtual-page number)
โครงสร้างเพจแบบผกผัน (Inverted page table) ระบบคอมพิวเตอร์ที่จะใช้โครงสร้าง
แบบนี้ ต้องมีคุณสมบัติกำหนดโดยตารางเพจจะมีเพียงหนึ่งโพรเซสใช้งานพื้นที่หน่วยความจำ
7.11.2 Paging และการแก้ไขปัญหา External Fragmentation การจองพื้นที่ในเพจจิ้งจะจองเป็น nPage เสมอ โดยค่า n จะเป็นจำนวนเต็ม และ Page คือ
ปริมาณข้อมูลใน 1 หน้ากระดาษ
7.12 การแก้ปัญหา Internal Fragmentation ปัญหา Internal fragmentation คือ การใช้งานพื้นที่ไม่คุ้มค่า จากหลักการของเพจจิ้ง จะมีน้อย
ครั้งมากที่ขนาดของข้อมูลกับขนาดหน้าจะเท่ากันพอดี
7.13 การแบ่งส่วน การแบ่งหน่วยความจำเป็นหน้าทำให้เกิดหน่วยความจำทางตรรกะ (ซึ่งผู้ใช้มองเห็น) แตกต่างไป
7.13.1 วิธีพื้นฐาน (Basic Method) วิธีการนี้เป็นการจัดสรรพื้นที่ในหน่วยความจำหลักออกเป็นส่วน ๆ ตามขนาดของโปรแกรมหรือ
โมดูลย่อย เรียกพื้นที่นี้ว่า Segmentโดยแต่ละโมดูลจะถูกแบ่งออกเป็นส่วน ๆ (Segments) ที่มีขนาดไม่เท่ากัน
7.13.2 ฮาร์ดแวร์(Hardware) แม้ว่าผู้ใช้สามารถอ้างอิงส่วนต่าง ๆ ของโปรแกรมโดยใช้ตำแหน่งแบบ 2 มิติ แต่หน่วยความจำจริง
ยังคงเป็นแบบมิติเดียวคือเป็นแถวของคำเรียงต่อกันไป จึงต้องมีวิธีการจับคู่ตำแหน่งทางตรรกะแบบสองคือเป็นแถวของคำเรียงต่อกันไป จึงต้องมีวิธีการจับคู่ตำแหน่งทางตรรกะแบบสองมิติ ให้เป็นตำแหน่งจริงมิติเดียว
7.13.3 การสร้างตารางเลขตอน (Implementation of Segmentation Tables) การแบ่งเป็นตอน คล้ายกับการแบ่งหน่วยความจำหลักออกเป็นส่วน ๆ ให้หัวข้อต้น ๆ มีข้อแตกต่างหลัก คือ โปรแกรมหนึ่ง ๆ อาจมีได้หลายส่วน (หรือหลายตอน)
7.13.4 การป้องกันและการใช้ตอนร่วมกัน (Protection and Sharing) ข้อดีหลักของการแบ่งเป็นตอน คือ สามารถผนวกการป้องกันไปกับแต่ละตอนได้ เพราะแต่ละตอนคือส่วนต่าง ๆ ของโปรแกรมที่มีลักษณะต่าง ๆ กันข้อมูลในตอนเดียวกันมักจะมีการใช้งานเหมือน ๆ กัน
7.13.5 การสูญเปล่าพื้นที่ย่อย (Fragmentation) ตัวจัดตารางการทำงานระยะยาว มีหน้าที่จัดหาเนื้อที่ในหน่วยความจำหลักให้โปรแกรมของผู้ใช้
ทุก ๆ คน ซึ่งก็เหมือนในระบบแบ่งเป็นหน้า ยกเว้นว่า การแบ่งเป็นตอน ขนาดของพื้นที่แต่ละตอนไม่เท่ากัน (ขนาดของหน้า เท่ากันหมดทุกหน้า)
7.14 สรุป การจัดการแบ่งทางกายภาพ หน่วยความจำแบ่งเป็น 2 ส่วนคือ หน่วยความจำหลักและหน่วยความจำสำรอง ลักษณะของหน่วยความจำหลักจะมีราคาแพง ทำงานได้เร็ว แต่เลือนหายได้ในการท างานจริงจึงต้องมีการเคลื่อนย้ายทางกายภาพระหว่างหน่วยความจ าทั้งสองตลอดเวลา ซึ่งเป็นหน้าที่ของระบบที่ต้องจัดสรรให้สอดคล้องกับการทำงานแบบ Multiprogrammingในการทำงานจริงจึงต้องมีการเคลื่อนย้ายทางกายภาพระหว่างหน่วยความจำทั้งสองตลอดเวลา ซึ่งเป็น
หน้าที่ของระบบที่ต้องจัดสรรให้สอดคล้องกับการทำงานแบบ Multiprogramming