Make your own free website on Tripod.com

 

 

 

 

 

 

      ฟังก์ชันของการจัดการหน่วยความจำหลัก

การจัดการหน่วยความจำ อาจพิจารณาได้ว่าประกอบด้วยฟังก์ชันสามตัวด้วยกัน คือ
1. การแปลงชื่อ (naming function) ซึ่งแปลงชื่อ (name) ที่ผู้ใช้ตั้งขึ้น ให้เป็นชื่อที่เป็นเอกลักษณ์ (unique identifier) ภายในระบบ
2. การแปลงตำแหน่ง (memory function) ซึ่งแปลงชื่อที่เป็นเอกลักษณ์ให้เป็นตำแหน่ง (address) ในหน่วยความจำ
3. การแปลงค่า (contents function) ซึ่งแปลงตำแหน่งของหน่วยความจำให้เป็นค่าหรือข้อมูลที่ต้องการ

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

     ลำดับชั้นของหน่วยความจำ


ในการที่โปรแกรมและข้อมูลจะร่วมกันดำเนินงานใดๆ ได้ โปรแกรมและข้อมูลนั้นต้องอยู่ในหน่วยความจำหลัก (main memory หรือ main storage) ซึ่งเป็นหน่วยความจำที่สามารถเข้าถึงได้โดยตรง โดยหน่วยประมวลผลกลาง และมีความเร็วสูงพอที่จะทำงานเคียงคู่กับหน่วยประมวลผลกลางได้ โดยไม่เกิดความเหลื่อมล้ำในเชิงความเร็วมากนัก หน่วยความจำหลักนี้ในสมัมแรกเริ่มเป็นวงแหวนแม่เหล็ก (magnetic core) และเปลี่ยนเป็นสารกิ่งตัวนำ (semiconductor) เมื่อวิทยาการทางด้านนี้ก้าวหน้าขึ้น แต่อย่างไรก็ตาม หน่วยความจำหลักก็ยังมีราคาแพงอยู่ ทำให้ไม่อาจจัดหามาได้เพียงพอกับความต้องการได้ ดังนั้นจึงมีการผนวกหน่วยความจำหลัก เข้ากับระบบให้เพียงพอที่จะดำเนินโปรแกรมได้ คือสามารถเก็บโปรแกรมและข้อมูลที่จะต้องดำเนิน ส่วนโปรแกรมที่ยังไม่ต้องดำเนิน ก็ไม่จำเป็นต้องอยู่ในหน่วยความจำหลัก สามารถจัดเก็บไว้ในหน่วยความจำอีกประเภทหนึ่งเรียกว่า หน่วยความจำรอง (auxiliary หรือ secondary storage) จนกว่าจำเป็นต้องใช้ จึงจะโยกย้ายเข้าไปไว้ในหน่วยความจำหลัก หน่วยความจำรองนี้ปกติอาศัยสารแม่เหล็กเป็นตัวบันทึกสารสนเทศ (information) ซึ่งในสมัยแรกเริ่มอยู่ในรูปของกระบอกแม่เหล็ก (magnetic drum) และเมื่อวิทยาการพัฒนาขึ้นมา ก็เปลี่ยนไปอยู่ในลักษณะของจานแม่เหล็ก (magnetic disk) หรือบางทีก็เรียกว่าจานบันทึก ซึ่งมีราคาต่อหน่วยข้อมูลถูกกว่าหน่วยความจำหลักมาก แต่ความเร็วในการทำงานก็ลดลงไปด้วย อย่างไรก็ตาม จานแม่เหล็กก็ยังมีราคาสูงอีกอยู่ดี จึงมีการใช้หน่วยความจำรองอีกประเภทที่มีราคาถูกลง และความเร็วต่ำลงไปอีก คือเทปแม่เหล็ก (magnetic tape)


 

 

 

 

 

 

 

 

     ระบบหน่วยความจำจริง

