การจัดการหน่วยความจำ
ใบงานที่4 การจัดการหน่วยความจำ
โดยนายเอกมนตรี กระดุมผล รหัสนักศีกษา6031280071
การจัดการหน่วยความจำ
Memory Management
หน่วยความจำหลัก
หน้าที่หน่วยความจำหลัก
-เก็บระบบปฏิบัติการ
-เก็บโปรแกรมของผู้ใช้
-เก็บข้อมูลที่จะใช้
องค์ประกอบหน่วยความจำ
-แอดเดรส (address)
-ข้อมูล (data)
ความต้องการหน่วยความจำ
-ความเร็วสูง
-มีความเสถียรสูง
-ความจุสูง
-ราคาต่ำ
ชนิดของหน่วยความจำ
-หน่วยความจำหลัก
ROM เป็นหน่วยความจำถาวร ไม่สูญเสียข้อมูลแม้ไฟดับ มักใช้เก็บข้อมูลพื้นฐานที่จำเป็น
RAM มักจะใช้เป็นหน่วยความจำหลัก มีอยู่ 2 ประเภท คือ static ram และ dynamic ram
-หน่วยความจำสำรอง
มีความเร็วช้า เก็บไว้ได้นาน เช่น ดิสก์ ฮาร์ดดิสก์
การจัดการหน่วยความจำ (Memory Management)
หน่วยความจำหลักเป็นศูนย์กลางของการทำงานต่าง ๆ ของระบบคอมพิวเตอร์ในปัจจุบัน
หน่วยความจำหลักคือพื้นที่เก็บข้อมูลขนาดใหญ่
ประกอบด้วย
พื้นที่เก็บข้อมูลย่อย มีหน่วยเป็น Byte
ตำแหน่งหรือที่อยู่ของพื้นที่ย่อย (Address)
ส่วนของ OS ที่ทำหน้าที่จัดการกับหน่วยความจำได้แก่ ตัวจัดการหน่วยความจำ (Memory Manager) ซึ่งมีหน้าที่ต่าง ๆ ดังนี้
ตรวจสอบว่าส่วนใดของหน่วยความจำที่กำลังถูกใช้งาน ส่วนใดว่าง
จัดหน่วยความจำให้กับงานที่ทำงาน
ส่งหน่วยความจำคืนสู่ระบบเมื่องานเสร็จ
จัดการสลับหน่วยความจำหลัก กับพื้นที่ฮาร์ดดิสก์ เมื่อหน่วยความจำหลักมีขนาดเล็กเกินไปที่จะให้งานทำงานได้
การจัดการหน่วยความจำ (Memory Management)
การจัดสรรหน่วยความจำแบบต่อเนื่อง
การจัดสรรหน่วยความจำแบบไม่ต่อเนื่อง
การจัดสรรหน่วยความจำแบบต่อเนื่อง
โปรแกรมหนึ่ง ๆ จะถูกโหลดลงหน่วยความจำได้ก็ต่อเมื่อมีหน่วยความจำขนาดใหญ่ที่จะวางโค้ดของโปรแกรมนั้นลงไปทั้งโปรแกรม
โปรแกรมจะอยู่ติดต่อกันในหน่วยความจำหลักเป็นผืนเดียวกัน ไม่มีส่วนหนึ่งของโปรแกรมแยกจากกัน
ถ้ามีพื้นที่ว่างไม่พอก็จะรอจนกว่าจะมีหน่วยความจำว่างเหลือพอ
การจัดสรรหน่วยความจำแบบไม่ต่อเนื่อง
โปรแกรมจะถูกแบ่งออกเป็นกลุ่มหรือส่วนย่อย ๆ หลาย ๆ ส่วน เมื่อรันโปรแกรมจะโหลดลงหน่วยความจำที่ไหนก็ได้ที่มีที่ว่างพอ แต่ละส่วนไม่จำเป็นต้องเรียงต่อเป็นผืนเดียว
การจัดการหน่วยความจำหลักแบบต่าง ๆ
การจัดการหน่วยความจำนั้นมีหลายวิธี ตั้งแต่การจัดการแบบพื้นฐาน จนถึงแบบที่ซับซ้อน
การจัดการหน่วยความจำจึงมีการแบ่งออกเป็น 2 ระบบดังนี้
ระบบโปรแกรมเดี่ยว (Monoprogramming or Single program)
ระบบหลายโปรแกรม (Multiple program)
ระบบโปรแกรมเดี่ยว Monoprogramming or Single program
เป็นวิธีการจัดการหน่วยความจำที่ง่ายที่สุด เนื่องจากจะมีโปรแกรมเพียง 1 โปรแกรมทำงานในขณะใดขณะหนึ่ง
ดังนั้นการใช้งานหน่วยความจำจะมีเพียงโปรแกรมนั้น ๆ กับระบบปฏิบัติการเท่านั้น ดังรูป
จากรูปเราอาจแบ่งหน่วยความจำหลักออกเป็น 2 ส่วนคือ
ส่วนของ OS เป็นหน่วยความจำที่ถูกครอบครองโดย OS
ส่วนของผู้ใช้ (User area) คือส่วนที่สามารถนำโปรแกรมของผู้ใช้ลงไปวางได้ ซึ่งก็คือหน่วยความจำหลักทั้งหมดที่เหลือจากส่วนของ OS
เมื่อหน่วยความจำหลักถูกแบ่งออกเป็น 2 ส่วนแล้ว ตัว OS จึงจำเป็นต้องมีวิธีการป้องกันไม่ให้โปรแกรมของผู้ใช้รุกล้ำเข้ามาในส่วนของ OS
ถ้า OS ปล่อยให้ผู้ใช้เข้ามาใช้หน่วยความจำที่ OS ใช้อยู่ โปรแกรมของผู้ใช้อาจทำลายตัวโปรแกรมของ OS เสียหายจนระบบทำงานไม่ได้
วิธีที่นิยมในการป้องกันการรุกล้ำได้แก่การสร้างรีจีสเตอร์ขึ้นมาในซีพียูเรียกว่ารีจีสเตอร์ขอบเขต (boundary register)
รีจีสเตอร์จะทำหน้าที่เก็บค่าแอสเดรสที่เป็นรอยต่อระหว่างส่วนของ os และส่วนของผู้ใช้
ระบบหลายโปรแกรม Multiple program
ระบบคอมพิวเตอร์ส่วนใหญ่ในปัจจุบันอนุญาตให้มีงานหลาย ๆ งานทำงานในเวลาเดียวกัน
การที่ระบบมีหลายงานทำงานพร้อมกันนั้น หมายความว่าแต่ละงานต้องถูกบันทึกอยู่ในหน่วยความจำหลัก
ดังนั้นเพื่อให้คอมพิวเตอร์สามารถทำงานหลายงานพร้อมกัน จึงจำเป็นต้องทำการแบ่งพื้นที่หน่วยความจำออกเป็นส่วน ๆ สำหรับแต่ละงานเพื่อไม่ให้ปะปนกัน
การแบ่งหน่วยความจำสำหรับระบบหลายโปรแกรมมี 2 แบบ
การแบ่งหน่วยความจำขนาดคงที่ (Fixed partition multi-programming)
การแบ่งหน่วยความจำขนาดไม่คงที่ (Variable partition multi-programming)
การแบ่งหน่วยความจำขนาดคงที่
วิธีนี้หน่วยความจำจะถูกแบ่งออกเป็นหลายส่วน แต่ละส่วนมีขนาด คงที่ และในแต่ละส่วนจะมีเพียงงานเดียว และการแบ่งนั้นจะเปลี่ยนแปลงอีกไม่ได้
ดังนั้นจำนวนงานที่ทำงานได้พร้อมกันจะเท่ากับจำนวนส่วนย่อยของหน่วยความจำหลัก
การแบ่งหน่วยความจำขนาดคงที่ แบ่งได้เป็น 2 แบบ
การแปลงและโหลดด้วยค่าสัมบูรณ์ (Absolute translation and loading)
การแปลงและโหลดด้วยค่าสัมพัทธ์ (Relocatable translation and loading)
การแปลงและโหลดด้วยค่าสัมบูรณ์ Absolute translation and loading
ค่าแอดเดรสสัมบูรณ์ คือค่าแอดเดรสจริง ๆ ในหน่วยความจำ
หน่วยความจำหลักจะถูกแบ่งออกเป็นส่วนที่มีขนาดคงที่ และแต่ละส่วนจะมีแอดเดรสที่เป็นขอบเขตบน และล่างอยู่ ดังนั้นเมื่องานต้องการใช้หน่วยความจำหลักในส่วนย่อยใดก็ตาม OS จะต้องกำหนดแอดเดรสจริงให้กับงาน เพื่อให้งานเข้าไปครอบครองหน่วยความจำหลักในส่วนที่ถูกต้อง
นิยมใช้กับคิวงานที่เป็นแบบ Multiple queues
ข้อเสียของวิธีนี้คือ ถ้างานพร้อมจะรันแล้ว แต่ส่วนของหน่วยความจำหลักที่ต้องการ กำลังถูกใช้โดยงานอื่น ก็ต้องรอจนกว่างานที่ใช้หน่วยความจำที่ต้องการทำงานเสร็จสิ้น ถึงแม้ว่าส่วนอื่น ๆ จะว่างอยู่ก็ตาม ทำให้สูญเสียหน่วยความจำในส่วนอื่นโดยเปล่าประโยชน์
ถ้างานส่วนใหญ่เป็นงานที่มีขนาดเล็ก คิวของส่วนที่มีขนาดเล็กจะเต็มอยู่ตลอดเวลา ในขณะที่คิวของส่วนที่มีขนาดใหญ่ยังคงว่างอยู่ ทำให้งานที่มีขนาดเล็กจะต้องรอในคิว ในขณะที่หน่วยความจำหลักยังเหลืออยู่มาก
เพื่อแก้ปัญหาที่เกิดขึ้นในการแปลงและโหลดด้วยค่าสัมบูรณ์ จึงทำให้เกิดวิธีการที่เรียกว่าการแปลงและโหลดด้วยค่าสัมพัทธ์
งานจะถูกแปลงให้ได้แอดเดรสเป็นค่าสัมพัทธ์กับจุดเริ่มต้นของงาน จุดเริ่มต้นของงานก็คือแอดเดรส 0 นั่นเอง
ถ้างานมีขนาด 100 byte เมื่องานถูกโหลดลงในหน่วยความจำหลักจะไม่รอให้แอดเดรส 0 ถึง 100 ว่าง แต่จะโหลดลงส่วนที่มีขนาดมากกว่าหรือเท่ากับขนาดของงาน
ดังนั้นคิวงานจึงไม่จำเป็นต้องเป็น Multiple Queues ใช้เป็น Single Queues
วิธีการจัดคิวใช้วิธี FCFS คืองานใดมาก่อนก็มีสิทธิ์โหลดลงในส่วนของหน่วยความจำหลักที่ชี้อยู่
แต่ถ้าขนาดของงานมีขนาดใหญ่กว่าส่วนของหน่วยความจำหลักที่ชี้อยู่ OS จะข้ามงานนั้นไปทำให้กับงานอื่น ๆ ที่อยู่ถัดไป
สำหรับงานที่ถูกข้ามก็จะต้องคอยอยู่ในคิว ซึ่ง OS จะกำหนดว่างานจะถูกมองข้ามได้ไม่เกินจำนวนครั้งที่กำหนด ถ้าเกินระบบจะต้องเลือกงานนั้นเข้าไปทำงาน
การป้องกัน OS ในระบบหลายโปรแกรมประเภทแบ่งหน่วยความจำนิยมใช้รีจีสเตอร์ขอบเขตหลาย ๆ ตัว ส่วนย่อยแต่ละส่วนจะใช้รีจีสเตอร์ขอบเขต 2 ตัว ในการแยกแยะส่วนแต่ละส่วน เรียกว่ารีจีสเตอร์ขอบเขตบน (high boundary register) และรีจีสเตอร์ขอบเขตล่าง (Low boundary register)
โปรแกรมของผู้ใช้สามารถข้ามเข้าไปในขอบเขตของ OS ได้โดยผ่านทางคำสั่งเรียกระบบ
ข้อเสียของการแบ่งหน่วยความจำขนาดคงที่
การแบ่งหน่วยความจำขนาดคงที่เป็นวิธีการที่ง่ายและไม่ซับซ้อนต่อการสร้าง OS อย่างไรก็ตามมีข้อเสียดังนี้
พื้นที่ที่กำหนดให้มีขนาดและจำนวนที่คงที่เมื่อระบบเริ่มทำงานนั้น จะเป็นตัวจำกัดจำนวนของงานที่สามารถเข้ามาใช้ระบบได้
เนื่องจากระบบมีการกำหนดพื้นที่แบบคงที่ ดังนั้นงานที่มีขนาดเล็กจะไม่สามารถใช้พื้นที่ของหน่วยความจำได้อย่างเต็มประสิทธิภาพ
การจัดแบ่งพื้นที่แบบคงที่จะทำให้เกิดส่วนที่ไม่ถูกใช้งาน ซึ่งเราเรียกว่าเกิดการแตกกระจาย (Fragmentation) ซึ่งมีอยู่ 2 รูปแบบ
การแตกกระจายภายนอก (External fragmentation)
การแตกกระจายภายใน (Internal fragmentation)
การแบ่งหน่วยความจำขนาดไม่คงที่ Variable partition multi-programming
จากปัญหาที่พบของการทำงานของการแบ่งหน่วยความจำขนาดคงที่ ผู้ออกแบบ OS จึงได้ทำการปรับปรุงการแบ่งหน่วยความจำให้ดีขึ้น
โดยระบบจะกำหนดให้มีการแบ่งหน่วยความจำตามความต้องการของงาน และไม่มีการจำกัดขอบเขตของหน่วยความจำหลัก
การแบ่งหน่วยความจำแบบนี้เรียกว่า การแบ่งหน่วยความจำขนาดไม่คงที่
จากรูปจะเห็นว่าเมื่อระบบทำงานไปได้สักระยะหนึ่ง เราจะพบช่องว่างเกิดขึ้นอย่างมากมายในหน่วยความจำหลัก ซึ่งจะทำให้การใช้งานหน่วยความจำหลักมีประสิทธิภาพลดลง
เราเรียกช่องว่างเล็ก ๆ เหล่านี้ว่า การแตกกระจายภายนอก (External fragmentation)
ดังนั้นการที่จะวางโปรเซสลงในหน่วยความจำหลักนั้นจะต้องมีการตัดสินใจที่ดี ซึ่ง OS เรียกว่า การจัดยุทธวิธีการวาง
การจัดยุทธวิธีการวาง
เมื่อมีโปรเซสถูกส่งเข้ามาในหน่วยความจำหลัก ซึ่งขณะนั้นหน่วยความจำหลักอาจมีช่องว่างเกิดขึ้นกระจายไปทั่ว
การจะจัดว่าโปรเซสใดควรจะวางไว้ในช่องว่างใด มีวิธีการอยู่ 3 แบบดังนี้
เลือกช่องว่างที่พบก่อน (First-Fit)
เลือกช่องว่างที่เหมาะสม (Best-Fit)
เลือกช่องว่างที่ใหญ่ที่สุด (Worst-Fit)
เลือกช่องว่างที่พบก่อน (First-Fit)
วิธีการนี้ OS จะตรวจหาช่องว่างในหน่วยความจำ เมื่อใดที่พบช่องว่างที่มีขนาดใหญ่พอที่จะวางโปรเซสใหม่ลงไปได้ OS จะเลือกช่องว่างนั้นทันที ทำให้การเลือกช่องว่างทำได้รวดเร็ว
เลือกช่องว่างที่เหมาะสม (Best-Fit)
วิธีการนี้ OS จะตรวจหาช่องว่างที่มีอยู่ในหน่วยความจำทั้งหมด แล้วเลือกเอาช่องว่างที่เมื่อวางโปรเซสลงไปแล้วจะเกิดช่องว่างขนาดเล็กที่สุด
เลือกช่องว่างที่ใหญ่ที่สุด (Worst-Fit)
การเลือกช่องว่างแบบนี้จะตรงกันข้ามกับแบบที่ 2 OS จะเลือกช่องว่างที่เมื่อวางโปรเซสลงไปแล้วจะเกิดช่องว่างขนาดใหญ่ที่สุด
การรวมโฮล (Coalescing Holes)
เมื่อมีช่องว่าง 2 ช่องติดกันในหน่วยความจำ OS สามารถที่จะรวมช่องว่างทั้ง 2 นี้เป็นช่องว่างขนาดใหญ่ช่องเดียว ซึ่งเราเรียกว่า การรวมโฮล (Coalescing Holes) แสดงดังรูป
การบีบอัดหน่วยความจำ (Storage Compaction)
ถึงแม้ว่าจะมีการรวมโฮลเกิดขึ้น แต่ช่องว่างที่ไม่อยู่ติดกันก็ยังคงมีกระจายอยู่ในหน่วยความจำ
ซึ่งการมีช่องว่างขนาดเล็ก ๆ หลายช่อง เมื่อนำมารวมกันก็จะทำให้เกิดช่องว่างขนาดใหญ่ซึ่งมากพอสำหรับ 1 โปรเซสได้
OS จะต้องสามารถที่จะทำการบีบอัดหน่วยความจำ โดยย้ายเอาหน่วยความจำที่ถูกครอบครองโดยโปรเซสต่าง ๆ ไปอยู่ชิดติดกันที่ด้านใดด้านหนึ่ง ซึ่งจะทำให้เกิดช่องว่างใหญ่เพียงช่องเดียว จึงทำให้โปรเซสอื่น ๆ สามารถเข้ามาใช้หน่วยความจำที่เหลือได้
ข้อเสียของการบีบอัดหน่วยความจำ
ระบบจะต้องหยุดการทำงานของโปรเซสทุกโปรเซสไว้ชั่วขณะหนึ่งเพื่อที่จะทำการบีบอัด
ซึ่งอาจจะต้องใช้เวลามากทำให้การทำงานของระบบช้าลง โดยเฉพาะกับการทำงานในระบบโต้ตอบ (Interactive)
ระบบหลายโปรแกรมแบบสลับหน่วยความจำ (multiprogramming with storage swapping)
เป็นการสลับโปรแกรมไปสู่หน่วยความจำสำรองเมื่อโปรแกรมไม่ต้องการหน่วยความจำหลักเรียกว่าการสลับออก (swapped out) และนำโปรแกรมเข้ามาใช้หน่วยความจำใหม่เมื่อต้องการใช้หน่วยความจำเรียกว่าการสลับเข้า (swapped in)
โปรแกรมจะอยู่ในหน่วยความจำและถูกสลับออกเมื่อเกิดเหตุการณ์ 3 กรณี คือ
โปรแกรมจบ
โปรแกรมต้องการใช้งานอินพุต-เอาต์พุต
หมดเวลาควอนตัม
การทำโอเวอร์เลย์
เนื่องจากโปรแกรมของผู้ใช้มีขนาดใหญ่กว่าหน่วยความจำหลัก จึงต้องแก้ปัญหานี้ ถ้าเป็นกรณีโปรแกรมเดี่ยวจะแก้ปัญหาด้วยการทำโอเวอร์เลย์
การทำโอเวอร์เลย์ (overlay) เป็นหน้าที่ของผู้เขียนโปรแกรมเอง OS ไม่ได้ จัดการให้
ผู้เขียนโปรแกรมแบ่งโปรแกรมออกเป็นส่วนย่อยหลาย ๆ ส่วน แต่ละส่วนต้องมีขนาดเล็กกว่าหน่วยความจำ อาศัยหลักการสลับโปรแกรม โดยที่ส่วนแรกจะอยู่ในหน่วยความจำตลอดเวลาแล้วโหลดส่วนอื่นเข้ามาทับ
หน่วยความจำเสมือน (Virtual Memory)
การใช้หน่วยความจำของโปรแกรมผู้ใช้ที่กล่าวมานั้น จะเห็นว่าขนาดของโปรแกรมต้องมีขนาดเล็กกว่าขนาดของหน่วยความจำที่เหลืออยู่
แต่ถ้าโปรแกรมของผู้ใช้มีขนาดใหญ่กว่า ไม่ว่าเราจะใช้วิธีการจัดการหน่วยความจำที่กล่าวมาแล้วชนิดใดก็ตามไม่สามารถจะทำงานได้
ดังนั้นถ้าโปรแกรมของผู้ใช้มีขนาดใหญ่กว่าหน่วยความจำที่เหลือ เราแก้ปัญหาโดยใช้หน่วยความจำเสมือน (Virtual Memory)
ใช้ในกรณีแบบหลายโปรแกรม
ขอขอบคุณข้อมูลจาก
www.chantra.sru.ac.th/os.html
ความคิดเห็น
แสดงความคิดเห็น