การจัดการหน่ วยความจาหลัก (Memory Management) เนื ้อหา Background Memory management การแบ่ งส่ วน การสับเปลี่ยนการทางาน การจัดสรรพืน ้ ที่ร่วมกัน การจัดพืน ้ ที่หน้ าเพจ การแบ่ งตอน เนื่องจากโปรแกรมต้ องมีพนื ้ ที่ในหน่ วยความจาเพื่อเก็บ ข้ อมูลในระหว่ างทางาน แถวคอยข้ อมูลเข้ า (Input queue) ของโปรเซส ทัง้ หมดที่อยู่บนดิสก์ ซึ่งรอคอยที่จะเข้ าไปทางานใน หน่ วยความจาหลัก CPU สามารถเข้ าถึงหน่ วยความจาและ register ได้ โดยตรง Memory Management Subdividing memory to accommodate multiple processes Memory needs to be allocated to ensure a reasonable supply of ready processes to consume available processor time Memory Management Requirements Relocation ◦ Programmer does not know where the program will be placed in memory when it is executed ◦ While the program is executing, it may be swapped to disk and returned to main memory at a different location (relocated) ◦ Memory references must be translated in the code to actual physical memory address Addressing Requirements for a Process Memory Management Requirements Protection ◦ Processes should not be able to reference memory locations in another process without permission ◦ Impossible to check absolute addresses at compile time ◦ Must be checked at run time ◦ Memory protection requirement must be satisfied by the processor (hardware) rather than the operating system (software) Operating system cannot anticipate all of the memory references a program will make Memory Management Requirements Sharing ◦ Allow several processes to access the same portion of memory ◦ Better to allow each process access to the same copy of the program rather than have their own separate copy Memory Management Requirements Logical Organization ◦ Programs are written in modules ◦ Modules can be written and compiled independently ◦ Different degrees of protection given to modules (read-only, execute-only) ◦ Share modules among processes Memory Management Requirements Physical Organization ◦ Memory available for a program plus its data may be insufficient Overlaying allows various modules to be assigned the same region of memory ◦ Programmer does not know how much space will be available Hardware Address Protection Compile time ขณะเกิดการคอมไพล์ ◦ หากการจัดสรรพืน้ ที่ของหน่ วยความจาทราบตัง้ แต่ แรกก็จะสามารถสร้ างโค้ ดได้ ◦ ต้ องคอมไพล์ โค้ ด หากพืน้ ที่ในการเริ่มต้ นการทางานเปลี่ยนแปลง Load time ขณะเกิดการโหลด ◦ จะต้ องสร้ างโค้ ดที่สามารถจัดสรรพืน้ ที่หน่ วยความจาขึน้ ใหม่ หากไม่ ทราบถึง การจัดสรรพืน้ ที่หน่ วยความจาในขณะคอมไพล์ Execution time ขณะเกิดการเอ็กซ์ ซีควิ ท์ ◦ การแมพความสัมพันธ์ หรื อเชื่อมโยงต้ องล่ าช้ า จนกว่ าจะเกิดการประมวลผล ◦ หากโปรเซสถูกเคลื่อนย้ ายในระหว่ างกาลังเอ็กซ์ ซีควิ ท์ จากพืน้ ที่หนึ่งใน หน่ วยความจาไปยังพืน้ ที่อ่ ืนๆ จาเป็ นต้ องอาศัยฮาร์ ดแวร์ ในการแมพแอดเดรส ตาแหน่ งที่ว่างทางตรรกะกับตาแหน่ งที่ว่างทางกายภาพ (Logical vs. Physical address space) แนวคิดของพืน้ ที่แอดเดรสเชิงตรรกะ เป็ นการนาพืน้ ที่แอดเดรสเชิง กายภาพหลายพืน้ ที่มารวมกันไว้ ท่ สี ่ วนกลางเพื่อการบริหารจัดการ หน่ วยความจา ◦ Logical address – แอดเดรสเชิงตรรกะ ( แอดเดรสเสมือน ) ถูก สร้ างขึน้ โดยหน่ วยประมวลผลกลาง และถูกอ้ างถึงโดยแอดเดรสเสมือน ◦ Physical address – แอดเดรสเชิงกายภาพ เห็นได้ เฉพาะหน่ วย ย่ อยของหน่ วยความจา แอดเดรสเชิงตรรกะและเชิงกายภาพ คือสิ่งเดียวกันของการแมพ แอดเดรสในขณะคอมไพล์ และขณะโหลด แอดเดรสเชิงตรรกะและแอดเดรสเชิงกายภาพ จะแตกต่ างกันของ การแมพแอดเดรส ในขณะเอ็กซ์ ซีควิ ท์ ตาแหน่ งที่ว่างทางตรรกะกับตาแหน่ งที่ว่างทางกายภาพ (Logical vs. Physical address space) กลุ่มของตาแหน่ งทางตรรกะทัง้ หมดที่ถูกสร้ างโดยโปรแกรมจะถูก เรี ยกว่ า ตาแหน่ งที่ว่างทางตรรกะ (logical address space) กลุ่ ม ของต าแหน่ ง ที่ ว่ า งทางกายภาพที่ เ กี่ ย วข้ อ งกั บ ต าแหน่ ง ทาง ตร ร ก ะ เ ห ล่ า นั ้ น ถู ก เ รี ย ก ว่ า ต า แ ห น่ ง ที่ ว่ า ง ท า ง ก า ย ภ า พ (physical address space) อุปกรณ์ ฮาร์ ดแวร์ ที่ทาการแมพระหว่ างแอดเดรสเสมือนกับ แอดเดรสทางกายภาพ ค่ าที่เก็บอยู่ในรี จีสเตอร์ เพื่อการจัดสรรพืน ้ ที่ใหม่ จะถูกเพิ่มเข้ าสู่ แอดเดรสทุกๆ แอดเดรสที่ถูกสร้ างขึน้ โดยโปรเซสของผู้ใช้ ใน ขณะที่โปรเซสนัน้ ถูกส่ งเข้ าสู่หน่ วยความจา ◦ Base register เรียกเป็ น Relocation register การทางานของโปรแกรมของผู้ใช้ จะใช้ แอดเดรสเชิงตรรกะ จะไม่ ทราบถึงแอดเดรสทางกายภาพจริงๆ ◦ การแมพแอดเดรสจะเกิดขึน้ ต่ อเมื่อเกิดการอ้ างอิงไปที่หน่ วยความจาหลัก จากรู ปรี จีสเตอร์ ฐาน (base register) กลายเป็ น รี จีสเตอร์ สาหรั บการย้ าย ตาแหน่ ง (relocation register) การอ้ างอิงตาแหน่ งในหน่ วยความจาทุกครั ง้ ต้ องนาค่ าอ้ างอิงมาบวกกับค่ ารี จีสเตอร์ ฐานเสียก่ อน เพื่อให้ ได้ ค่าตาแหน่ งจริง ◦ เช่ น ค่ ารี จีสเตอร์ ฐานเท่ ากับ 14000 ผู้ใช้ ต้องการอ่ านค่ าจากตาแหน่ ง 346 ก็จะไปอ่ าน จากตาแหน่ งจริงที่ 14000 + 346 = 14346 เป็ นต้ น จะสังเกตเห็นว่ า ในระบบนีม้ ีการกาหนดตาแหน่ ง 2 แบบ คือ ◦ ตาแหน่ งทางตรรกะ คือ ค่ า 0 ถึง max ◦ ตาแหน่ งจริง (ทางกายภาพ) คือ ค่ าจาก R ถึง R+max โดย R เป็ นค่ าตาแหน่ งเริ่มต้ น โปรแกรมของผู้ใช้ จะใช้ ตาแหน่ งทางตรรกะเท่ านัน้ แนวคิดเรื่ องการใช้ ตาแหน่ งทางตรรกะในการอ้ างอิงแทน ตาแหน่ งจริงนีเ้ ป็ นหัวใจของการจัดการหน่ วยความจาหลัก วิ ธี นี ้ จ ะไม่ น า โปรแกรมย่ อย ลง สู่ ห น่ วยความจ าพร้ อมกั บ โปรแกรมหลัก แต่ จะนาลงเมื่อมีการเรี ยกใช้ เท่ านัน้ โปรแกรมย่ อย ทัง้ หมดจะอยู่ในจานบันทึกในรู ปแบบที่ย้ายตาแหน่ งได้ เมื่ อ โปรแกรมหลั ก ต้ อ งการเรี ย กโปรแกรมย่ อยใด ก็จ ะตรวจดู ว่ า โปรแกรมย่ อยนัน้ อยู่ในหน่ วยความจาแล้ วหรื อยัง ◦ ถ้ ายังก็จะนาโปรแกรมย่ อยนัน้ ลงสู่หน่ วยความจาหลัก ย้ ายตาแหน่ งไปไว้ ในที่ท่ ีเหมาะสม ย้ ายการควบคุมไปไว้ ท่ ีโปรแกรมย่ อยนัน้ เพื่อทางานต่ อไป ประโยชน์ ของวิธีนีค้ ือ โปรแกรมย่ อยที่ไม่ ได้ ใช้ กจ ็ ะไม่ ถูกนาลงสู่ หน่ วยความจาหลักให้ เสียเนือ้ ที่เปล่ า ๆ ขณะเชื่ อ มต่ อ โปรแกรมย่ อ ย จะมี ก ารสร้ างชุ ด ค าสั่ งเรี ย กระบบ (Stub) ซึ่งมีขนาดเล็กมาก เพื่อใช้ เรี ยกโปรแกรมย่ อยที่ต้องการ ขณะทางาน ชุดคาสั่งเรี ยกระบบนี จ้ ะทางานโดยการเปลี่ยนโปรแกรมตัวเองเป็ น ตาแหน่ งของโปรแกรมย่ อยในระบบและเรี ยกโปรแกรมย่ อยนัน้ เมื่อมีการใช้ ชุดคาสั่งเรี ยกระบบนี อ ้ ีกครั ง้ โปรแกรมย่ อ ยของระบบก็ จะถูกเรี ยกทางานโดยตรง (โดยไม่ เสียเวลาทางานในชุดคาสั่ง เรี ยก ระบบนีอ้ ีกต่ อไป) วิธีนีย้ ังประหยัดเนื อ ้ ที่มากอีกด้ วย เพราะโปรแกรมของผู้ ใช้ ต่างใช้ โปรแกรมย่ อยของระบบอันเดียวกัน (ไม่ เกิดการซา้ ซ้ อน) เนื่องจากต้ องมีการนาโปรแกรมทัง้ หมดของกระบวนการหนึ่ง ลงใน หน่ วยความจาก่ อนจะเริ่มทางาน ขนาดของกระบวนการจะถู ก จ ากั ด ด้ ว ยขนาดของหน่ ว ยความจ า หลัก เราจึงต้ องมีการแบ่ งส่ วน (Overlays) กระบวนการ ออกเป็ นส่ วน ๆ เพื่อให้ สามารถทางานในหน่ วยความจาหลักได้ การแบ่ งส่ วนนีท ้ าโดย ◦ แบ่ งส่ วนของโปรแกรมและข้ อมูลที่ต้องการใช้ ในช่ วงเวลาแรกให้ เข้ าทางานในหน่ วยความจาหลัก ◦ นาโปรแกรมช่ วงต่ อไปลงทับโปรแกรมเดิม หลังจากที่โปรแกรม ช่ วงแรกทางานเสร็จแล้ ว ตัวอย่ างเช่ น ตัวแปรภาษา assembly แบบแปล 2 รอบ ◦ รอบแรกจะมีการสร้ างตารางสัญลักษณ์ ◦ รอบที่สองจะมีส่วนการแปลภาษาเครื่ อง เราอาจทาการแบ่ งส่ วน ตัวแปลภาษานีอ้ อกเป็ น 2 ส่ วน ส่ วนของการแปลรอบที่หนึ่ง ส่ วนของการแปลรอบที่สอง สมมติให้ โปรแกรมตัวแปลภาษามีขนาด ดังนี ้ 1. ส่ วนการแปลรอบที่ 1(Pass 1) 70 KB 2. ส่ วนการแปลรอบที่ 2 (Pass 2) 80 KB 3. ตารางสัญลักษณ์ (Symbol table) 20 KB 4. โปรแกรมย่ อยร่ วม (Common routines) 30 KB 200 KB ถ้ าเราต้ องการนาโปรแกรมทัง้ หมดลงสู่หน่ วยความจาหลัก เราต้ อง มีหน่ วยความจาหลักขนาดอย่ างน้ อย 200 K แต่ ถ้าเรามีเพียง 150 K (ที่เหลือจากส่ วนของระบบปฏิบัตก ิ าร) ก็จะทางานไม่ ได้ เราจึงต้ องใช้ วธิ ีแบ่ งส่ วน (overlays) ◦ กาหนดส่ วนแรก (A) ประกอบด้ วย ตารางสั ญลั กษณ์ โปรแกรมย่ อยร่ วม และส่ วนการแปลรอบที่ 1 ◦ ส่ วนที่สอง (B) ประกอบด้ วย ตารางสัญลักษณ์ โปรแกรมย่ อย ร่ วมและส่ วนการแปลรอบที่ 2 กระบวนการที่กาลังทางานต้ องอยู่ในหน่ วยความจาหลักเสมอ แต่ อาจถูกย้ ายไปอยู่ในหน่ วยเก็บโปรแกรมชั่วคราว (Backing Store) ได้ แล้ วนากลับมาใหม่ เพื่อทางานต่ อ ในระบบการทางานแบบหลายโปรแกรมที่ใช้ การจัดตารางการ ทางานแบบวนรอบ(round-robin) ◦ เมื่อส่ วนแบ่ งเวลา (Time Quantum) สิน้ สุด ตัวจัดการ หน่ วยความจาจะย้ ายกระบวนการปั จจุบันออกไปและเอา กระบวนการใหม่ เข้ ามาทางานแทน ขณะเดียวกัน ตัวจัดตารางการทางานของหน่ วยประมวลผลกลาง ก็จะ จัดเวลาให้ กระบวนการใหม่ ได้ ทางานบ้ าง จะเห็นว่ ามีการสับเปลี่ยนกัน ระหว่ าง ◦ กระบวนการเก่ าและกระบวนการใหม่ ◦ จากหน่ วยความจาหลักสู่หน่ วยเก็บโปรแกรมชั่วคราว การสับเปลี่ยนงาน อาจเกิดในระบบที่ใช้ ความสาคัญเป็ นเกณฑ์ ในการ จัดตารางการทางาน (Priority based) ◦ เมื่อมีงานที่มีความสาคัญสูงเข้ ามาในระบบ ตัวจัดการหน่ วยความจา อาจสับเปลี่ยนให้ งานที่มีความสาคัญต่าออกไปพักชั่วคราว ◦ ให้ งานความสาคัญสูงเข้ าทางานจนเสร็จก่ อน จึงสับเปลี่ยนงาน ความสาคัญต่ากลับมาทางานต่ อ เรี ยกวิธีนีว้ ่ า หมุนออกและหมุนเข้ า (roll-out , roll-in) ในการสับเปลี่ยนงาน ต้ องแน่ ใจว่ ากระบวนการไม่ ได้ มีอะไรติดค้ าง อยู่ โดยเฉพาะอย่ างยิ่งการรอคอยอุปกรณ์ รับส่ งข้ อมูล ◦ ถ้ ากระบวนการหนึ่งต้ องรออุปกรณ์ รับส่ งข้ อมูล อาจต้ องการ สับเปลี่ยนกระบวนการนีอ้ อกไป คอยในหน่ วยเก็บโปรแกรม ชั่วคราว ◦ ขณะเดียวกันอุปกรณ์ รับส่ งข้ อมูลอาจต้ องใช้ ท่ พ ี ักข้ อมูลในเนือ้ ที่ ของกระบวนการผู้ใช้ เพื่อรั บส่ งข้ อมูลให้ แก่ ผ้ ูใช้ ◦ ถ้ ากระบวนการเดิมถูกสับเปลี่ยนออกไปและมีกระบวนการใหม่ เข้ ามาแทนที่อุปกรณ์ รับส่ งข้ อมูลอาจส่ งข้ อมูลไปผิดกระบวนการ ได้ ปั ญหานีอ้ าจแก้ ไขได้ 2 วิธีคือ ◦ ห้ ามสับเปลี่ยนงานที่รอคอยการรั บส่ งข้ อมูล ◦ การรั บส่ งข้ อมูลนัน้ ต้ องใช้ ท่ พ ี ักข้ อมูลภายในเนือ้ ที่ของ ระบบปฏิบัตกิ ารเท่ านัน้ และระบบจะส่ งต่ อให้ กระบวนการเมื่อ กระบวนการกาลังทางานอยู่ในหน่ วยความจาหลักเท่ านัน้ โดยปกติหน่ วยความจาหลักจะถูกแบ่ งออกเป็ นสองส่ วนหลัก ◦ พืน้ ที่สาหรั บระบบปฏิบัตกิ าร โดยปกติจะอยู่ในส่ วนพืน้ ที่ ด้ านล่ างของหน่ วยความจาหรื อแอดเดรสเริ่มต้ น โดยการจัดการ ของเวกเตอร์ การขัดจังหวะ ◦ พืน้ ที่โปรเซสของผู้ใช้ อยู่ในส่ วนพืน้ ที่ด้านบนของหน่ วยความจา หรื อแอดเดรสหลังจากระบบปฏิบัตกิ าร Relocation register ใช้ ในการป้องกันโปรเซสของผู้ใช้ จากแหล่ งอื่น และจากการเปลี่ยนแปลงโค้ ดและข้ อมูลของ ระบบปฏิบัตกิ าร Base register จะมีค่าของแอดเดรสทางกายภาพที่เล็กที่สุด Limit register จะมีค่าของช่ วงของแอดเดรสทางตรรกะ ◦ แอดเดรสทางตรรกะแต่ ละค่ าจะต้ องมีค่าน้ อยกว่ าขนาดของ รี จีสเตอร์ Fixed Partitioning Equal-size partitions ◦ Any process whose size is less than or equal to the partition size can be loaded into an available partition ◦ If all partitions are full, the operating system can swap a process out of a partition ◦ A program may not fit in a partition. The programmer must design the program with overlays Fixed Partitioning Main memory use is inefficient. Any program, no matter how small, occupies an entire partition. This is called internal fragmentation. Placement Algorithm with Partitions Equal-size partitions ◦ Because all partitions are of equal size, it does not matter which partition is used Unequal-size partitions ◦ Can assign each process to the smallest partition within which it will fit ◦ Queue for each partition ◦ Processes are assigned in such a way as to minimize wasted memory within a partition Memory Assignment for Fixed Partitioning พืน้ ที่ว่างหมายถึงพืน้ ที่ว่างขนาดต่ างๆของหน่ วยความจาที่พร้ อมใช้ งาน ต่ อเนื่องกันในหน่ วยความจา เมื่อมีโปรเซสเกิดขึน ้ โปรเซสจะได้ รับจัดสรรพืน้ ที่ในหน่ วยความจา จากพืน้ ที่ว่างที่มีขนาดใหญ่ พอสาหรั บโปรเซสนัน้ ระบบปฏิบัตก ิ ารบริหารจัดการสารสนเทศต่ างๆ ดังต่ อไปนี ้ การแบ่ งส่ วนพืน้ ที่เพื่อการจัดสรร การกาหนดส่ วนพืน้ ที่ว่าง ในระบบปฏิบัตกิ ารจะมีตารางที่เก็บข้ อมูลว่ าพืน้ ที่ใน หน่ วยความจาหลักส่ วนใดถูกครอบครองและส่ วนใดยังว่ างอยู่ เริ่ มต้ นพืน ้ ที่ในหน่ วยความจาจะว่ างทัง้ หมด ◦ เมื่อมีกระบวนการเข้ ามาในระบบ ระบบจะจัดการหาพืน้ ที่ท่ ีใหญ่ พอ สาหรั บกระบวนการนัน้ และจัดแบ่ งพืน้ ที่ให้ กระบวนการเพียงเท่ าที่ ต้ องการ ◦ ส่ วนพืน้ ที่ท่ เี หลืออยู่กจ็ ะเก็บไว้ ใช้ ในการจัดสรรครั ง้ ต่ อไป Dynamic Partitioning Partitions are of variable length and number Process is allocated exactly as much memory as required Eventually get holes in the memory. This is called external fragmentation Must use compaction to shift processes so they are contiguous and all free memory is in one block The Effect of Dynamic Partitioning Dynamic Partitioning Placement Algorithm Operating system must decide which free block to allocate to a process Best-fit algorithm ◦ Chooses the block that is closest in size to the request ◦ Worst performer overall ◦ Since smallest block is found for process, the smallest amount of fragmentation is left ◦ Memory compaction must be done more often Dynamic Partitioning Placement Algorithm First-fit algorithm ◦ Scans memory form the beginning and chooses the first available block that is large enough ◦ Fastest ◦ May have many process loaded in the front end of memory that must be searched over when trying to find a free block Dynamic Partitioning Placement Algorithm Next-fit ◦ Scans memory from the location of the last placement ◦ More often allocate a block of memory at the end of memory where the largest block is found ◦ The largest block of memory is broken up into smaller blocks ◦ Compaction is required to obtain a large block at the end of memory ตัวอย่ าง ระบบมีหน่ วยความจาหลักขนาด ◦ มีโปรแกรมของระบบใช้ พนื ้ ที่อยู่ ◦ ส่ วนว่ างที่เหลือสาหรับผู้ใช้ 2560 K 400 K 2160 K สมมติให้ในแถวคอยข้อมูลเข้า (input queue) มีกระบวนการดังรู ป ระบบใช้ วธิ ีจัดตารางการทางานระยะยาวแบบมาก่ อน-ได้ ก่อน ◦ สามารถจัดสรรพืน้ ที่ให้ แก่ กระบวนการ P1 , P2 และ P3 ได้ ทันที ◦ ดังภาพของหน่ วยความจาในรู ป (a) จะเห็นว่ ามีพนื ้ ที่ว่างขนาด 260 K ซึ่งไม่ เพียงพอกกับขนาดของกระบวนการ P4 ที่รอ อยู่ในแถวคอยขาเข้ า ระบบใช้ วธิ ีจัดตารางการทางานแบบวนรอบ(round-robin) โดย ส่ วนแบ่ งเวลามีค่าเท่ ากับ 1 หน่ วยเวลา ◦ ณ เวลาที่ 14 หน่ วยเวลา กระบวนการ P2 จะทางานเสร็จ พืน้ ที่ท่ ี P2 ครอบครองอยู่จะว่ างลง ดังรู ป (b) ◦ กระบวนการ P4 จึงสามารถเข้ ามาทางานได้ ดังรู ป (c) ◦ เมื่อกระบวนการ P1 ทางานเสร็จ ณ เวลาหน่ วยที่ 28 ดังรู ป (d) กระบวนการ P5 ก็สามารถเข้ ามาใช้ พนื ้ ที่ท่ ีว่างลงต่ อไปได้ ดังรู ป (e) ปั ญหาอีกข้ อหนึ่ง จะเห็นได้ ว่า ◦ ถ้ าเรามีพนื ้ ที่ว่างขนาด 18,464 ไบต์ และกระบวนการใหม่ ต้ องการ 18,462 ไบต์ แล้ วเราจัดสรรให้ พอดี 18,462 ไบต์ ก็จะเหลือพืน้ ที่ว่าง 2 ไบต์ การเก็บข้ อมูลพืน้ ที่ว่าง 2 ไบต์ นี ้ ◦ เสียค่ าใช้ จ่ายสูงกว่ าเนือ้ ที่ 2 ไบต์ มาก ดังนัน้ เรามักจัดสรรพืน้ ที่ ว่ างที่เหลือเล็กน้ อยนีใ้ ห้ เป็ นส่ วนหนึ่งของพืน้ ที่ท่ รี ้ องขอไปเลย พืน้ ที่ส่วนนี ้ ก็จะสูญเปล่ าไปเช่ นกัน เราเรียกว่ า การสูญ เปล่ าของพื้นทีย่ ่ อยภายใน (Internal Fragmentation) วิธีการหนึ่งที่สามารถใช้ ในการแก้ ปัญหา การสูญเสียพืน้ ที่ย่อย ภายนอก (External Fragmentation) ได้ คือ การบีบ อัด (Compaction) การบีบอัด คือการสับเปลี่ยน (โยกย้ าย) พืน้ ที่ว่างในระบบให้ มาอยู่ รวมกันเป็ นพืน้ ที่ผืนเดียวต่ อเนื่องกัน จะเห็นว่ าพืน้ ที่ว่างเล็ก ๆ 3 ผืน คือ 100K 300K และ 260K ได้ ถูกย้ ายมารวมให้ เป็ นพืน้ ที่ผืนเดียวที่มีขนาด 660K การบีบอัดหน่ วยความจาของระบบไม่ อาจทาได้ กับทุกระบบ สังเกตจากรู ปข้ างบน ที่มีการเคลื่อนย้ ายกระบวนการ P4 และ P3 กระบวนการทัง้ 2 ต้ องสามารถทางานต่ อได้ เมื่อเข้ ามาอยู่ใน พืน้ ที่ใหม่ โดยตาแหน่ งอ้ างอิงภายในทัง้ หมดจะต้ องถูกปรั บปรุ ง สิ่งที่เราจะต้ องพิจารณาต่ อมาคือ ค่ าใช้ จ่ายที่จะเกิดขึน้ ขัน ้ ตอนวิธีในการบีบอัดหน่ วยความจาหลัก ที่ง่ายที่สุ ด คือ จัดการ เคลื่อนย้ ายกระบวนการทัง้ หมดในระบบให้ ไปอยู่สุดขอบใดขอบ หนึ่ง (ไปทางเดียวกันทัง้ หมด) ของหน่ วยความจาหลัก ซึ่งจะเป็ น ผลให้ เกิดพืน้ ที่ว่างขนาดใหญ่ (เกิดจากพืน้ ที่ว่างย่ อย ๆ รวมกัน) วิธีการบีบอัดหน่ วยความจาดังกล่ าวนีม ้ ีค่าใช้ จ่ายสูง พบว่ าถ้ าเราทาการบีบอั ดหน่ วยความจา ตามขั น้ ตอนวิธีอย่ างง่ าย ดังกล่ าวข้ างต้ น ◦ เราต้ องเคลื่อนย้ ายทัง้ กระบวนการ P3 และ P4 ซึ่งมีขนาด โดยรวมเท่ ากับ 600K (200K + 400K) แต่ ในสถานการณ์ นี ้ เราอาจจะเคลื่อนย้ ายเพียงกระบวนการ P4 ไป ไว้ บนกระบวนการ P3 ◦ เป็ นการย้ ายพืน้ ที่ขนาด 400K หรื ออาจจะเคลื่อนย้ ายกระบวนการ P3 มาไว้ ใต้ กระบวนการ P4 ◦ เป็ นการย้ ายพืน้ ที่ขนาดเพียง 200K หรื อมองกระบวนการที่เข้ ามาใหม่ ว่าขนาดเท่ าไหร่ ◦ พืน้ ที่ว่างไม่ เป็ นผืนเดียวกันแต่ ตอบสนองเร็ว หน่ วยความจาทางกายภาพจะถูกแบ่ งเป็ นส่ วน ๆ แต่ ละส่ วนมี ขนาดเท่ า ๆ กัน เรียกว่ า หน้ า(Frame) หรือ หน้ าจริง หน่ วยความจาทางตรรกะของโปรแกรม ก็จะถูกแบ่ งเป็ นส่ วน ๆ เช่ นกัน โดยมีขนาดเท่ ากับส่ วนของหน่ วยความจาจริง เรี ยกว่ า หน้ า (Page) เมื่อต้ องการให้ กระบวนการหนึ่งทางาน ก็เพียงแต่ นา กระบวนการนัน้ จากที่พักโปรแกรมชั่วคราวบรรจุลงใน frame ของหน่ วยความจา โดยแยกเป็ นหน้ าไม่ ต้อง ต่ อเนื่องกัน ที่พักโปรแกรมชั่วคราวก็จะถูกแบ่ งเป็ นส่ วน ๆ เช่ นกัน ตาแหน่ งทางตรรกะที่กระบวนการใช้ จะถูกแบ่ งเป็ น 2 ส่ วน ◦ หมายเลขหน้ า (Page number): p ใช้ เป็ นตัวชีไ้ ปยังตารางเลขหน้ า (Page table) ◦ ระยะจากขอบหน้ า (Page-offset): d ตารางเลขหน้ าจะมีค่าตาแหน่ งจุดเริ่ มต้ น (Base Address) : f ของหน้ าจริงในหน่ วยความจาหลัก ค่ าจุดเริ่ มต้ นหน้ าจริ งนีร้ วมกับค่ าระยะจากขอบหน้ า (f + d) จะเป็ น ตาแหน่ งจริงในหน่ วยความจาหลัก Paging Hardware เพื่อความเข้ าใจ เราสมมติตัวอย่ างง่ าย ๆ โดยกาหนดให้ ขนาดของ หน้ าเท่ ากับ 4 ไบต์ หน่ วยความจาจริงมีขนาด 32 ไบต์ (รวม 8 หน้ า) สมมติให้ หน่ วยความจาทางตรรกะ (ในมุมมองของกระบวนการผู้ใช้ ) มี 4 หน้ า (16 ไบต์ ) ตาแหน่ ง ทางตรรกะ 0 จะแสดงค่ า หมายเลขหน้ า (Page number) 0 และระยะจากขอบ (Page offset) 0 จากหมายเลขหน้ า 0 เทียบในตารางเลขหน้ า (Page table) จะ เห็นว่ าตรงกับหน้ าจริง (Frame) หมายเลข 5 ดังนัน้ ตาแหน่ งทางตรรกะ 0 แปลงเป็ นตาแหน่ งจริงทางกายภาพ = (5 x 4) + 0 = 20 ◦ ตาแหน่ งทางตรรกะ 3 (หน้ า 0 ระยะห่ าง 3) แปลงเป็ นตาแหน่ ง จริง 23 = (5 x 4) + 3 ในระบบการแบ่ งเป็ นหน้ านี ้ จะไม่ มีการสูญเปล่ าพืน้ ที่ย่อยภายนอก เพราะเนื อ้ ที่ในหน่ วยความจาที่ยังว่ างอยู่ (แม้ จะไม่ ต่อเนื่ องกัน ) สามารถจะจัดให้ กระบวนการที่ต้องการได้ เสมอ แต่ อาจมีการสูญเปล่ าพืน ้ ที่ย่อยภายในได้ เพราะการจัดสรรเนือ้ ที่ จริงจัดให้ ทีละหน้ าเป็ นจานวนเต็ม ถ้ ากระบวนการต้ องการใช้ เนือ้ ที่ ไม่ เป็ นจานวนเต็มหน้ า หน้ าสุดท้ ายย่ อมเหลือเศษ เมื่ อมี กระบวนการใหม่ เข้ ามาในระบบ ตัวจั ดตารางระยะยาวจะดู ท่ ี ขนาดของกระบวนการ (ซึ่งบอกเป็ นจานวนหน้ า) แล้ วดูเนือ้ ที่ว่างใน หน่ วยความจาหลักว่ ามีจานวนหน้ าว่ างพอเพียงหรื อไม่ ถ้ ากระบวนการมีขนาด n หน้ า (Page) ตัวจัดตารางระยะยาวก็ ต้ องจัดเนือ้ ที่ว่างให้ ได้ n หน้ า (Frame) เช่ นกัน ◦ ถ้ ามีเนือ้ ที่พอ ก็จะนาส่ วนของกระบวนการหน้ าแรกลงในเนื อ้ ที่ว่าง ที่ แรก และใส่ หมายเลขหน้ าจริ ง ลงในตารางเลขหน้ าของ กระบวนการนี ้ ◦ จากนัน้ ก็นาหน้ าที่สองลง และใส่ หมายเลขหน้ าจริงลงในตารางเลข หน้ าเช่ นกัน ทาเช่ นนีไ้ ปเรื่ อย ๆ จนครบ n หน้ า Free Frames Before allocation After allocation วิธีพนื ้ ฐาน (Basic Method) การแบ่ งเป็ นตอน (Segmentation) เป็ นการจัดการหน่ วยความจา หลักตามมุมมองของผู้ใช้ หน่ วยความจาทางตรรกะจะถูกแบ่ งเป็ นตอน ๆ แต่ ละตอนจะมีช่ ือและขนาด ตาแหน่ งอ้ างอิง ก็จะมีช่ ือตอนกับระยะห่ างจากขอบ (offset) ชื่อตอนมักใช้ ตัวเลขแทนเรี ยกว่ า เลขตอน (segment-number) โดยปกติตัวแปลภาษา assembly หรื อตัวแปลภาษาชัน ้ สูงอื่น ๆ จะแบ่ ง โปรแกรมเป็ นตอน ๆ โดยอัตโนมัติ ตัวแปลภาษาปาสคาล อาจแบ่ งตอนเป็ น ตอนที่ 1 เก็บตัวแปรร่ วม (Global variables) ตอนที่ 2 เนือ้ ที่สาหรั บการเรี ยกโปรแกรมย่ อย เพื่อใช้ เก็บค่ าตัวแปรต่ าง ๆ และตาแหน่ งในการเรี ยกกลับ ตอนที่ 3 เก็บคาสั่งของโปรแกรมย่ อยต่ าง ๆ ตอนที่ 4 เก็บตัวแปรภายใน (Local variables) สาหรั บโปรแกรมย่ อย ฮาร์ ดแวร์ (Hardware) แม้ ว่าผู้ใช้ สามารถอ้ างอิงส่ วนต่ าง ๆ ของโปรแกรมโดยใช้ ตาแหน่ ง แบบ 2 มิติ แต่ หน่ วยความจาจริ งยังคงเป็ นแบบมิตเิ ดียว คื อเป็ น แถวของคาเรี ยงต่ อกันไป ต้ องมีวิธีการจับคู่ตาแหน่ งทางตรรกะแบบสองมิติ ให้ เป็ นตาแหน่ ง จริงมิตเิ ดียว โดยใช้ ตารางเลขตอน (segment table) ตาแหน่ งทางตรรกะที่กระบวนการใช้ จะถูกแบ่ งเป็ น 2 ส่ วน ◦ หมายเลขตอน (segment number: s) เป็ นตัวชีไ้ ปยังข้ อมูลในตารางเลขตอน ◦ ระยะจากขอบ (offset: d) มีค่าตัง้ แต่ 0 ถึงขอบเขตของตอน ข้ อมูลในตารางเลขตอน ◦ ฐาน (base) ◦ ขอบเขต (limit) ระยะจากขอบรวมกับฐาน (d+base) จะเป็ นตาแหน่ งจริ งใน หน่ วยความจาหลัก ตัวอย่ างมี 5 ตอน แต่ ละตอนเก็บอยู่ในหน่ วยความจาทางกายภาพ ตารางเลขตอนจะมีค่าฐานและขอบเขตของแต่ ละตอน เช่ น ตอนที่ 2 มีค่าฐานหรื อตาแหน่ งเริ่ มต้ นที่ 4300 และค่ าขอบเขต 400 ไบต์ ดังนัน ้ การอ้ างอิงไบต์ ท่ ี 53 ของตอนที่ 2 จะเป็ นค่ าตาแหน่ งจริง ◦ 4300 + 53 = 4353 ตาแหน่ งทางตรรกะของตอนที่ 3 ไบต์ ท่ ี 852 เท่ ากับตาแหน่ งจริ ง ◦ 3200 + 852 = 4052 การอ้ างอิงตาแหน่ งไบต์ ท่ ี 1222 ของตอนที่ 0 จะทาให้ เกิดข้ อผิดพลาด รายงานไปยังระบบปฏิบัตกิ าร ◦ เพราะค่ า 1222 เกินกว่ าค่ าขอบเขต (> 1000 ไบต์ ของตอนที่ 0) ข้ อดีหลักของการแบ่ งเป็ นตอน สามารถผนวกการป้องกั น ไปกั บแต่ ละตอนได้ เพราะแต่ ละตอนคื อส่ วน ต่ าง ๆ ของโปรแกรมที่มีลักษณะต่ าง ๆ กัน ข้ อมูลในตอนเดียวกันมักจะมี การใช้ งานเหมือน ๆ กัน เช่ น ตอนของโปรแกรม ตอนของข้ อมูล เป็ นต้ น ในระบบทั่วไป เราอาจกาหนดตอนของโปรแกรมหรื อคาสั่งให้ เป็ นแบบ อ่ านได้ เท่ านั น้ (read-only) หรื อใช้ งานเท่ านั น้ (executeonly) ใช้ บต ิ ป้องกันควบคู่กับแต่ ละตอนในตารางเลขตอน เพื่อป้องกันการใช้ ผิด ประเภท (เช่ น เขียนลงในตอนที่ใช้ อ่านได้ เท่ านัน้ หรือใช้ ทางานได้ เท่ านัน้ ) ใส่ ข้อมูลประเภท array ไว้ ในตอนเฉพาะ ฮาร์ ดแวร์ ของระบบก็จะ สามารถช่ วยตรวจดูได้ ว่า มีการอ้ างอิงข้ อมูลออกนอกขอบเขต array หรื อไม่ ดังนัน้ ฮาร์ ดแวร์ อาจช่ วยตรวจจับข้ อผิดพลาดเบือ้ งต้ นต่ าง ๆ ใน โปรแกรมได้ ข้ อดีอีกข้ อหนึ่งก็คือ สามารถใช้ ข้อมูลหรื อโปรแกรมร่ วมกัน ได้ ส ะดวก กระบวนการแต่ ล ะตั ว จะมี ต ารางเลขตอนของ ตนเอง (เก็ บ อยู่ ใ นตารางข้ อ มู ล เฉพาะของกระบวนการ) กระบวนการหลายตัวอาจใช้ ตอนร่ วมกันได้ โดยให้ ตัวชี เ้ ลข ตอนชีไ้ ปยังที่เดียวกันในหน่ วยความจาจริง ดังนัน้ ข้ อมูลทุกชนิดที่กาหนดเป็ นตอน สามารถใช้ ร่วมกันได้ โดย ไม่ จากัดจานวนตอนที่จะใช้ ร่วมกัน กระบวนการหลายตั ว จึ ง สามารถใช้ โ ปรแกรมร่ วมกั น ได้ อ ย่ า ง สะดวก เช่ น การใช้ โปรแกรม text editor ในระบบปั นส่ วน (time-sharing) ซึ่งมีผ้ ูใช้ หลายคนกาลังใช้ โปรแกรมนีอ้ ยู่ โปรแกรมนีอ้ าจประกอบด้ วยหลาย ๆ ตอนซึ่งสามารถใช้ ร่วมกั น ได้ โดยผู้ใช้ แต่ ละคนใช้ text editor ร่ วมกัน แต่ มีตอน สาหรั บเก็บข้ อมูลภายในแยกกัน ท าให้ ค วามต้ อ งการเนื อ ้ ที่ ห น่ ว ยความจ าจริ ง โดยรวมลดลงได้ อย่ างมาก การแบ่ งเป็ นตอนมั ก ท าให้ เ กิ ด การสู ญ เปล่ าพื น้ ที่ ย่ อ ย ภายนอก ซึ่งเกิดจากพืน้ ที่ว่างอยู่กระจัดกระจายกัน และ แต่ ละพืน้ ที่มีขนาดเล็กไป สาหรับกระบวนการหนึ่ง ๆ กระบวนการอาจรอจนมีพืน ้ ที่ว่างพอหรื อระบบอาจบีบ อัด หน่ วยความจ าเพื่ อ ให้ เ กิ ด พื น้ ที่ ว่ า งต่ อ เนื่ อ งขนาดใหญ่ พอเพียง