สรุปวิชา OS : การจัดการหน่วยความจำ (Memory Management) [1/2]

ChaV
5 min readNov 16, 2021

--

เป็นวิชาเรียนเทอมล่าสุด คือ ปี 3 เทอม 1 ก็สนุกดี TT ทำไว้แล้วก็เอามาลงใน Medium บ้างดีกว่า (กระซิบว่าเหตุผลจริง ๆ คือ เขียนเรื่องอื่นไม่ทัน) เนื่องจากเป็นสรุป(?)ที่ทำแบบ bullet เลยอาจไม่ได้ใช้คำอธิบายที่ดีมาก แต่ก็สามารถอ่านเพื่อสอบได้? คิดว่านะ5555

✒️ พื้นที่หน่วยความจำของโพรเซส

💩 Address binding

❦ Absolute binding

  • ตัวแปร x อยู่ที่ตำแหน่งแอดเดรส 1424 ของโปรแกรม
  • ถูกโหลดเข้าสู่ memory ซึ่งมีตำแหน่งเริ่มต้น 1024
  • ตัวแปรภาษากำหนดแอดเดรส 2224 ให้กับตัวแปร x ขณะ compile ได้ทันที
  • ตัวแปรภาษากำหนดแอดเดรส 2224 ให้กับตัวแปร x ขณะ compile ได้ทันที

❦ Relative binding

  • ตัวแปร x อยู่ตำแหน่งที่ 400 ของโปรแกรม
  • ถูกโหลดเข้าสู่ memory ซึ่งไม่รู้แอดเดรสเริ่มต้น ให้เป็น x
  • ตัวแปร x จะมีแอดเดรสเป็น x+400

💩 Link

❦ Static linking

  • หมายถึงการรวมโมดูลทั้งหมดเข้าไปเป็นส่วนของไบนารีอิมเมจโปรแกรม (Binary program image)
  • คือส่วนของโปรแกรมทั้งหมดจะถูกบรรจุในไฟล์ซึ่งสามารถประมวลผลได้เป็นไฟล์ใหญ่ ไฟล์เดียว

❦ Dynamic linking

  • จะชะลอการลิงค์ไปยังโมดูลออกไปจนถึงเวลาที่โค้ดกําลังประมวลผล โดยการใส่โค้ดเล็ก ๆ เรียกว่า Stub
  • Stub คือส่วนของโปรแกรมขนาดเล็กๆที่ชี้ไปยังเนื้อที่ใน memory ที่เก็บโมดูลที่ต้องการ หรือเป็นโปรแกรมขนาดเล็กที่มีวิธีการโหลดโมดูล
  • ถ้ามีโมดูลอยู่แล้วก็ไม่ต้องโหลด ถ้าไม่มีจะดูวิธีโหลดจาก Stub
  • ต้องใช้ os ตรวจสอบว่ามีโมดูลไหนที่ถูกโหลดเข้ามาแล้วบ้าง เพราะพื้นที่ memory ของโพรเซสต่าง ๆ จะถูกป้องกัน ทำให้โพรเซสไม่สามารถเข้าถึงพื้นที่ memory ของโพรเซสอื่นได้

💩 Dynamic loading

  • ระบบจะไม่โหลดรูทีนบางตัวของโปรแกรมจนกว่ารูทีนดังกล่าวจะถูกเรียกใช้
  • ทําให้ระบบสามารถประหยัดเนื้อที่หน่วยความจําได้
  • ไม่ต้องใช้ os ช่วย แต่ os อำนวยความสะดวกด้วยการสร้าง Library เพื่อให้เรียกใช้ง่าย

✒️ Logical address & Physical address

💩 Logical address

  • เป็นแอดเดรสที่อ้างอิงโดยซีพียู มีอีกชื่อคือ Virtual addresss

💩 Physical address

  • แอดเดรสของ memory ที่บรรจุข้อมูลอยู่จริง

ถ้า address binding เกิดในช่วง compile แอดเดรสทั้งสองจะเหมือนกัน

💩 หน่วยจัดการหน่วยความจำ (Memory management unit, MMU)

  • คืออุปกรณ์ฮาร์ดแวร์ที่แปลง Logical address เป็น Physical address

❦ การหา physical address ใน memory

  • แอดเดรสในโค้ดเป็นการอ้างอิงจากจุดเริ่มต้นของโค้ด
  • โค้ดถูกโหลดเข้าสู่ memory เริ่มที่ตำแหน่ง 14000
  • จะได้แอดเดรสจริงของ 346 คือ 14346

💩 แนวคิดพื้นฐานของการจัดการ memory