ระบบหน่วยความจำจริง (real memory system) คือการจัดการหน่วยความจำหลัก ซึ่งเกี่ยวข้องกับหน่วยความจำหลักที่เป็นของจริงเท่าที่มีอยู่ในระบบ การที่หน่วยความจำหลักมีขนาดจำกัด เนื่องจากมีราคาสูง จึงทำให้ต้องแบ่งสรรหน่วยความจำหลักให้สัมพันธ์กับงานต่างๆ ซึ่งมักมีขนาดใหญ่เกินกว่าที่จะบรรจุลงในหน่วยความจำหลักได้หมดในคราวเดียว โดยเฉพาะใน ระบบมัลติโปรแกรมมิ่ง ซึ่งต้องการใส่โปรแกรมมากกว่าหนึ่งตัวลงในหน่วยความจำหลักในเวลาเดียวกัน เพื่อพร้อมที่จะเข้าใช้หน่วยประมวลผลกลางได้

     การแปลเชิงสัมบูรณ
ในระบบจัดการหน่วยความจำอย่างง่าย โปรแกรมของผู้ใช้ที่เป็นภาษาระดับสูง (highlevel language) ถูกแปลเป็นภาษาเครื่อง (machine หรือ low-level language) โดยตำแหน่งที่ใช้อ้างอิงในโปรแกรมและข้อมูลเป็นตำแหน่งสัมบูรณ์ (absolute address) ซึ่งหมายถึงตำแหน่งแน่นอน และมีจริงในหน่วยความจำหลัก และตำแหน่งต่างๆ เหล่านี้จะคงอยู่ตลอดการดำเนินของงานนั้น ลักษณะการแปลแบบนี้เรียกว่า การแปลเชิงสัมบูรณ์ (absolute compilation) ซึ่งผู้ใช้หรือตัวแปลภาษาจะทราบแน่นอนแล้วว่า โปรแกรมจะถูกบรรจุอยู่ในส่วนใดของหน่วยความจำหลัก ระบบนี้ใช้กันในสมัยแรกเริ่มที่การส่งงานเป็นแบบมาก่อนได้ก่อน และไม่มีมัลติโปรแกรมมิ่ง ดังนั้นโปรแกรมของผู้ใช้จะมีพื้นที่ในหน่วยความจำหลักที่แน่นอนเหมือนกันทุกโปรแกรม

     การแปลเชิงโยกย้าย

การแปลเชิงโยกย้าย (relocatable compilation) คือการแปลโปรแกรมให้ได้โปรแกรมผล (object program) ที่สามารถถูกโยกย้ายไปอยู่ที่อื่นในหน่วยความจำหลัก ที่แตกต่างไปจากตำแหน่งที่กำหนดไว้ตอนแปล

ชนิดของการโยกย้าย
การโยกย้ายโปรแกรมกระทำได้สองลักษณะคือ แบบสถิตและแบบจลน์

การโยกย้ายแบบสถิต (static relocation) คือการโยกย้ายในลักษณะที่โปรแกรมที่ถูกโยกย้ายไปแล้วนั้นไม่อาจถูกโยกย้ายได้อีก กล่าวคือเมื่อผ่านการโยกย้าย ข้อมูลที่ใช้ในการตัดแปลงการอ้างอิงตำแหน่งของคำสั่งต่างๆ จะถูกตัดทิ้งไป ดังนั้นจะไม่สามารถย้ายโปรแกรมนั้นได้อีก และตำแหน่งต่างๆ ที่ใช้ในโปรแกรมจะกลายเป็นตำแหน่งสัมบูรณ์

การโยกย้ายแบบจลน์ (dynamic relocation) โปรแกรมที่ถูกโยกย้ายได้จะถูกตัวแปลภาษาแปลให้เป็นโปรแกรมผล โดยมีการอ้างอิงตำแหน่งในหน่วยความจำหลักสำหรับแต่ละคำสั่งที่ไม่เป็นตำแหน่งสัมบูรณ์ แต่จะเป็นตำแหน่งสัมพัทธ์ (relative address) เทียบกับตำแหน่งเริ่มต้นของโปรแกรมนั้น

     การทับซ้อน

