กำหนดหมายเลขหน้าและขนาดหน้า ภารกิจคือการค้นหาจำนวนการเข้าชมและพลาดเหมือนกับเมื่อเราจัดสรรบล็อกหน่วยความจำไปยังหน้าโดยใช้อัลกอริธึมการเปลี่ยนหน้าที่เหมาะสมที่สุด
อัลกอริธึมการเปลี่ยนหน้าที่เหมาะสมที่สุดคืออะไร
อัลกอริธึมการแทนที่หน้าที่เหมาะสมที่สุดคืออัลกอริธึมการแทนที่หน้า อัลกอริธึมการแทนที่หน้าเป็นอัลกอริธึมที่ตัดสินใจว่าจะแทนที่หน้าหน่วยความจำใด ในการแทนที่หน้าที่เหมาะสมที่สุด เราจะแทนที่หน้าที่ไม่ได้อ้างถึงในอนาคตอันใกล้นี้ แม้ว่าจะใช้งานจริงไม่ได้ แต่ก็เป็นหน้าที่เหมาะสมที่สุดและมีข้อผิดพลาดน้อยที่สุด และเหมาะสมที่สุด
มาทำความเข้าใจโดยใช้ตัวอย่างและอธิบายเป็นแผนภาพ
ที่นี่หลังจากจัดสรร 1, 2 และ 3 ตอนนี้หน่วยความจำเต็มแล้วดังนั้นสำหรับการแทรก 4 เราจะมองหาหน้าที่ไม่ได้อ้างอิงอีกในอนาคตอันใกล้จาก 1, 2 และ 3 ดังนั้นหน้า 3 จะไม่อยู่ในอนาคตอันใกล้ดังนั้นเราจึงแทนที่ หน้าที่มีหน้าใหม่ 4 เป็นต้น เราจะทำขั้นตอนซ้ำจนกว่าจะถึงจุดสิ้นสุด
ตัวอย่าง
Input: page[] = { 1, 7, 8, 3, 0, 2, 0, 3, 5, 4, 0, 6, 1 } fn=3 Output: Hits = 3 Misses = 10 Input: page[] = { 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2 } fn = 4 Output: Hits = 7 Misses= 6
แนวทางที่เราใช้เพื่อแก้ปัญหาข้างต้น -
- รับอินพุตของเพจเป็นอาร์เรย์
- มองหาหน้าที่จัดสรรไว้ในอนาคตอันใกล้ หากไม่มี ให้แทนที่หน้านั้นในหน่วยความจำด้วยหน้าใหม่
- หากหน้าแสดงการเพิ่มขึ้นแล้ว มิฉะนั้น การเพิ่มจะพลาด
- ทำซ้ำจนกว่าจะถึงองค์ประกอบสุดท้ายของอาร์เรย์
- พิมพ์จำนวนการตีและพลาด
อัลกอริทึม
Start Step 1-> In function int predict(int page[], vector<int>& fr, int pn, int index) Declare and initialize res = -1, farthest = index Loop For i = 0 and i < fr.size() and i++ Loop For j = index and j < pn and j++ If fr[i] == page[j] then, If j > farthest Set farthest = j End If Set res = i break If j == pn then, Return i Return (res == -1) ? 0 : res Step 2-> In function bool search(int key, vector<int>& fr) Loop For i = 0 and i < fr.size() and i++ If fr[i] == key then, Return true Return false Step 3-> In function void opr(int page[], int pn, int fn) Declare vector<int> fr Set hit = 0 Loop For i = 0 and i < pn and i++ If search(page[i], fr) then, Increment hit by 1 continue If fr.size() < fn then, fr.push_back(page[i]) Else Set j = predict(page, fr, pn, i + 1) Set fr[j] = page[i] Print the number of hits Print the number of misses Step 4-> In function int main() Declare and assign page[] = { 1, 7, 8, 3, 0, 2, 0, 3, 5, 4, 0, 6, 1 } Set pn = sizeof(page) / sizeof(page[0]) Set fn = 3 opr(page, pn, fn) Stop
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; int predict(int page[], vector<int>& fr, int pn, int index) { // Store the index of pages which are going // to be used recently in future int res = -1, farthest = index; for (int i = 0; i < fr.size(); i++) { int j; for (j = index; j < pn; j++) { if (fr[i] == page[j]) { if (j > farthest) { farthest = j; res = i; } break; } } // Return the page which are // are never referenced in future, if (j == pn) return i; } // If all of the frames were not in future, // return any of them, we return 0. Otherwise // we return res. return (res == -1) ? 0 : res; } bool search(int key, vector<int>& fr) { for (int i = 0; i < fr.size(); i++) if (fr[i] == key) return true; return false; } void opr(int page[], int pn, int fn) { vector<int> fr; int hit = 0; for (int i = 0; i < pn; i++) { // Page found in a frame : HIT if (search(page[i], fr)) { hit++; continue; } //If a page not found in a frame : MISS // check if there is space available in frames. if (fr.size() < fn) fr.push_back(page[i]); // Find the page to be replaced. else { int j = predict(page, fr, pn, i + 1); fr[j] = page[i]; } } cout << "Hits = " << hit << endl; cout << "Misses = " << pn - hit << endl; } // main Function int main() { int page[] = { 1, 7, 8, 3, 0, 2, 0, 3, 5, 4, 0, 6, 1 }; int pn = sizeof(page) / sizeof(page[0]); int fn = 3; opr(page, pn, fn); return 0; }
ผลลัพธ์
Hits = 3 Misses = 10