บทที่ 4 การจัดการหน่วยความจำ

 บทที่ 4
การจัดการหน่วยความจำ
นาย ธนาธิป เล็กกุล รหัส 6031280003

5.1 กระบวนการจัดการหน่วยความจำ 5.1.1 การย้ายตำแหน่ง (Relocation)
ระบบปฏิบัติการในปัจจุบัน ยอมให้โปรแกรมทำงานพร้อมกันได้หลายงานแบบ multiprogramming ซึ่งโปรเซสต่าง ๆ เข้าใช้งานหน่วยความจำร่วมกัน จึงต้องมีการสลับโปรแกรมให้เข้าออกหน่วยความจำได้ รวมถึงการเปลี่ยนแปลงค่าตำแหน่งในหน่วยความจำที่อ้างถึงในโปรแกรม ให้ถูกต้องตามตำแหน่งจริงในหน่วยความจำ เช่นโปรแกรม a อ้างถึงตำแหน่งที่ 1000 และโปรแกรม b ก็อ้างถึงตำแหน่งที่ 1000 เช่นกัน
ค่า address แบ่งได้ 2 ค่า
1. Absolute address หมายถึง ตำแหน่งจริงของโปรเซสที่อยู่ในหน่วยความจำ
2. Relative address หมายถึง ตำแหน่งของคำสั่ง หรือโปรแกรมของโปรเซสหลังจากการ compile

5.1.2 การป้องกันพื้นที่ (Protection)
ระบบปฏิบัติการควรสามารถป้องกันโปรเซส จากการถูกรบกวน ทั้งทางตรง และทางอ้อม ดังนั้นก่อนให้โปรเซสใดเข้าครอบครองหน่วยความจำ จะต้องมีการตรวจสอบก่อน และใช้เวลาค้นหาเพื่อตรวจสอบตลอดเวลา

5.1.3 การใช้พื้นที่ร่วมกัน (Sharing)
การป้องกันเพียงอย่างเดียว อาจทำให้การใช้ทรัพยากรไม่คุ้ม จึงต้องมีการจัดสรรให้ใช้พื้นที่ของหน่วยความจำร่วมกันอย่างยืดหยุ่น

5.1.4 การจัดการแบ่งโปรแกรมย่อย (Logical organization)
ระบบปฏิบัติการจะแบ่งโปรแกรมเป็นโปรแกรมหลัก และโปรแกรมย่อย โดยนำเฉพาะโปรแกรมหลักลงในหน่วยความจำ แต่นำโปรแกรมย่อยลงหน่วยความจำเฉพาะเมื่อมีการเรียกใช้เท่านั้น
ประโยชน์ที่ได้จากการจัดการแบ่งโปรแกรมออกเป็นโปรแกรมย่อย มีดังนี้
1. โปรแกรมย่อยที่ไม่ได้ใช้งาน จะไม่นำลงหน่วยความจำหลัก
2. โปรแกรมย่อยแต่ละตัวสามารถถูกเขียน และแปลแยกกันได้
3. โปรแกรมย่อยแต่ละตัวมีระดับการป้องกันแต่กต่างกัน
4. โปรแกรมหลักสามารถเรียกใช้โปรแกรมย่อยเหล่านี้ร่วมกันได้

5.1.5 การจัดการแบ่งทางกายภาพ (Physical organization)
หน่วยความจำแบ่งเป็น 2 ส่วนคือ หน่วยความจำหลัก และหน่วยความจำสำรอง ลักษณะของหน่วยความจำหลักจะมีราคาแพง ทำงานได้เร็ว แต่เลือนหายได้ ในการทำงานจริง จึงต้องมีการเคลื่อนย้ายทางกายภาพระหว่างหน่วยความจำทั้ง 2 ตลอดเวลา ซึ่งเป็นหน้าที่ของระบบที่ต้องจัดสรรให้ให้สอดคล้องกับการทำงานแบบ multiprogramming 
5.2 หน่วยความจำหลัก (Main memory) การจัดการหน่วยความจำมีหลายระบบ เริ่มจากแบบไม่ซับซ้อน ไปถึงซับซ้อน ในบทนี้จะเรียนรู้แบบไม่ซับซ้อน ซึ่งไม่ถูกนำมาใช้งานในระบบปฏิบัติการปัจจุบัน แต่อาจใช้ในคอมพิวเตอร์ขนาดเล็กอยู่ การเรียนรู้เรื่องนี้อาจ นำไปประยุกต์ในการพัฒนางานด้าน software อื่น ๆ ได้
5.2.1 ระบบโปรแกรมเดียว (Monoprogramming)
เป็นวิธีการจัดการที่ง่ายที่สุด โดยกำหนดเพียง 1 โปรแกรม ให้ทำงานในหน่วยความจำเพียงโปรแกรมเดียว