ในกรณีที่โปรแกรมของงานใดเล็กพอจะบรรจุลงในหน่วยความจำหลักที่มีอยู่ ระบบปฏิบัติการจะบรรจุโปรแกรมนั้นเข้าในหน่วยความจำหลักในคราวเดียว และดำเนินงานนั้นไปจนเสร็จ แต่หากโปรแกรมมีขนาดใหญ่กว่าขนาดของหน่วยความจำหลัก ก็ไม่อาจถูกบรรจุลงในคราวเดียว ในระบบคอมพิวเตอร์ที่ไม่ซับซ้อน โดยปกติจะตัดทอนโปรแกรมออกเป็นส่วนๆ โดยประกอบด้วยส่วนคงตัว (resident segment) ที่จำเป็นต้องอยู่ในหน่วยความจำหลักตลอดการดำเนินและส่วนทับซ้อน (overlay segment) ซึ่งอาจมีหลายส่วน และแต่ละส่วนไม่จำเป็นต้องใช้ตลอดเวลา โดยระบบจะกันหน่วยความจำหลักบริเวณหนึ่งไว้สำหรับการทับซ้อน (overlay area) เมื่อต้องการใช้ส่วนทับซ้อนใด ก็ดึงส่วนนั้นจากหน่วยความจำรอง เข้ามาทับซ้อนลงในบริเวณทับซ้อนที่กำหนดไว้

 

 

 

 

 

 




     การสับเปลี่ยน

ลักษณะการทับซ้อนที่ได้กล่าวมาแล้วในข้างต้น เป็นเพียงแต่การโยกย้ายส่วนทับซ้อนที่ต้องการมาทับลงบนส่วนทับซ้อนเก่าที่ไม่ใช้แล้ว แต่ไม่มีการโยกย้ายส่วนทับซ้อนเก่าออกไปเก็บในหน่วยความจำรอง เหตุที่ทำเช่นนี้ได้เพราะ ส่วนทับซ้อนโดยปกติจะประกอบด้วยคำสั่งล้วนๆ ไม่มีบริเวณของข้อมูลมาเกี่ยวข้อง ดังนั้นสำเนา (copy) ของส่วนทับซ้อนในหน่วยความจำหลักจะไม่เปลี่ยนแปลง คือเหมือนกับที่อยู่ในหน่วยความจำรองตลอดเวลา ดังนั้นเมื่อเลิกใช้ก็สามารถถูกทับโดยส่วนทับซ้อนอื่นได้เลย โปรแกรมในลักษณะนี้จะกันส่วนที่เป็นข้อมูลออกไปเก็บไว้ในส่วนคงตัวที่อยู่ในหน่วยความจำหลักตลอดเวลา แต่ในระบบมัลติโปรแกรมมิ่ง ซึ่งมีการโยกย้ายโปรแกรมของงานต่างๆ เขาออกหน่วยความจำหลักตามสภาวะของกระบวนการ เพื่อให้ใช้หน่วยความจำหลักอย่างมีประสิทธิภาพ ลักษณะการโยกย้ายเป็นแบบที่โปรแกรมของงานใดงานหนึ่งต้องหายไปจากหน่วยความจำหลักทั้งหมด ซึ่งจะใช้วิธีดึงเอาโปรแกรมของงานอื่นมาทับเฉยๆ ไม่ได้ จำต้องทำสำเนาของโปรแกรมที่จะถูกทับเอากลับเข้าไปเก็บไว้ในหน่วยความจำรอง (ตำแหน่งเก่า) เพื่อเป็นการเก็บสภาวะสุดท้ายของกระบวนการที่จะถูกทับ โดยปกติสำเนาที่ถูกนำไปเก็บในหน่วยความจำรอง จะทับลงไปบนสำเนาเดิมของโปรแกรมนั้น ซึ่งจะเห็นได้ว่าในการเปลี่ยนงานที่จะเข้ามายึดครองหน่วยความจำหลัก ต้องโยกย้ายทั้งของเก่าออกไปไว้ในหน่วยความจำรองและของใหม่ที่จะเข้ามาอยู่ในหน่วยความจำหลัก จึงเรียกลักษณะเช่นนี้ว่า การสับเปลี่ยน (swapping)


     การจัดสรรแบบคงตอน

