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

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

  • หน่วยความจำเสมือน (Virtual Memory)

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

แนวคิดของหน่วยความจำเสมือ
 ผู้เขียนโปรแกรมหรือผู้ใช้จะไม่ถูกจำกัดในเรื่องของขนาดของหน่วยความจำอีกต่อไป
OS จะจัดการให้ผู้ใช้สามารถใช้หน่วยความจำได้มากกว่าหน่วยความจำจริงที่มีอยู่
โปรแกรมทั้งโปรแกรมโดยส่วนใหญ่ไม่ได้ถูกใช้งานพร้อมกันทั้งหมด ซึ่งการทำงานของโปรแกรมจะเริ่มทำงานจากส่วนต้นโปรแกรม แล้วค่อย ๆ เลื่อนลงมาจนกระทั่งถึงท้ายโปรแกรม
ในขณะที่โปรแกรมกำลังทำงานอยู่ที่ส่วนต้นโปรแกรม ที่ปลายโปรแกรมก็ยังไม่ถูกใช้งาน เมื่อโปรแกรมทำงานมาถึงส่วนท้าย ๆ โปรแกรม ส่วนต้น ๆ โปรแกรมก็ไม่ถูกใช้งาน

ดังนั้นในช่วงที่โปรแกรมทำงานอยู่ที่ส่วนต้น ๆ ก็ไม่มีความจำเป็นต้องโหลดเอาส่วนท้าย ๆ โปรแกรมลงไปในหน่วยความจำให้เปลืองเนื้อที่
เมื่อโปรแกรมทำงานมาจนถึงส่วนที่ยังไม่ได้โหลดเข้าไปในหน่วยความจำ OS จะจัดการดึงเอาส่วนนั้นมาจากหน่วยความจำรอง
โดยที่อาจจะโหลดไปทับส่วนต้น ๆ ของโปรแกรมที่อยู่ในหน่วยความจำ หรือโหลดลงไปในส่วนอื่น ๆ ของหน่วยความจำก็ได้
จากหลักการดังกล่าวเราจึงสามารถรันโปรแกรมที่มีขนาดใหญ่กว่าหน่วยความจำที่มีอยู่ได้

การแปลงแอดเดรส (Address Mapping)
เนื่องจากขนาดของโปรแกรมมีขนาดใหญ่กว่าขนาดของหน่วยความจำ ดังนั้นจึงต้องมีการอ้างอิงแอดเดรสระหว่างแอดเดรสของหน่วยความจำจริงกับแอดเดรสของโปรแกรม
แอดเดรสจริง (Real Address หรือ Physical Address) หมายถึงแอดเดรสในหน่วยความจำจริงเท่านั้น
แอดเดรสเสมือน (Virtual Address หรือ Logical Address) หมายถึงแอดเดรสที่โปรแกรมอ้างถึง
ดังนั้นจึงต้องมีกลไกการแปลงแอดเดรสจากแอดเดรสเสมือนให้เป็นแอดเดรสจริง ณ.ตำแหน่งที่โปรแกรมส่วนนั้นถูกวางลงไป ซึ่งเราเรียกว่าการแปลงส่งแอดเดรส (Address Mapping)

เทคนิคการแปลงแอดเดรสมีอยู่หลายวิธี แต่วิธีที่นิยมใช้กันอย่างแพร่หลายคือ dynamic address translation (DAT)
วิธีการที่จะจัดการหน่วยความจำจริงให้สามารถทำงานโปรแกรมที่มีขนาดใหญ่ จะใช้หลักการแบ่งโปรแกรมออกเป็นส่วนย่อย ๆ หลาย ๆ ส่วนเรียกว่าบล็อก (Block)
ขนาดของบล็อกแบ่งออกเป็น 2 แบบคือทุกบล็อกมีขนาดเท่ากัน หรือบล็อกมีขนาดไม่เท่ากัน ดังนั้นระบบหน่วยความจำเสมือนจึงแบ่งได้เป็น 2 แบบ

หน่วยความจำเสมือนระบบหน้า (Paging system)
หน่วยความจำเสมือนระบบเซกเมนต์ (Segment system)

การแปลงส่งแอดเดรส
1.การแปลงส่งแบบตรง (direct mapping)
2.การแปลงส่งแบบสาระ(associative mapping)
3.การแปลงส่งแบบผสมระหว่างสาระและแบบตรง combined associative/direct mapping  

หน่วยความจำเสมือนระบบหน้า (Paging system)
เป็นการจัดแบ่งโปรแกรมออกเป็นบล็อกที่มีขนาดเท่า ๆ กันทุกบล็อก โดยจะเรียกบล็อกแต่ละบล็อกว่าหน้า (Page)
ตัวอย่างการทำงานในระบบหน้า
ระบบมีหน่วยความจำขนาด 100 Kbyte = 100,000 Byte = 105 Byte
ต้องการรันโปรแกรมที่มีขนาด 1000 Kbyte = 1,000,000 Byte = 106 Byte
สมมุติ OS แบ่งโปรแกรมออกเป็นหน้าย่อย โดยที่แต่ละหน้า (Page) มีขนาด 1 Kbyte = 1,000 Byte = 103 Byte
ต้องการรันโปรแกรม 1000 Kbyte ดังนั้นโปรแกรมจะถูกแบ่งออกเป็น 1000 หน้า (1000 Page)