5.2.2 ระบบหลายโปรแกรมที่กำหนดขนาดพาร์ติชั่นคงที่ (Multiprogramming with fixed partition)
ปัจจุบันระบบปฎิบัติการยอมให้มีหลายโปรเซสทำงานพร้อมกันได้ หมายความว่าขณะที่โปรเซสหนึ่งทำเสร็จ อีกโปรเซสที่รอ ก็เข้าใช้หน่วยความจำทันที โดยแบ่งหน่วยความจำออกเป็น partition การแบ่งเห็นแต่ละ partition แบบตายตัว มีจุดบกพร่อง จึงมีการจัดการหน่วยความจำแบบ FCFS : first come first serve การจัดการแบบนี้ย่อมมีปัญหา จึงเป็นหน้าที่ของระบบปฏิบัติการ ที่ต้องจัดการ

5.2.3 ระบบที่กำหนดขนาดของพาร์ติชั่นให้เปลี่ยนแปลงได้ (Dynamic partition)
เพื่อแก้ปัญหาของการกำหนดแบบคงที่ จึงออกแบบการกำหนด partition แบบเปลี่ยนแปลงได้ ซึ่งมีความซับซ้อน มากขึ้น ตามโปรเซสที่เข้าใช้หน่วยความจำ

5.2.4 การจัดการแบบระบบบัดดี้ (Buddy system)
ระบบจัดการหน่วยความจำแบบคงที่ และเปลี่ยนแปลงได้ อาจมีข้อจำกัดเรื่องการรองรับจำนวนโปรเซส และใช้พื้นที่ไม่เต็มประสิทธิภาพได้ ส่วนการแบ่งแบบเปลี่ยนแปลงได้ก็มีความซับซ้อนในทางปฏิบัติ และใช้ทรัพยากร จึงมีการผสมระหว่าง 2 ระบบนี้เข้าด้วยกัน ระบบนี้จะแบ่งพื้นที่เป็น 2 ส่วน และตรวจสอบว่าพอจะแบ่งให้กับโปรเซสล่าสุดได้หรือไม่ ถ้าแบ่งแล้วเข้าไม่ได้ ก็จะแบ่งขนาดเท่าก่อนหน้าที่ถูกแบ่ง และจัดเรียงพื้นที่เป็นแบบ link list ไว้รอการเข้าใช้ของโปรเซส

