Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ สำหรับอัลกอริธึมการเปลี่ยนหน้าที่เหมาะสมที่สุด


กำหนดหมายเลขหน้าและขนาดหน้า ภารกิจคือการค้นหาจำนวนการเข้าชมและพลาดเหมือนกับเมื่อเราจัดสรรบล็อกหน่วยความจำไปยังหน้าโดยใช้อัลกอริธึมการเปลี่ยนหน้าที่เหมาะสมที่สุด

อัลกอริธึมการเปลี่ยนหน้าที่เหมาะสมที่สุดคืออะไร

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

มาทำความเข้าใจโดยใช้ตัวอย่างและอธิบายเป็นแผนภาพ

โปรแกรม C++ สำหรับอัลกอริธึมการเปลี่ยนหน้าที่เหมาะสมที่สุด

ที่นี่หลังจากจัดสรร 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