วันพฤหัสบดีที่ 5 กันยายน พ.ศ. 2556

หน่วยความจำเสมือน

หน่วยความจำเสมือน (Virtual Memory)
เป็นวิธีการที่สามารถให้กระบวนการทำงานได้แม้จะไม่ได้อยู่ในหน่วยความจำหลักทั้งตัวก็ตาม ข้อดีหลักของวิธีนี้ที่เห็นได้ชัด คือ โปรแกรมของผู้ใช้อาจมีขนาดใหญ่กว่าหน่วยความจำจริงก็ได้ วิธีนี้สร้างหน่วยความจำทางตรรกะให้ดูเสมือนเป็นแถวลำดับ (Array) ขนาดใหญ่ โดยแยกภาพที่ผู้ใช้มองเห็นหน่วยความจำออกจากลักษณะจริงของฮาร์ดแวร์ ทำให้ผู้เขียนโปรแกรมสามารถเขียนโปรแกรมได้อย่างอิสระไม่ต้องกังวลถึงขนาดของหน่วยความจำอีกต่อไป การสร้างหน่วยความจำเสมือนไม่ใช่ของง่าย และอาจทำให้ประสิทธิผลของระบบลดลงได้อย่างมาก ถ้าไม่รอบคอบพอ ในบทนี้เราจะวิเคราะห์หน่วยความจำเสมือนในระบบจัดสรรหน้าตามคำร้องขอ (Demand Paging) เพื่อดูความซับซ้อนของระบบและค่าใช้จ่ายที่เกิดขึ้น
การแบ่งปล้อง
เนื่องจากหน่วยความจำเสมือนนี้แยกตัวเป็นเอกเทศจากหน่วยความจำจริง ดังนั้นผู้ออกแบบจะกำหนดรูปลักษณ์ของหน่วยความจำเสมือนอย่างไรก็ได้ ให้เหมาะสมกับการใช้งาน ระบบการแบ่งปล้อง (segmentation) เป็นการจัดการหน่วยความจำหลัก ซึ่งพิจารณาถึงการใช้หน่วยความจำในแง่มุมของผู้ใช้เป็นหลัก
หลักกการของการแบ่งปล้อง
โดยปกติโปรแกรมจะประกอบด้วยหลายๆ หน่วยทางตรรก (logical unit) เช่น โปรแกรมย่อยและข้อมูล ดังนั้นในระบบแบ่งปล้องนี้ เนื้อที่หน่วยความจำเสมือนจะถูกแบ่งออกเป็น ปล้อง (segment) ซึ่งสมนัยกับการแบ่งงานออกเป็นหน่วยทางตรรก โดยแต่ละปล้องจะมีขนาดใหญ่เท่ากับขนาดของหน่วยของงานหน่วยนั้นๆ ที่บรรจุอยู่ ปล้องหนึ่งๆ อาจบรรจุโปรแกรมย่อยหนึ่งของงานหรืออาจบรรจุข้อมูลชุดหนึ่งก็ได้
การอ้างอิงจุดใดๆ ในโปรแกรมหรือข้อมูล สามารถทำได้โดยอ้างถึงชื่อของปล้องที่บรรจุจุดนั้น และตำแหน่งของจุดนั้นเทียบกับจุดเริ่มต้นของปล้อง ด้วยเหตุนี้ปล้องต่างๆ ของโปรแกรมเดียวกัน ไม่จำเป็นต้องอยู่เรียงต่อกันในหน่วยความจำจริง หรือหากปล้องไหนไม่ได้ใช้ก็สามารถเก็บปล้องนั้นไว้ในหน่วยความจำรองได้ เพื่อเปิดทางให้กับปล้องของงานอื่น เข้าไปใช้หน่วยความจำจริงได้
ข้อดีและข้อเสียของระบบปล้อง
ประการแรกคือ ผู้เขียนโปรแกรมไม่ต้องทำการตัดแบ่งโปรแกรมหรือข้อมูลเพื่อทำทับซ้อนเอง เพราะการทับซ้อนในระบบแบ่งปล้องทำโดยระบบปฏิบัติการนอกเหนือจากนั้น การทับซ้อนโดยอัตโนมัตินี้ยังสามารถทำได้ระหว่างโปรแกรมอีกด้วย คือปล้องที่ต้องการจากหน่วยความจำรองของกระบวนการหนึ่งสามารถเข้ามาไล่ที่ปล้องของกระบวนการอื่นที่ไม่ได้ใช้ในขณะนั้นได้ เพราะระบบได้ทำการบันทึกแฟล็กต่างๆ ไว้แล้วว่าปล้องใดอยู่ในหน่วยความจำแบบใด ข้อดีอีกประการหนึ่งคือ การแบ่งปล้องนั้นเป็นไปตามการแบ่งทางตรรกของงาน ดังนั้นปล้องจึงถือได้ว่าเป็นหน่วยของการเชื่อมส่วนต่างๆ ของงานเข้าด้วยกันที่เรียกว่า การเชื่อมโยง (linkging) ดังนั้นการเชื่อมโยงจึงสามารถทำได้โดยง่าย โดยกำหนดโปรแกรมผล เช่น โปรแกรมย่อยสำหรับหาค่า sine ให้เป็นปล้องหนึ่ง เนื่องจากการอ้างอิงตำแหน่งใดๆ ในโปรแกรมผลนี้เป็นการอ้างอิงแบบโยกย้ายได้ทั้งหมด จึงเป็นการง่ายสำหรับโปรแกรมระบบในการเชื่อมหน่วยต่างๆ เหล่านี้เข้าด้วยกัน เพราะเป็นการเชื่อมโยงในหน่วยความจำเสมือน ไม่ต้องใส่ใจกับ ตำแหน่งสัมบูรณ์ในหน่วยความจำจริง เพราะการแปลงให้เป็นตำแหน่งสัมบูรณ์เป็นหน้าที่ของระบบจัดการหน่วยความจำไปแล้ว โดยเหตุที่การอ้างอิงระหว่างปล้องนั้น กระทำในรูปลักษณ์ของหน่วยความจำเสมือน ดังนั้นจึงเป็นการง่ายที่จะใช้โปรแกรมย่อยร่วมกันในระหว่างโปรแกรมต่างๆ เพราะแต่ละโปรแกรมเพียงแต่ทราบถึงปล้องที่โปรแกรมย่อยนั้นอาศัยอยู่ ซึ่งหมายถึงการบรรจุข้อมูลเกี่ยวกับปล้องของโปรแกรมย่อยลงเป็นรายการหนึ่งในตารางปล้องของโปรแกรมนั้นๆ เท่านั้น แน่นอนว่าโปรแกรมย่อยนั้นต้องเป็นโปรแกรมแบบใช้ร่วมได้ (reentrant) และระบบต้องตรวจตราและเปลี่ยนแปลงทุกตารางปล้องที่อ้างอิงโปรแกรมร่วมนี้ เมื่อมีการโยกย้ายโปรแกรมร่วมไปมาในหน่วยความจำหลัก เนื่องจากหน่วยความจำเสมือนที่ผู้เขียนโปรแกรมใช้นั้น ถูกแยกออกเป็นอิสระจากหน่วยความจำหลักที่มีอยู่จริง ดังนั้นผู้ออกแบบระบบสามารถกำหนดหน่วยความจำเสมือนให้ใหญ่เพียงใดก็ได้ ทำให้ผู้เขียนโปรแกรมไม่ต้องคอยกังวลกับขนาดของโปรแกรม ข้อเสียของปล้องที่สำคัญคือการที่ปล้องต่างๆ มีขนาดไม่เท่ากัน และแต่ละปล้องต้องการเนื้อที่ที่ต่อเนื่องกันในหน่วยความจำจริง ทำให้เกิดปัญหาการจัดสรรในลักษณะการจักสรรแบบแปรตอน เช่น ทำให้เกิดสภาพหน่วยความจำหลักขาดวิ่น เป็นต้น
การแบ่งแผ่น
การจัดการหน่วยความจำหลักแบบแบ่งปล้องตามที่ได้กล่าวมาแล้วนั้น เป็นวิธีกำหนดหน่วยความจำมโนทัศน์ ซึ่งต้องอาศัยความต้องการของผู้ใช้ระบบหรือผู้เขียนโปรแกรมเป็นหลัก สำหรับวิธีการจัดการหน่วยความจำหลักที่จะกล่าวถึงนี้ เป็นวิธีการลดความซับซ้อนของการแปลงระหว่างหน่วยความจำมโนทัศน์หรือเสมือนกับหน่วยความจำจริง
หลักการของการแบ่งแผ่น
วิธีการนี้เรียกว่าการแบ่งแผ่น (paging) ซึ่งหน่วยความจำเสมือนจะถูกแบ่งออกเป็นส่วนๆ มีขนาดเท่ากัน เรียกว่า แผ่น (page) ส่วนหน่วยความจำจริงก็ถูกแบ่งออกเป็นส่วนๆ มีขนาดเท่ากับแผ่นเช่นเดียวกัน เรียกว่า ช่องใส่แผ่น (page frame) ดังนั้นโปรแกรมและข้อมูลที่บรรจุอยู่ในหน่วยความจำเสมือนจะถูกแบ่งออกตามการแบ่งเป็นแผ่นๆ ไปด้วย ดังนั้นสารสนเทศแต่ละแผ่นจะบรรจุลงในแต่ละช่องใส่แผ่นได้พอดีและในทำนองเดียวกับระบบแบ่งปล้อง ในรายการของแต่ละแผ่นจะมีแฟล็กบอกว่าแผ่นนั้นอยู่ในหน่วยความจำหลักหรือไม่ หากอยู่ก็ทำการแปลงตำแหน่งดังกล่าวทันที แต่ถ้าไม่ ระบบปฏิบัติการต้องอ่านเอาแผ่นที่ต้องการเข้ามาจากหน่วยความจำรอง ลักษณะการที่แผ่นที่ต้องการไม่อยู่ ในหน่วยความจำหลักนี้เรียกว่า การขาดแผ่น (page fault) ในระบบแบ่งแผ่นจะมีมาตรการสองอย่างที่สำคัญคือ มาตรการในการนำเข้า (fetch policy) ซึ่งโดยปกติใช้แบบการนำเข้าตามต้องการ (demand paging) และมาตรการในการแทนที่ (replacement policy) เพื่อเลือกแผ่นที่จะถูกแทนที่โดยแผ่นที่ถูกนำเข้ามาจากหน่วยความจำรอง
ข้อดีข้อเสียของการแบ่งแผ่น
ข้อดี : บางประการของการแบ่งแผ่นคล้ายคลึงกับการแบ่งปล้อง เช่น การทับซ้อนโดยอัตโนมัติ รวมถึงการแปลงตำแหน่งเสมือนไปเป็นตำแหน่งจริงโดยระบบทำให้เอง และการมีหน่วยความจำเสมือนที่ใหญ่กว่าของจริงได้ นอกเหนือจากนี้ การแบ่งแผ่นยังมีข้อดีอีกประการหนึ่ง คือ การที่แต่ละแผ่นเท่ากันหมด ดังนั้นในทางกายภาพ แผ่นใดจะสวมใส่อยู่ในช่องใส่แผ่นใดก็ได้ ทำให้ลดความซับซ้อนในการบรรจุแผ่นลงในหน่วยความจำหลัก และตัดปัญหาการขาดวิ่นของหน่วยความจำหลัก
ข้อเสีย : ของการแบ่งแผ่นคือ เป็นลักษณะการแบ่งด้วยระบบอัตโนมัติ ซึ่งการแบ่งเช่นนี้ไม่เป็นไปตามตรรกการแบ่งหน่วยของโปรแกรมและข้อมูล ทำให้การเชื่อมโยงส่วนต่างๆ ของงานเดียวกันหรือระหว่างหลายงานซับซ้อนขึ้น
ระบบผนวก
ระบบแบ่งปล้องและแบ่งแผ่นที่ได้กล่าวแล้วนั้น ต่างก็มีข้อดีที่เสรมิสมรรถนะของระบบคอมพิวเตอร์ขึ้นมาก แต่ในแต่ละวิธีการนี้ยังมีข้อเสียอยู่ การกำจัดข้อเสียบางประการสามารถทำได้โดยผนวกวิธีการทั้งสองเข้าด้วยกัน การผนวกนี้กระทำได้ในสองลักษณะคือ การผนวกแบบแบ่งปล้องเป็นแผ่น และการผนวกแบบแบ่งปล้องตารางแผ่น
การผนวกแบบแบ่งเปล้องเป็นแผ่น
วิธีการผนวกระบบปล้องและแผ่นเข้าด้วยกัน แบบนี้เรียกว่า การผนวกแบบแบ่งปล้องเป็นแผ่น (paged segmentation) วิธีการนี้พยายามแก้ไขลักษณะสองประการที่ไม่ดีของปล้อง ประการแรกคือการที่ปล้องมีขนาดไม่เท่ากัน ทำให้ลำบากต่อการบรรจุโปรแกรมลงในหน่วยความจำหลัก ประการที่สองคือการที่โปรแกรมอาจใหญ่หรือรหัสส่วนมากในโปรแกรมไม่ค่อยได้ใช้ จึงไม่จำเป็นต้องนำเข้ามาหมดทั้งปล้อง แต่จะนำเฉพาะส่วนของปล้องที่ต้องการใช้เข้ามาเท่านั้น ด้วยเหตุนี้จึงใช้วิธีการแบ่งแผ่นมาแบ่งปล้องออกเป็นแผ่นมีขนาดเท่าๆ กัน ทำให้แก้ปัญหาทั้งสองที่เกิดขึ้นกับระบบปล้องนี้ได้
การผนวกแบบแบ่งปล้องตารางแผ่น ในระบบแบ่งแผ่นที่มีขนาดของหน่วยความจำเสมือนใหญ่มากๆ ขนาดของตารางแผ่นก็ใหญ่ตามไปด้วย เนื่องจากหน่วยความจำเสมือนที่มีขนาดใหญ่มากๆ โดยปกติถูกใช้เพียงส่วนน้อยเท่านั้น เนื้อที่ส่วนใหญ่จึงว่าง ดังนั้นรายการสำหรับแผ่นของบริเวณที่ว่างจะไม่มีความจำเป็น จึงสามารถตัดแบ่งตารางแผ่นออกเป็นส่วนหรือเป็นปล้อง โดยเก็บเฉพาะปล้องที่บรรจุรายการแผ่นที่ไม่ว่างเท่านั้น ลักษณะนี้เรียกว่าการผนวกแบบแบ่งปล้องตารางแผ่น (segmented paging)
การใช้สารสนเทศร่วมกัน
ในระบบสารสนเทศโดยทั่วไปแล้ว การใช้โปรแกรมหรือข้อมูลร่วมกันจะช่วยลดความซ้ำซ้อนและความลักลั่นระหว่างงานของผู้ใช้ต่างๆ กันได้ สำหรับในระบบมัลติโปรแกรมมิ่งแล้ว การใช้สารสนเทศร่วมกันยังหมายถึงการประหยัดเนื้อที่ในหน่วยความจำด้วย เช่น หากมีสามกระบวนการต้องการแปลโปรแกรมด้วยตัวแปลภาษาฟอร์แทรนในเวลาเดียวกัน หากไม่มีการใช้โปรแกรมร่วมกัน กระบวนการทั้งสามก็ต้องมีสำเนาของตัวแปลภาษาฟอร์แทรนไว้กระบวนการละชุด ทำให้สิ้นเปลืองกว่ามีตัวแปลภาษาฟอร์แทรนปรากฏอยู่ในระบบให้ดำเนินได้เพียงชุดเดียว แต่ทั้งนี้ในระบบหน่วยความจำเสมือน นอกจากว่าโปรแกรมที่ใช้ร่วมกันจะต้องเป็นแบบใช้ร่วมกันได้ (reentrant) แล้ว ยังมีปัญหาว่า แต่ละกระบวนการมีตารางสำหรับแปลงตำแหน่งเสมือนที่เป็นเอกเทศแยกจากตารางการแปลงของกระบวนการอื่น ดังนั้นจึงต้องมีหลักปฏิบัติเพื่อให้ การอ้างอิงในหน่วยความจำเสมือนของหลายกระบวนการสมนัยกับตำแหน่งจริงของสารสนเทศที่ใช้ร่วมกันนั้น

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

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