การจองพื้นที่ในหน่วยความจำหลัก มี 4 รูปแบบ
1. Single-user contiguous memory allocation ยุคแรกมีผู้ใช้คนเดียว โหลดไปไว้ในหน่วยความจำหลักหมด
2. Fixed Partitions ยุคมัลติโปรแกรมมิ่ง จะแบ่งส่วนที่ต้องอยู่ กับส่วนที่เคลื่อนย้ายได้ โดยจัดการผ่าน Partition Manager มีปัญหา อาทิ เกิดพื้นที่ว่างใน Internal fragmentation มีขนาดใหญ่ เป็นต้น
3. Dynamic Partitions จะเปิดให้งานเข้าจองหน่วยความจำในขนาดที่ต้องการได้ แต่ก็ยังมีปัญหาขนาด External fragmentation เกิดขึ้น โดยแบ่งการจองพื้นที่เป็น 3 แบบ คือ First-fit, Best fit (เลือกพื้นที่ว่างเล็กสุด) และ worst-fit (เลือกพื้นที่ว่างใหญ่สุด)
4. Relocationable Dynamic Partitons จะมี Memory manager คอยจัดการขยับตำแหน่งการอ้างอิง ทำให้เหลือ block ใหญ่ที่เดียว เรียกว่า Compaction หรือ Garbage collection หรือ Defragmentation
หลักการของ Overlay คือ การแบ่งส่วนงานออกเป็นหลายส่วนตามการทำงาน นำเข้าหน่วยความจำหลักในเวลาที่ต้องใช้ และทับหน่วยความจำหลักเดิมที่ไม่ใช้ ซึ่งเป็นหลักการที่ใช้ใน Single-user contiguous memory allocation
Bound register คือ การเก็บตำแหน่งหน่วยความจำที่เก็บตำแหน่งสูงสุด หรือต่ำสุดที่มีการใช้งานหน่วยความจำหลัก แล้วอ้างอิงไปใช้ใน memory manager ไม่ให้ใช้เกินขอบเขตที่กำหนดไว้
Relocation register คือ การเก็บตำแหน่งงานว่างานถูกเปลี่ยนไปจากตำแหน่งเดิมเท่าใด หากต้องการรู้ตำแหน่งปัจจุบันต้องใช้ตำแหน่งเดิม และตำแหน่ง Relocation register เพื่อใช้อ้างอิงในการนำมาใช้ต่อไป
Internal Fragmentation คือ งานที่มีขนาดใหญ่ เมื่อใช้ไปสักระยะ จะกินพื้นที่เล็กลง พื้นที่ ๆ เหลือ เรียกว่า การแตกกระจายภายใน (Internal Fragmentation)
External Fragmentation คือ งานที่ครอบครองหน่วยความจำ เมื่อใช้งานเสร็จ และเลิกใช้ พื้นที่นั่นจะว่าง เรียกว่า การแตกกระจายภายนอก (External Fragmentation)
5.3 การแบ่งเป็นหน้า (Paging) ระบบที่ใช้หน่วยความจำเสมือน (Virtual memory) มักใช้เทคนิคที่เรียกว่า การแบ่งหน้า หรือเพจจิ่ง(Paging) เพื่อเชื่อมระหว่างตำแหน่งทางตรรก กับเลขของเฟรมในหน่วยความจำหลัก
5.3.1 ตารางหน้า (Page table)
หมายถึงการรับค่าตำแหน่งทางตรรกเป็นค่านำเข้า แล้วหาเลขของเฟรมในหน่วยความจำหลักออกมา เทคนิคตารางหน้า(Page table) มักมีขนาดใหญ่ และต้องทำด้วยความเร็วสูง หากสรุปแล้วตารางหน้า ก็คือตารางที่เก็บอาร์เรย์ของรีจิสเตอร์นั่นเอง

