วันพุธที่ 24 มกราคม พ.ศ. 2561

ใบงาน 4 การจัดการหน่วยความจำ Memory Management


บทที่4
การจัดการหน่วยความจำ
Memory Management
จัดทำโดย 
นาย สราวุฒิ เชื้อกสิกรรม รหัสนักศึกษา 6031280064

หน่วยความจำหลัก 

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

หน้าที่หน่วยความจำหลัก
  - เก็บระบบปฏิบัติการ
  - เก็บโปรแกรมของผู้ใช้
  - เก็บข้อมูลที่จะใช้
 องค์ประกอบหน่วยความจำ
  - แอดเดรส (address)
  - ข้อมูล (data) 
ความต้องการหน่วยความจำ
   - ความเร็วสูง
   - มีความเสถียรสูง
   - ความจุสูง
   - ราคาต่ำ

ชนิดของหน่วยความจำ
หน่วยความจำหลัก
ROM เป็นหน่วยความจำถาวร ไม่สูญเสียข้อมูลแม้ไฟดับ มักใช้เก็บข้อมูลพื้นฐานที่จำเป็น
RAM มักจะใช้เป็นหน่วยความจำหลัก มีอยู่  2 ประเภท คือ static ram และ dynamic ram
หน่วยความจำสำรอง   
มีความเร็วช้า เก็บไว้ได้นาน เช่น ดิสก์ ฮาร์ดดิสก์

การจัดการหน่วยความจำ(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 แบบ
1.การแบ่งหน่วยความจำขนาดคงที่ (Fixed partition multi-programming)
2.การแบ่งหน่วยความจำขนาดไม่คงที่ (Variable partition multi-programming) 

การแบ่งหน่วยความจำขนาดคงที่ 
                     วิธีนี้หน่วยความจำจะถูกแบ่งออกเป็นหลายส่วน แต่ละส่วนมีขนาด  คงที่ และในแต่ละส่วนจะมีเพียงงานเดียว และการแบ่งนั้นจะเปลี่ยนแปลงอีกไม่ได้
ดังนั้นจำนวนงานที่ทำงานได้พร้อมกันจะเท่ากับจำนวนส่วนย่อยของหน่วยความจำหลัก
 การแบ่งหน่วยความจำขนาดคงที่ แบ่งได้เป็น 2 แบบ
   - การแปลงและโหลดด้วยค่าสัมบูรณ์ (Absolute translation and loading) 
   - การแปลงและโหลดด้วยค่าสัมพัทธ์ (Relocatable translation and loading)

การแปลงและโหลดด้วยค่าสัมบูรณ์ (Absolute translation and loading)
                       ค่าแอดเดรสสัมบูรณ์ คือค่าแอดเดรสจริง ๆ ในหน่วยความจำหน่วยความจำหลักจะถูกแบ่งออกเป็นส่วนที่มีขนาดคงที่ และแต่ละส่วนจะมีแอดเดรสที่เป็นขอบเขตบน และล่างอยู่ ดังนั้นเมื่องานต้องการใช้หน่วยความจำหลักในส่วนย่อยใดก็ตาม OS จะต้องกำหนดแอดเดรสจริงให้กับงาน เพื่อให้งานเข้าไปครอบครองหน่วยความจำหลักในส่วนที่ถูกต้องนิยมใช้กับคิวงานที่เป็นแบบ Multiple queues 
                       
                        ข้อเสียของวิธีนี้คือ ถ้างานพร้อมจะรันแล้ว แต่ส่วนของหน่วยความจำหลักที่ต้องการ กำลังถูกใช้โดยงานอื่น ก็ต้องรอจนกว่างานที่ใช้หน่วยความจำที่ต้องการทำงานเสร็จสิ้น ถึงแม้ว่าส่วนอื่น ๆ จะว่างอยู่ก็ตาม ทำให้สูญเสียหน่วยความจำในส่วนอื่นโดยเปล่าประโยชน์
ถ้างานส่วนใหญ่เป็นงานที่มีขนาดเล็ก คิวของส่วนที่มีขนาดเล็กจะเต็มอยู่ตลอดเวลา ในขณะที่คิวของส่วนที่มีขนาดใหญ่ยังคงว่างอยู่ ทำให้งานที่มีขนาดเล็กจะต้องรอในคิว ในขณะที่หน่วยความจำหลักยังเหลืออยู่มาก 

การแปลงและโหลดด้วยค่าสัมพัทธ์ (Relocatable translation and loading)
                         เพื่อแก้ปัญหาที่เกิดขึ้นในการแปลงและโหลดด้วยค่าสัมบูรณ์ จึงทำให้เกิดวิธีการที่เรียกว่าการแปลงและโหลดด้วยค่าสัมพัทธ์
งานจะถูกแปลงให้ได้แอดเดรสเป็นค่าสัมพัทธ์กับจุดเริ่มต้นของงาน จุดเริ่มต้นของงานก็คือแอดเดรส 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)
                 วิธีการนี้ OS จะตรวจหาช่องว่างในหน่วยความจำ เมื่อใดที่พบช่องว่างที่มีขนาดใหญ่พอที่จะวางโปรเซสใหม่ลงไปได้ OS จะเลือกช่องว่างนั้นทันที ทำให้การเลือกช่องว่างทำได้รวดเร็ว  
                 วิธีการนี้ OS จะตรวจหาช่องว่างที่มีอยู่ในหน่วยความจำทั้งหมด แล้วเลือกเอาช่องว่างที่เมื่อวางโปรเซสลงไปแล้วจะเกิดช่องว่างขนาดเล็กที่สุด
                  การเลือกช่องว่างแบบนี้จะตรงกันข้ามกับแบบที่ 2 OS จะเลือกช่องว่างที่เมื่อวางโปรเซสลงไปแล้วจะเกิดช่องว่างขนาดใหญ่ที่สุด 