เราสามารถแบ่งแอดเดรสเสมือนออกเป็น 2 ส่วน
ส่วนที่ 1 จะเป็นค่าที่บ่งบอกหมายเลขหน้า
ส่วนที่ 2 จะเป็นค่าที่บ่งบอกค่าแอดเดรสภายในหน้านั้น ๆ ซึ่งมีชื่อเรียกว่าดีสเพลซเมนต์ (Displacement)
ตัวอย่างเช่น แอดเดรสเสมือนที่ 243765 มีความหมายว่าอยู่ในหน้าที่ 243 และมีดีสเพลสเมนต์เป็น 765

การแปลงแอดเดรสในระบบหน้า
OS จะสร้างตารางไว้สำหรับโปรเซส คือ ตารางหน้า (Page table)
สมมุติว่าหน่วยความจำเสมือนมีขนาด 1000 หน้า และหน่วยความจำจริงมีขนาด 100 หน้า
ตารางหน้าก็จะมีขนาด 1000 ช่อง ได้แก่ช่องที่ 000-999
ช่องที่ 000 สำหรับหน้าที่ 000
ช่องที่ 001 สำหรับหน้าที่ 001
ในตารางหน้าจะมี 3 คอลัมภ์

การสับเปลี่ยนหน้า (Page Replacement)
เมื่อเกิดความผิดพร่องของหน้าในระบบหน้า และหน่วยความจำไม่มีหน้าใดว่างอยู่เลย
ก่อนที OS จะโหลดเอาหน้าใหม่เข้ามาในหน่วยความจำนั้น OS  ต้องตัดสินใจก่อนว่าควรจะเลือกหน้าใดเพื่อที่จะวางหน้าใหม่ทับลงไป
สิ่งที่ OS ใช้ในการตัดสินใจเลือกหน้าเรียกว่า การสับเปลี่ยนหน้า Page Replacement หรือยุทธวิธีการแทนที่(replacement strategy) 

การสับเปลี่ยนหน้ามีวิธีการ 5 วิธีดังนี้
การสับเปลี่ยนหน้าแบบสุ่ม (Random) ทุกหน้ามีโอกาสถูกเลือกเท่ากันหมด
การสับเปลี่ยนหน้าแบบมาก่อนออกก่อน (First in First out :FIFO)
การสับเปลี่ยนหน้าแบบหน้าที่ถูกใช้น้อยที่สุดออกก่อน (Not frequently used :NFU)
การสับเปลี่ยนหน้าแบบหน้าใดที่ไม่ถูกใช้นานที่สุดออกก่อน (Least recently used :LRU)
การสับเปลี่ยนหน้าแบบหน้าใดไม่ได้ถูกใช้งานออกก่อน (Not recently used :NUR)

การแปลงแอดเดรสในระบบ Segment
หมายเลขหน้าจากแอดเดรสเสมือนถูกส่งเข้าไปตรวจสอบในตารางที่เรียกว่า ตารางหน้าแบบสาระ(associative page table)พร้อมกันทุกช่อง
จะได้ค่าแอดเดรสเริ่มต้นของหน้าในหน่วยความจำจริงที่เก็บหน้านี้เอาไว้ออกมาทันที
แอดเดรสที่ได้นี้ก็จะนำไปบวกดีสเพลซเมนต์ผลลัพธ์ที่ได้ก็คือแอดเดรสจริงในหน่วยความจำ  

มีลักษณะการทำงานคล้ายกับระบบหน้า (Page System) ต่างกันตรงที่ขนาดของบล็อกไม่จำเป็นต้องเท่ากัน
ตารางเซกเมนต์ (Segment table) จะมีคอลัมน์มากกว่าตารางหน้าอยู่ 1 คอลัมน์ใช้เก็บขนาดของเซกเมนต์นั้นไว้ เพื่อให้ OS ทราบว่าแต่ละเซกเมนต์มีขนาดเท่าใด
การอ่านหรือเขียนข้อมูลจากหน่วยความจำรองและการหาเนื้อที่ในหน่วยความจำจริงจะกระทำตามขนาดของเซกเมนต์ เช่นถ้าเซกเมนต์มีขนาด 5 Kbytes การโหลดจากดิสก์ต้องโหลดข้อมูลขึ้นมา 5 Kbytes ในขณะเดียวกันก็ต้องหาเนื้อที่ว่างในหน่วยความจำที่มีขนาด 5 Kbytes ด้วยเช่นกัน