5.3.2 บัฟเฟอร์ค้นหาที่อยู่ (TLB : Translation lookaside buffer)
ทุกครั้งที่เรียกใช้หน่วยความจำเสมือน ย่อมเรียกใช้หน่วยความจำหลัก 2 ครั้ง คือ การอ่านตารางหน้า และอ่านข้อมูลจริงจากหน่วยความจำหลัก ดังนั้นการทำงานแบบนี้จึงใช้เวลาถึง 2 เท่า จึงมีการใช้ cach memory ซึ่งทำหน้าที่เก็บตารางหน้าที่เคยถูกเรียกใช้ หรือเรียกว่า บัฟเฟอร์ค้นหาที่อยู่ (TLB : Translation Lookaside Buffer) ถ้าพบใน TLB จะเรียก TLB hit ถ้าไม่พบเรียก TLB miss และเข้าไปอ่านตารางหน้า เมื่ออ่านแล้วก็จะนำมาเพิ่มใน TLB สำหรับโอกาสที่จะถูกเรียกในอนาคต
5.4 การสับเปลี่ยนหน้า (Page replacement algorithms)
5.4.1 วิธีสับเปลี่ยนแบบมาก่อน-ออกก่อน (FIFO : First in first out algorithm)
5.4.2 วิธีสับเปลี่ยนแบบให้โอกาสครั้งที่สอง (Second change page replacement algorithm)
5.4.3 วิธีสับเปลี่ยนแบบวงรอบนาฬิกา (Clock page replacement algorithm)
5.4.4 วิธีสับเปลี่ยนแบบที่ดี่สุด (Optimal page replacement algorithm)
5.4.5 การสับเปลี่ยนแบบที่ไม่ได้ใช้งานออกก่อน (NRU : Not recently used)
5.4.6 การสับเปลี่ยนแบบใช้งานน้อยที่สุดออกก่อน (LRU : Least recently used)
ใช้ข้อมูลในอดีตประมาณการณ์อนาคต
5.5 การแบ่งเป็นเซ็กเมนต์ (Segmentation) การแบ่งหน้าจะแบ่งให้มีขนาดเท่ากัน แต่การแบ่งเป็นเซ็กเมนต์จะแบ่งโปรแกรมออกเป็นส่วน ๆ ไม่เท่ากัน และมีการใช้ตำแหน่งทางตรรก อ้างอิงตำแหน่งจริงเช่นกัน และมีการใช้ข้อมูล 2 ส่วนคือ เลขที่เซ็กเมนต์ และระยะเริ่มต้นของเซ้กเมนต์(Offset) สำหรับผลของการแบ่งเซ็กเมนต์ทำให้เกิดชิ้นส่วนไม่เท่ากัน (Dynamic partitioning) ซึ่งลดปัญหาการสูญเสียพื้นที่ (Internal fragmentation)
5.5.1 การนำวิธีการแบ่งเป็นเซ็กเมนต์มาใช้ในหน่วยความจำเสมือน
5.5.2 การรวมวิธีการแบ่งเป็นหน้ากับการแบ่งเป็นเซ็กเมนต์เข้าด้วยกัน
5.6 ปฏิบัติการฝึกเขียนแผนภาพ และฝึกเปลี่ยน RAM
- ฝึกเปลี่ยน RAM บน mainboard และศึกษารุ่นต่าง ๆ ที่มีในปัจจุบัน
- ฝึกเขียนแผนภาพแสดงการสับเปลี่ยนแบบต่าง ๆ
- ค้นคว้าข้อมูลเกี่ยวกับ การจัดการหน่วยความจำ จากอินเทอร์เน็ต แล้วทำรายงาน และส่งตัวแทนนำเสนอหน้าชั้น

Memory Management
การจัดหน่วยความจำ เป็นงานอย่างหนึ่งของโอเอส ถ้าหน่วยความจำมีปริมาณมาก ขีดความสามารถในการทำงานก็จะเพิ่มขึ้นด้วย โปรแกรมที่มีความสลับซับซ้อนและมีความสามารถมากก็ต้องการหน่วยความจำมาก จึงจำเป็นต้องใช้หน่วยความจำที่มีอยู่ให้เกิดประโยชน์สูงสุด หน้าที่ของโอเอสเช่น ดูว่าโปรแกรมใหม่จะถูกนำไปวางไว้ในหน่วยความจำตรงที่ใด? เมื่อใด? หน่วยความจำไหนควรถูกใช้ก่อนหรือหลัง? โปรแกรมไหนจะได้ใช้หน่วยความจำก่อน?
การจัดหน่วยความจำของโอเอส มีวิธีการจัดอยู่ 3 อย่างคือ
1. วิธีการเฟตช์ (fecth strategy)
2. วิธีการวาง (placement strategy)
3. วิธีการแทนที่ (replacement strategy)

การจัดสรรหน่วยความจำ