การรวมโฮล (Coalescing Holes)
           เมื่อมีช่องว่าง 2 ช่องติดกันในหน่วยความจำ OS สามารถที่จะรวมช่องว่างทั้ง 2 นี้เป็นช่องว่างขนาดใหญ่ช่องเดียว ซึ่งเราเรียกว่า การรวมโฮล (Coalescing Holes) 

การบีบอัดหน่วยความจำ (Storage Compaction) 
           ถึงแม้ว่าจะมีการรวมโฮลเกิดขึ้น แต่ช่องว่างที่ไม่อยู่ติดกันก็ยังคงมีกระจายอยู่ในหน่วยความจำ
ซึ่งการมีช่องว่างขนาดเล็ก ๆ หลายช่อง เมื่อนำมารวมกันก็จะทำให้เกิดช่องว่างขนาดใหญ่ซึ่งมากพอสำหรับ 1 โปรเซสได้
OS จะต้องสามารถที่จะทำการบีบอัดหน่วยความจำ โดยย้ายเอาหน่วยความจำที่ถูกครอบครองโดยโปรเซสต่าง ๆ ไปอยู่ชิดติดกันที่ด้านใดด้านหนึ่ง ซึ่งจะทำให้เกิดช่องว่างใหญ่เพียงช่องเดียว จึงทำให้โปรเซสอื่น ๆ สามารถเข้ามาใช้หน่วยความจำที่เหลือได้ 
 ข้อเสียของการบีบอัดหน่วยความจำ
ระบบจะต้องหยุดการทำงานของโปรเซสทุกโปรเซสไว้ชั่วขณะหนึ่งเพื่อที่จะทำการบีบอัด
ซึ่งอาจจะต้องใช้เวลามากทำให้การทำงานของระบบช้าลง โดยเฉพาะกับการทำงานในระบบโต้ตอบ (Interactive) 


อ้างอิง
http://bc.feu.ac.th/pichate/os_c8/chapter8.htm
https://sites.google.com/site/operatingsytemsyvc/bth-thi3-kar-cadkar-hnwy-khwam-ca
http://www.chantra.sru.ac.th/OS.html


ไม่มีความคิดเห็น:

แสดงความคิดเห็น