❦ Base : เก็บ Physical address ที่โพรเซสถูกโหลดเข้ามาใน memor

❦ Limit : เก็บค่าขนาด memory หรือพื้นที่ที่โพรเซสนั้นสามารถใช้งานได้

❦ ตัวอย่าง

  • โพรเซสมีค่า Base เป็น 300040 และค่า Limit เป็น 120900
  • ดังนั้นโพรเซสจะสามารถใช้พื้นที่ใน memory ได้ตั้งแต่แอดเดรส 300040 ถึง 420940 (300040+120900)

❦ os ต้องตรวจสอบการร้องขอเข้าพื้นที่ใน memory ของโพรเซส เพื่อไม่ให้โพรเซสเข้าถึงพื้นที่ memory ที่ไม่ใช่ของตัวเอง

  • นําแอดเดรสที่โพรเซสต้องการเข้าถึงไปเปรียบเทียบกับ Base & Limit
  • ถ้าอยู่ โพรเซสสามารถเข้าถึงพื้นที่ที่ร้องขอได้
  • ถ้าไม่อยู่ โพรเซสจะไม่ได้รับการอนุญาตและเกิด Trap หรือข้อผิดพลาดขึ้น

✒️ ความต้องการการบริหารจัดการหน่วยความจำ

💩 Relocation

❦ มีความจำเป็นบนระบบ multiprogramming

  • เนื่องจาก memory ต้องใช้งานร่วมกันระหว่างหลายโพรเซส
  • และโพรเซสต่าง ๆ ไม่รู้ว่าโพรเซสไหนจะประมวลผลอยู่บ้าง

❦ os ต้องนำ process เข้าออก memory ระหว่างการประมวลผล

  • เพื่อให้ memory ทำงานได้อย่างมีประสิทธิภาพ
  • จึงมีการ swap ข้อมูลบางส่วนหรือทั้งหมดของโพรเซส ออกจาก memory มาเก็บในพื้นที่ที่กำหนดไว้ เรียกว่า Backing store
  • จากนั้นนำข้อมูลดังกล่าวกลับเข้าไปยัง memory เพื่อประมวลผลต่อไป

💩 Protection

  • เนื่องจากมีการใช้งานทรัพยากรร่วมกันของโพรเซส
  • โพรเซสจึงไม่ควรเข้าไปยัง memory อื่นที่ไม่ใช่ของตนเอง
  • แต่ Relocation ทำให้ Protection ยาก เพราะโพรเซสสามารถถูกโหลดไปอยู่บริเวณไหนก็ได้ใน memory
  • ต้องมีความยืดหยุ่น เพราะ Sharing ยังมีความจำเป็นกับระบบแบบ multprogramming

💩 Sharing

  • มีความจำเป็นสำหรับระบบ multiprogramming เพื่อให้โพรเซสอื่นสามารถใช้โมดูลร่วมกันได้

💩 Logical organization

❦ เกิดจากความแตกต่างของการมองพื้นที่ main memory

  • ระบบจริงมอง memory ติดกันแบบ linear
  • โปรแกรมเมอร์สร้างโปรแกรมเป็นโมดูล บางส่วนเป็นโค้ดที่ไม่มีการเปลี่ยนแปลง เช่น การอ่านอย่างเดียว หรือ การประมวลผล บางส่วนเป็นโค้ดที่ถูกเปลี่ยนแปลงได้

💩 Physical orgaization

✒️ การพาร์ทิชันหน่วยความจํา

💩 Fixed Partition

  • จะแบ่งพื้นที่ memory ออกเป็นพื้นที่ที่มีขนาดเท่ากัน (Equal-size partition) หรือไม่เท่า(Unequal-size partition)ก็ได้
  • โพรเซสจะถูกโหลดไปยังพื้นที่ memory ที่มีขนาดใหญ่พอที่จะบรรจุโค้ดและข้อมูบของโพรเซสได้
  • ข้อดี : จัดการง่าย
  • ข้อเสีย : เกิดปัญหา internal fragmentation คือมีพื้นที่ memory ที่แจกจ่ายให้กับโพรเซสแล้วไม่ได้ถูกใช้งานและไม่สามารถนำไปแจกจ่ายให้โพรเซสอื่นได้

💩 Dynamic partitioning

  • มีขึ้นเพื่อแก้ปัญหา Internal fragmentation
  • แบ่งพื้นที่ memory ตามขนาดที่โพรเซสต้องการ
  • เกิดปัญหา External fragmentation คือมีพื้นที่ memory ที่ว่างไม่ได้แจกจ่ายให้ใคร แต่ไม่สามารถแจกจ่ายให้กับโพรเซสที่ต้องการได้ เพราะพื้นที่ memory ไม่ได้อยู่ติดกัน