ทุกโปรแกรมมีความจำเป็นต้องใช้หน่วยความจำในระบบ จะใช้มากหรือน้อยขึ้นอยู่กับการทำงานและขนาดของโปรแกรม โปรแกรมจะทำงานได้ก็ต่อเมื่อมันได้ถูกนำไปวาง (Load) ไว้ในหน่วยความจำแล้วเท่านั้น การที่โปรแกรมได้เข้าไปใช้หน่วยความจำของระบบเป็นเพราะการจัดสรรหน่วยความจำ(Memory allocation) ของโอเอส
- การจัดสรรหน่วยความจำแบบต่อเนื่อง คอมฯยุคก่อนครอบครองหน่วยความจำให้โปรแกรมต่าง ๆ จะเป็นแบบต่อเนื่องทั้งสิ้น คือ โปรแกรมหนึ่ง ๆ จะถูกโหลดลงหน่วยความจำได้ก็ต่อเมื่อมีหน่วยความจำขนาดใหญ่พอที่วางโค้ดของโปรแกรมนั้นลงไปทั้งโปรแกรม นั่นคือโปรแกรมจะอยู่ติดต่อกันในหน่วยความจำผืนเดียวกัน ถ้าหากไม่มีที่ว่างโปรแกรมก็จะทำงานไม่ได้จนกว่าจะมีพื้นที่เหลือพอ
- การจัดสรรหน่วยความจำแบบไม่ต่อเนื่อง การครอบครองหน่วยความจำแบบนี้ ตัวโปรแกรมจะถูกแบ่งออกเป็นกลุ่มหรือส่วนย่อย ๆ หลายส่วน เมื่อโปรแกรมถูกรัน แต่ละส่วนจะถูกโหลดลงสู่หน่วยความจำตรงไหนก็ได้ที่มีพื้นที่ว่างพอ แต่ละส่วนไม่จำเป็นต้องเรียงเป็นผืนแผ่นเดียว

ระบบโปรแกรมเดี่ยว (Single program)
คอมพิวเตอร์ระบบนี้จะสามารถรันโปรแกรมของผู้ใช้ได้เพียงครั้งละ 1 โปรแกรมเท่านั้น สามารถแบ่งส่วนของหน่วยความจำออกเป็น 2 ส่วนคือ
1. ส่วนของโอเอส คือหน่วยความจำที่ถูกครอบครองโดยโอเอส อย่างที่ทราบกันว่าโอเอสก็เป็นโปรแกรมเช่นกัน โอเอสจะครอบครองหน่วยความจำที่ริมด้านใดด้านหนึ่งหรือทั้ง 2 ด้าน เพื่อให้พื้นที่เหลือยาวต่อเนื่องเป็นผืนใหญ่ผืนเดียว
2. ส่วนของผู้ใช้ (User area) คือส่วนที่สามารถนำโปรแกรมของผู้ใช้ไปวางได้ ดังนั้นในส่วนนี้คือหน่วยความจำที่เหลือจากส่วนของโอเอส

ระบบหลายโปรแกรม

การทำงานของโปรแกรมส่วนมากจะเสียเวลาไปกับการทำงานด้าน Input-Output ซึ่งเป็นงานที่ไม่ต้องใช้Cpu ดังนั้นเวลาที่ใช้ซีพียูจริง ๆ นั้นมีน้อยมากในระบบโปรแกรมเดี่ยว ช่วงเวลาที่รอการทำงานของ routine ทางอินพุต-เอาต์พุต ซีพียูจะอยู่เฉย (idle) ไม่ได้ทำงาน ดังนั้นในช่วงเวลานี้เราอนุญาติให้นำโปรแกรมอื่นเข้ามาใช้ซีพียูได้มันจึงคุ้มค่า แนวคิดนี้จึงสร้างคอมพิวเตอร์ที่สามารถรันได้หลาย ๆ โปรแกรมในเวลาเดียวกัน เรียกระบบนี้ว่าระบบหลายโปรแกรม (Multiprogramming) เมื่อคอมฯสามารถรันได้หลายโปรแกรมพร้อม ๆ กันจึงจำเป็นต้องแบ่ง partition หน่วยความจำออกเป็นส่วน ๆ สำหรับแต่ละโปรแกรมเพื่อไม่ให้ปะปนกัน และเพื่อให้รันโปรแกรมได้หลายโปรแกรม
วิธีที่ทำให้คอมพิวเตอร์สามารถทำงานได้หลายโปรแกรมมีหลายแบบ อาจจัดประเภทได้ดังนี้
1. ระบบหลายโปรแกรมแบบแบ่งหน่วยความจำ (partition multiprogramming) ในหน่วยความจำจะมีโปรแกรมหลาย ๆ โปรแกรมอยู่พร้อมกันโดยแบ่งหน่วยความจำเป็นส่วน ๆ ไป ส่วนหนึ่ง ๆ จะมีโปรแกรมเพียงโปรแกรมเดียว โปรแกรมต่าง ๆ จะครอบครองหน่วยความจำแบบต่อเนื่องในส่วนที่มันครอบครองระบบอาจแบ่งแยกได้อีก 2 ประเภทคือ 1. การแบ่งหน่วยความจำขนาดคงที่ (Fixed partition multiprogramming) และการแบ่งหน่วยความจำขนาดไม่คงที่ (Variable partition multiprogramming)
2. ระบบหลายโปรแกรมแบบสลับหน่วยความจำ (Multiprogramming with storage swaping)