หน่วยความจำเสมือนระบบผสมหน้าและเซกเมนต์ 
ระบบจะแบ่งหน่วยความจำออกเป็นหน้าที่มีขนาดเท่ากัน
ในโปรแกรมของผู้ใช้ จะถูกแบ่งออกเป็นเซกเมนต์
ภายในเซกเมนต์จะถูกแบ่งออกเป็นหลายๆหน้า
ดังนั้นขนาดของเซกเมนต์จะเป็นจำนวนเท่าของหน้า
แต่ละเซกเมนต์ของโปรแกรมไม่จำเป็นต้องอยู่เรียงกันในหน่วยความจำ
แต่ละหน้าในเซกเมนต์เดียวกันก็ไม่จำเป็นต้องอยู่เรียงติดกันในหน่วยความจำจริง
ยุทธวิธีการเฟตซ์
ยุทธวิธีการเฟตซ์ (Fetch Strategy) หมายถึงการโหลดหน้าหรือเซกเมนต์จากดิสก์เข้าไปในหน่วยความจำ แบ่งออกได้เป็น 2 วิธี คือ
การเฟตซ์แบบต้องการ (demand fetch) OS  จะโหลดเฉพาะหน้าหรือเซกเมนต์ ที่ต้องการใช้เท่านั้นเข้าไปในหน่วยความจำ
การเฟตซ์แบบคาดเดา (anticipate fetch) จะมีการคาดเดาว่าหน้าหรือ เซกเมนต์ไหนจะถูกใช้เป็นหน้าหรือเซกเมนต์ต่อไป และจะโหลดหน้าหรือเซกเมนต์นั้นเข้าไปไว้ในหน่วยความจำล่วงหน้า (ก่อนเกิดการใช้งานจริง)ทำให้โปรแกรมทำงานได้เร็วขึ้น  
ลำดับชั้นของหน่วยความจำ 
ระบบหน่วยความจำเสมือน สามารถทำให้ผู้ใช้ใช้หน่วยความจำขนาดใหญ่กว่าหน่วยความจำจริงได้ ก็เพราะอาศัยการเก็บข้อมูล(หรือโปรแกรม)ไว้ในหน่วยความจำรอง ลักษณะการเคลื่อนย้ายข้อมูลจะมีการส่งไปมาระหว่างหน่วยความจำรอง กับหน่วยความจำหลัก ลักษณะเช่นนี้เรียกว่าหน่วยความจำ 2 ระดับ หมายถึงว่าข้อมูลมีการขนย้ายจากหน่วยความจำประเภทหนึ่งไปยังหน่วยความจำอีกประเภทหนึ่ง 
ลำดับชั้นของหน่วยความจำ 
มีการพัฒนาหน่วยความจำให้เป็นลำดับขั้นมากกว่า 1 หรือ 2 ระดับ
หน่วยความจำแคช(cache memory) จึงได้ถูกพัฒนาขึ้นมาใช้งาน แคชมีความเร็วกว่าหน่วยความจำแรมหลายเท่า แคชจะอยู่ระหว่างซีพียูกับหน่วยความจำหลัก
เมื่อซีพียูต้องการข้อมูล
ซีพียูกำหนดตำแหน่งของข้อมูลที่ต้องการด้วยแอดเดรส ค่าแอดเดรสนี้จะถูกนำไปตรวจสอบในแคชด้วยความเร็วสูง
ถ้าในแคชมีข้อมูลในตำแหน่งที่บ่งโดยแอดเดรสซีพียูก็จะได้รับข้อมูลในแอดเดรสนั้นจากแคชทันที
แต่ถ้าไม่มีข้อมูลนั้นจะถูกส่งมาจากหน่วยความจำหลักมาเก็บลงในแคชก่อนแล้วค่อยส่งไปให้ซีพียู

หลักการ
หาก RAM พอก็ใช้ RAM หากเต็มก็ใช้ Disk
วิเคราะห์
ลองวิเคราะห์เหตุการณ์ดังนี้ ว่าจะเกิดอะไรขึ้น
1. มี RAM มากและเปิดโปรแกรมมาน้อย
2. มี RAM มากและเปิดโปรแกรมมาก
3. มี RAM น้อยและเปิดโปรแกรมมาก

Demand Paging
เป็นวิธีที่นิยมมากที่สุด ทำงานได้ดี (Performance ดี)
หลักการ
แบ่งโปรเซสออกเป็น Page และแบ่งพื้นที่ RAM ออกเป็น Frame ส่วน Harddisk ก็จะแบ่งเป็น Page เช่นกัน

Logical Address
เป็นมุมมองที่โปรเซสมองเห็น Address ของตนเอง จะใช้หลักการของ Paging โดยจะเริ่ม Page แรกที่ Page 0
Page Table 
เก็บข้อมูลว่า Page แต่ละ Page นั้น Valid หรือไม่
Valid = อยู่ใน Physical Memory แล้ว
Invalid = ไม่อยู่ใน Physical Memory

ความคิดเห็น

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

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

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