❦ อธิบายรูป 5.6

  • (ก) ใน memory มีโพรเซส 1, 3 ทำงานอยู่
  • (ข) มีโพรเซส 4 เข้ามา
  • (ค) โพรเซส 1 ทำงานเสร็จ คืนพื้นที่ memory แล้วออกจากระบบไป
  • (ง) โพรเซส 2 เข้ามาในระบบ
  • เหลือพื้นที่ใน memory อยู่ (6M + 6M + 4M) ถ้ามีโพรเซสที่ต้องการพื้นที่มากกว่า 6M ระบบจะไม่สามารถแจกจ่ายพื้นที่ให้กับโพรเซสนั้นได้ แม้มีพื้นที่ว่างรวม (16M)

💩 Compaction

  • เป็นแนวคิดในการแก้ปัญหา external fragmentation โดยย้ายพื้นที่ว่างของ memory มารวมกันเป็นก้อนเดียวเพื่อให้ได้พื้นที่ขนาดใหญ่ สามารถแจกจ่ายให้กับโพรเซสได้

✒️ Paging

💩 แนวคิด

❦ เป็นแนวคิดที่อนุญาตให้ memory ที่โพรเซสใช้ไม่จำเป็นต้องอยู่ติดกัน

❦ แบ่ง memory ออกเป็น frame เท่า ๆ กันซึ่งมีขนาด 512–8,192 byte

❦ แบ่ง logical address เป็น page เท่า ๆ กัน มีขนาดเท่ากับ frame

❦ os ต้องเก็บข้อมูลของ frame ที่ไม่ได้ใช้งานไว้

❦ เมื่อระบบต้อง execute โปรแกรมขนาด n page

  • ระบบต้องหาพื้นที่ว่างของ memory ขนาด n frame แล้วโหลดโปรแกรมขนาด n page นั้นเข้าไปยัง frame ที่ว่างนั้น
  • เพื่อให้ระบบรู้ว่าโปรแกรมนั้นอยู่ที่บริเวณไหนใน memory (page ใดของโปรแกรมอยู่ที่ frame ใดใน memory)
  • เก็บข้อมูลเหล่านี้ไว้ใน page table

❦ ข้อดี : ลดปัญหา External fragmentation

❦ ข้อเสีย : ขนาดของโค้ดใน page สุดท้ายของแต่ละโปรแกรมอาจจะไม่ได้ใช้พื้นที่ทั้งหมดของ frame ดังกล่าว ส่งผลให้การใช้ paging เกิดปัญหา Internal fragmentation(เฉพาะ frame สุดท้าย)

💩 อธิบายรูป 5.7 การอ้างอิง memory โดยใช้ paging

❦ logical address ถูกแบ่งออกเป็น 2 ส่วนคือ page number (p) และ page offset (d)

  • page number (p) : ใช้เป็นตัวชี้ (index) หาหมายเลข frame (f) ใน page table (หาเฟรม)
  • page offset (d) : เป็นตัวระบุว่าแอดเดรสดังกล่าวอยู่ตําแหน่งใดในเฟรมนั้น (หาแอดเดรสในเฟรม)

❦ หาเสร็จได้ Physical address

❦ วิธีการคำนวณจำนวนบิตของ page number & page offset

  • ขึ้นกับขนาดของ page & main memory
  • ถ้า main memory มีขนาด 2^m ต้องใช้ m bit ในการอ้างอิงแอดเดรสแต่ละคำแหน่งใน main memory
  • ถ้าแต่ละ page/frame มีขนาด 2^n ต้องใช้ n bit ในการอ้างอิงแอดเดรสแต่ละตำแหน่งใน page/frame
  • เลยมี page offset (d) n bit
  • มีจำนวนเฟรม 2^m/2^n frame
  • มี page number m-n bit

💩 อธิบายรูป 5.8 ตัวอย่างข้อมูลที่ใช้ paging

  • page ต่าง ๆ ของโปรแกรมไม่จำเป็นต้องอยู่ติดกันใน memory
  • page table เก็บข้อมูลว่า page ใด อยู่ที่ frame ใด

💩 อธิบายรูป 5.9 การแจกจ่าย frame ให้กับ process ใหม่

  • (ก) มี frame ว่าง คือ 14, 13, 18, 20 และ 15 ตามลำดับ
  • โปรแกรมที่จะถูกโหลดเข้าสู่ memory ต้องการพื้นที่ memory 4 page/frame
  • (ข) os ทำการโหลดข้อมูลแต่ละ page ของโปรแกรมเข้าสู่ frame ที่ว่างอยู่
  • page table ของ process ใหม่ เก็บข้อมูลของแต่ละ page ใน main memory
  • frame ว่างลดลงเหลือแค่ 15