การแบ่งหน่วยความจำขนาดคงที่
วิธีนี้หน่วยความจำถูกแบ่งออกเป็นหลายส่วน แต่ละส่วนมีขนาดคงที่และมีโปรแกรมอยู่โปรแกรมเดียว ดังนั้นจำนวนโปรแกรมที่จะทำงานได้พร้อมกันจะเท่ากับจำนวนของส่วนย่อยของหน่วยความจำ
- การแปลงและโหลดด้วยค่าสัมบูรณ์ (Absolute translation and loading) งานหรือโปรแกรมของผู้ใช้ถูกแปลเป็นภาษาเครื่องด้วยค่าแอดเดรสสัมบูรณ์ ก็เพื่อให้รันได้ในส่วนที่กำหนดเท่านั้น ค่าแอดเดรสสัมบูรณ์คือค่าแอดเดรสจริง ๆ ในหน่วยความจำ เช่นคำสั่งกระโดดไปที่แอดเดรส 5000 ค่า 5000 นี้จะเป็นแอดเดรส 5000 ในหน่วยความจำจริง ๆ สำหรับการกำหนดว่าโปรแกรมจะไปอยู่ส่วนใดขึ้นอยู่กับขนาดของโปรแกรมและขนาดของส่วนย่อยให้หน่วยความจำด้วย เช่น ส่วนที่1 มีขนาด 5 kb ส่วนที่2 มีขนาด 10 kb ส่วนที่3 มีขนาด 50 kb โปรแกรมที่มีขนาดเล็กกว่า 50 kb แต่ใหญ่กว่า 10 kbจะถูกจัดลงในส่วนที่ 3 โปรแกรมที่มีขนาดเล็กกว่า 10 kb แต่ใหญ่กว่า 5 kb จะถูกจัดลงในส่วนที่ 2 และโปรแกรมที่มีขนาดเล็กกว่า 5 kb จะถูกจัดลงในส่วนที่ 1 ข้อเสียของวิธีนี้คือ ถ้าโปรแกรมที่พร้อมจะรันแล้ว แต่ละส่วนของหน่วยความจำที่มันจะถูกโหลดไปกำลังถูกใช้โดยโปรแกรมอื่น มันต้องรอจนกว่าโปรแกรมนั้นจะเสร็จ ถึงแม้ว่าส่วนอื่นยังว่างอยู่ก็ตาม
- การแปลงและโหลดด้วยค่าสัมพัทธ์ (Relocatable translation and loading) เพื่อแก้ปัญหาที่เกิดขึ้นของการแปลงและโหลดด้วยค่าสัมบูรณ์ โปรแกรมจะถูกแปลงเพื่อให้ได้แอดเดรสที่เป็นค่าสัมพัทธ์กับจุดเริ่มต้นของโปรแกรม จุดเริ่มต้นของโปรแกรมคือแอดเดรส 0 ถ้ามีคำสั่งกระโดดไปที่แอดเดรส 50 ค่า 50 นี้จะหมายถึงแอดเดรสที่ห่างจากจุดเริ่มต้น 50 ไบต์ สมมติว่าโปรแกรมถูกโหลดลงที่แอดเดรสเริ่มต้นที่ 5000 ในหน่วยความจำ กระโดดไปที่แอดเดรส 50 จะหมายถึงการกระโดดไปที่แอดเดรส 5050 ในหน่วยความจำ การแปลงและการโหลดด้วยค่าสัมพัทธ์ทำให้โปรแกรมถูกโหลดลงส่วนใดก็ได้ของหน่วยความจำ(แต่ต้องมีขนาดมากกว่าหรือเท่ากับขนาดของโปรแกรมนั้น)
การจัดแบ่งพื้นที่ในหน่วยความจำไม่ว่าจะใช้วิธีใดก็ตามย่อมต้องเกิดส่วนที่ไม่ถูกใช้งาน เรียกว่าเกิดการแตกกระจาย (Fragmentation) ในการจัดการแบบแบ่งหน่วยความจำขนาดคงที่ การแตกกระจายเกิดขึ้นได้ 2 กรณีคือกรณีส่วนที่ถูกแบ่งของหน่วยความจำไม่ได้ถูกใช้งานเรียกว่าเป็น การแตกกระจายภายนอก(External fragmentation) และกรณีที่โปรแกรมของผู้ใช้ ใช้เนื้อที่ในส่วนย่อยไม่เต็มเรียกว่าเป็นการแตกกระจายภายใน(Internal fragmentation)