ในระบบมัลติโปรแกรมมิ่ง ซึ่งมีหลายกระบวนการวนเวียนอยู่ในระบบ กระบวนการที่พร้อมจะเข้าใช้หน่วยประมวลผลกลางหรือที่กำลังดำเนินอยู่ ต้องมีโปรแกรมของตนอยู่ในหน่วยความจำหลัก ดังนั้นต้องจัดแบ่งหน่วยความจำหลักออกเป็นตอนๆ สำหรับแต่ละโปรแกรม การจัดสรรตอน (block allocation) มีอยู่สองแบบ การแบ่งแรกเป็นแบบคงตอน (fixed-sized block allocation) คือ แต่ละตอนมีขนาดคงที่ ส่วนขนาดของแต่ละตอนจะเท่ากันหรือไม่นั้น ขึ้นกับความต้องการของแต่ละระบบ เช่น ในระบบสับหลีกแบบแถวต่างระดับ อาจกำหนดไว้แถวละตอน โดยงานนักเรียนใช้ตอนขนาดเล็ก เพราะเป็นงานที่กินที่น้อยเป็นส่วนมาก หากงานนักเรียนใดมีขนาดใหญ่เกินตอน ระบบจะคัดออก และต้องยื่นงานใหม่ให้ไปเข้าแถวที่มีตอนใหญ่พอ ซึ่งหากในระบบไม่มีตอนใดใหญ่พอบรรจุงานนั้นได้ ก็ต้องตัดแบ่งงานโดยใช้การทับซ้อนเข้าช่วย หรือปิดระบบทำงานเฉพาะงานนั้นเพียงงานเดียว โดยใช้ระบบปฏิบัติการสำรองอีกตัวที่มีการจัดสรรตอนให้ใหญ่เป็นพิเศษ นอกเหนือจากขีดจำกัดของขนาดของงานแล้ว ข้อเสียอีกประการหนึ่งของระบบคงตอนคือ การเกิดที่ว่างเหลือทิ้งในตอนหากโปรแกรมเล็กกว่าตอนที่บรรจุอยู่ เพราะแต่ละตอนใส่ได้คราวละโปรแกรมเดียว


      การจัดสรรแบบแปรตอน

การจัดสรรตอนอีกประเภทหนึ่งคือ การจัดสรรแบบแปรตอน (variable sized block allocation) โดยระบบจัดสรรจะสำรวจดูเนื้อที่ในหน่วยความจำหลัก บริเวณที่ใหญ่พอจะบรรจุโปรแกรมนั้นลงไปได้ แล้วกำหนดตอนขึ้นมาให้มีขนาดเท่ากับขนาดของโปรแกรม โดยเริ่มที่ตำแหน่งเริ่มต้นของบริเวณที่ว่างนั้น ซึ่งข้อดีของการจัดสรรแบบนี้คือ สามารถบรรจุโปรแกรมใหญ่ๆ ลงได้ (แต่ไม่เกินเนื้อที่หน่วยความจำหลักทั้งหมดที่มีให้ได้) และโปรแกรมใช้เฉพาะเนื้อที่ที่ต้องการเท่านั้น แต่ข้อเสียของระบบนี้คือ การขาดวิ่นของหน่วยความจำหลัก (storage fragmentation)


      กลวิธีในการเลือกตอนเพื่อบรรจุ

เมื่อดำเนินระบบมัลติโปรแกรมมิ่งไประยะหนึ่ง จะเกิดช่องโหว่ในหน่วยความจำหลักขึ้นจำนวนหนึ่ง เมื่อมีโปรแกรมจะเข้ายึดครองหน่วยความจำหลัก ต้องมีการเลือกช่องที่เหมาะสมเพื่อรับโปรแกรมนั้น วิธีการเลือก (fitting strategy) มีอยู่สามแบบด้วยกันคือ 1. เลือกช่องโหว่แรกที่พบ (first-fit strategy) ลักษณะนี้เสียเวลาน้อยที่สุดในการตัดสินใจ 2. เลือกช่องโหว่ที่เหมาะสมที่สุด (best-fit strategy) คือเลือกช่องโหว่ที่มีขนาดใกล้เคียงกับโปรแกรมมากที่สุด (แต่ช่องโหว่นั้นต้องใหญ่กว่าโปรแกรม) วิธีการนี้ทำให้เหลือช่องโหว่เล็กที่สุด 3. เลือกช่องโหว่ที่ใหญ่ที่สุด (worst-fit strategy) คือบรรจุโปรแกรมลงในช่องโหว่ที่ใหญ่ที่สุด เหตุผลสนับสนุนสำหรับวิธีคือ เมื่อบรรจุโปรแกรมแล้ว จะได้เหลือช่องโหว่ใหญ่ๆ ซึ่งอาจมากพอที่จะบรรจุโปรแกรมอื่นได้อีก การจำลองวิธีการเลือกช่องโหว่ที่ได้ทำกันชี้ว่าแบบแรกอาจดีกว่าแบบที่สอง แต่ทั้งสองแบบดีกว่าแบบที่สาม