💩 page table

❦ เดิม page table ถูกเก็บใน main memory

❦ page-table base register (PTBR)

  • เก็บแอดเดรสเริ่มต้นของ page table ใน main memory

❦ page-table length register (PRLR)

  • เก็บขนาดของ page table ดังกล้าว

❦ ต้องเข้าถึง memory 2 ครั้ง ทำให้ระบบทำงานช้า

  • ครั้งแรก หา Physical address จาก page table
  • ครั้งสอง เข้าถึง Physical address ใน memory ที่ต้องการอ่านข้อมูลหรือคำสั่งที่ต้องการ

💩 อธิบายรูป 5.10 TLB ใน paging

❦ hardware พิเศษชื่อว่า translation look-aside buffers (TLBs) ช่วยแก้ปัญหาการที่ใช้ paging แล้วเข้า memory ถึง 2 ครั้ง ทำให้ระบบทำงานช้า

❦ TLBs คือ associative cache ที่ทำงานอย่างรวดเร็ว สามารถค้นหาข้อมูลแบบขนานได้ มีราคาสูง เลยมีขนาดเล็ก

  • แต่ละช่องของ TLB จะเก็บ page number และ frame number
  • เมื่อมีการร้องขอแอดเดรส ระบบจะนำ page number มาให้ใน TLB
  • ถ้าเจอ เรียกว่า TLB hit และได้ frame number ไปใช้
  • ถ้าไม่เจอ เรียกว่า TLB miss ต้องไปหา frame number ใน page table ที่อยู่ใน main memory
    page number & frame number จะถูกเพิ่มเข้าไปใน TLB ด้วย
  • ระบบมักใช้ TLB ควบคู่กับ page table

💩 การวัดประสิทธิภาพของระบบที่ใช้งาน TLBs

EAT = (TLBh * HitR) + (TLBm * (1-HitR))
  • EAT : ประสิทธิผลเวลาเข้าถึง (Effective Access Time)
  • TLBh : เวลาที่ใช้ในการเข้าถึงข้อมูลใน memory เมื่อเกิด TLB hit
  • TLBm : เวลาที่ใช้ในการเข้าถึงข้อมูลใน memory เมื่อเกิด TLBm ซึ่งรวมตั้งแต่เวลาที่เข้าถึง TLB ครั้งแรกที่ทําให้ทราบว่าเกิด TLB miss และเวลาเข้า memory เพื่อไปค้นหา frame number ใน page table และเวลาที่เข้าไปเอาข้อมูล memory
  • HitR : Hit ratio เปอร์เซ็นต์ที่ค้นพบ page ที่ต้องการใน TLB

💩 replacement policy

❦ เป็นวิธีที่ os ต้องเลือกช่องที่ต้องการเอาข้อมูลใหม่ทับข้อมูลเก่า เมื่อระบบต้องการใส่ข้อมูลใน TLB แต่ไม่มีพื้นที่ว่าง เช่น

  • การแทนที่แบบสุ่ม (Random)
  • ถ้าข้อมูลของ kernel os จะให้อยู่ใน TLB ตลอด ไม่ให้มีการเขียนทับ

💩 ข้อดีของ paging

❦ การที่โมดูลหรือโค้ดบางส่วนสามารถใช้งานร่วมกันหลายโพรเซสได้ เช่น

  • โค้ดที่ไม่มีการเปลี่ยนแปลงตัวเองขณะ execute หรือ Reetrant code → ตัวแปรภาษา, text editor

❦ อธิบายรูป 5.11 การใช้งานเพจร่วมกัน

  • โปรแกรม ed1,2,3 เป็นโปรแกรม retrant code ถูกใช้งานโดยโพรเซส P1, P2, P3
  • ซึ่งระบบไม่จำเป็นต้องโหลดโปรแกรมทั้งสามเข้าสู่ memory ตามจำนวนโพรเซสที่เรียกใช้

เอาไว้เท่านี้ก่อนค่ะ เดี่ยวจะยาวเกินไป หัวข้อต่อไปจะเป็นเรื่องของการจัดการโครงสร้างตารางเพจ, segmentation, Virtual memory และ Page Replacement เจอกันค่ะ ^^

--

--

ChaV
ChaV

Written by ChaV

Christmas Weerachitoragarn | PSU | Enginearing |

No responses yet