การแบ่งหน่วยความจำไม่คงที่

ผู้สร้างโอเอสได้ตระหนักถึงข้อเสียของการแบ่งหน่วยความจำขนาดคงที่ จึงคิดว่าควรปรับปรุงการแบ่งหน่วยความจำให้ดีขึ้น จึงเปลี่ยนวิธีแบ่งหน่วยความจำใหม่คือ โอเอสจะยอมให้โปรแกรมครอบครองหน่วยความจำมากเท่าที่โปรแกรมต้องการ ไม่มีการจำกัดขอบเขตของส่วนย่อย ๆ ที่แน่นอนอีกต่อไป วิธีการนี้จึงเรียกว่าการแบ่งหน่วยความจำขนาดไม่คงที่
ระบบหลายโปรแกรมประเภทแบ่งหน่วยความจำขนาดไม่คงที่ยังคงเป็นการจัดสรรหน่วยความจำแบบต่อเนื่อง เราสามารถรันโปรแกรมขนาดใหญ่เท่าใดก็ได้ ถ้าไม่ใหญ่เกินกว่าขนาดของหน่วยความจำในส่วนของผู้ใช้ ถ้าโปรแกรมต่าง ๆ มีขนาดเล็กคอมพิวเตอร์ก็สามารถรันได้หลายงานมากขึ้นแต่ถ้าโปรแกรมมีขนาดใหญ่คอมพิวเตอร์ก็จะรันโปรแกรมได้จำนวนน้อยลง ถึงแม้ว่าการแบ่งหน่วยความจำชนิดนี้จะวางโปรแกรมให้ติดกันเพื่อไม่ให้เกิดพื้นที่ว่าง การสูญเสียเนื้อที่ในหน่วยความจำเนื่องจากไม่ได้ถูกใช้งานก็ยังเกิดขึ้นได้ กรณีแรกเกิดจากพื้นที่เหลือในส่วนสุดท้ายอาจเหลือเพียงเล็กน้อยไม่เพียงพอสำหรับโปรแกรมใด ๆ อีกกรณีหนึ่งคือ เมื่อโปรแกรมใดเสร็จสิ้น โปรแกรมออกจากระบบต้องคืนพื้นที่หน่วยความจำที่มันครอบครองอยู่ให้กับระบบ ดังนั้นจึงเกิดเป็นเนื้อที่ว่างขึ้น เนื้อที่ว่างเหล่านี้เรียกว่าช่องโหว่หรือโฮล (Hole)

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

บทที่ 5 หน่วยความจำเสมือน

ใบงานที่ 2 การจัดการ Process