c模擬 頁式管理頁面置換演算法之FIFO
寫的作業系統作業。。。。
放上來給需要的小夥伴
需要注意的地方:
1.該演算法只涉及單程序
2.只是用c模擬FIFO的思想
FIFO思想:選擇在記憶體中存活時間最久的頁面淘汰
關於該演算法我的理解:
一個程序可以分為多個頁面,頁面大小一致,每個頁面需要佔用一個相同大小的記憶體塊,在程序的頁面較多而記憶體塊較少的情況下,比如5個頁面,3個記憶體塊,這種情況記憶體塊肯定是不夠用的,當前面三個頁面都有了自己的記憶體塊之後,現在已經沒有空的記憶體塊了,第四個頁面想要進入記憶體塊中,就要從佔用記憶體塊的頁面中淘汰一個,那麼就需要定義一個淘汰的規則:我們這裡使用的淘汰規則:FIFO規則,選擇在記憶體中存活時間最久的頁面淘汰
程式碼分析:
假設一共有一個程序,該程序可以分為5個不同的頁面
假設有3個記憶體塊
一共三個表
第一個表:頁面執行順序陣列表(表中存放的是頁面的編號,意思是先執行2號頁面,然後執行4號頁面,再執行3號頁面...........................最後又執行4號頁面)(重複執行某個頁面是因為程式碼需要重用,比如函式多次呼叫)
2 | 4 | 3 | 0 | 1 | 2 | 4 |
第二個表:頁表(頁表中的頁號和上面的頁面順序執行表中的存的頁號是對應的)
頁號 | 頁面在記憶體塊中的地址 | 頁面在記憶體中存活的時間 |
0 | -1(最開始預設-1) | 0(最開始預設0) |
1 | -1 | 0 |
2 | 0 | 3 |
3 | 2 | 1 |
4 | 1 | 2 |
第三個表:記憶體塊資訊表(存放的是佔用該記憶體塊的頁號)
2 | 4 | 3 |
現在執行順序陣列中的前面3個頁面都有了記憶體塊(2號頁面,4號頁面,3號頁面)且記憶體塊中已經沒有了空閒的記憶體塊,當頁面執行順序表中的0號頁面要進入記憶體塊的時候,就必須淘汰一個佔用記憶體塊的頁面,按照FIFO的淘汰規則,存活時間最長的2號頁面將被淘汰(2號頁面存活時間為3秒)所以現在表回產生變化:
頁號 | 頁面在記憶體塊中的地址 | 頁面在記憶體中存活的時間 |
0 | 0 | 1 |
1 | -1 | 0 |
2 | -1 | 0 |
3 | 2 | 2(時間滾動,增加1秒) |
4 | 1 | 3 |
0(此時0號頁面佔用該記憶體塊) | 4(此時還是4號頁面佔用該記憶體塊) | 3此時還是3號頁面佔用該記憶體塊) |
根據我們FIFO的淘汰規則:淘汰了2號頁面,將2號頁面佔用的記憶體塊交給了0號頁面使用,現在頁面執行順序陣列執行到了第4個,後面的依次類推,按照FIFO淘汰規則進行淘汰
程式碼如下:
#include <stdio.h> #include <stdlib.h> //資料結構 頁式管理 FIFO 先進先出 單程序 #define MEMORY_MAX_BLOCKS 10//定義物理塊最大數量 #define PROGRESS_MAX_PAGE 20 //定義虛擬頁面的最大數量 #define PROGRESS_MAX_LENGTH 30 //定義程序的最大長度 //當前程序的相關資訊 int curProPages;//當前程序虛擬頁 int curMemoryBlocks;//當前程序物理塊 int proLength;// 程序執行長度 int proSort[PROGRESS_MAX_LENGTH];//虛擬頁執行順序陣列 typedef struct PageItem { int vpage;//虛擬頁的編號 int mblock;//對應的物理號 預設不存在對應的記憶體塊-1 int loadTime;//該頁面在記憶體中存在的時間 } PageItem; PageItem pageList[PROGRESS_MAX_PAGE];//頁表: int memoryAllocInfo[MEMORY_MAX_BLOCKS];//記憶體物理塊分配資訊,某個記憶體塊放某個頁面 //初始化函式 void init() { int i=0; curProPages=5;//虛擬頁面數量 curMemoryBlocks=3;//記憶體塊數量 proLength=7;//虛擬頁執行順序陣列長度 proSort[0]=2;//存放的是虛擬頁的編號 proSort[1]=4; proSort[2]=3; proSort[3]=0; proSort[4]=1; proSort[5]=2; proSort[6]=4; for(i=0; i<curProPages; i++) //頁表的初始化 { pageList[i].vpage=i; pageList[i].mblock=-1; pageList[i].loadTime=0; } for(i=0; i<curMemoryBlocks; i++) //記憶體塊的初始化 { memoryAllocInfo[i]=-1; } } void showInfo() { //頁表資訊列印 printf("-------------------------------------------------------------\n"); printf("頁表資訊:\n"); printf("頁號\t頁對應的記憶體塊編號\t頁面在記憶體中存活的時間\n"); int i; for(i=0; i<curProPages; i++) { printf("%d\t\t%d\t\t\t%d\n",pageList[i].vpage,pageList[i].mblock,pageList[i].loadTime); } printf("\n"); printf("記憶體塊資訊表:\n"); printf("記憶體塊地址\t存放在此的頁面\n"); for(i=0; i<curMemoryBlocks; i++) { printf("%d\t\t%d\n",i,memoryAllocInfo[i]); } printf("-------------------------------------------------------------\n\n\n"); } //頁表中已經存在於記憶體的虛擬頁的時間加一個點 void extnedTime() { int i=0; for(i=0; i<curProPages; i++) { if(pageList[i].mblock!=-1) { pageList[i].loadTime+=1; } } } //檢查實體記憶體中是否有空閒的塊 int findFreeBlock() { int i=0; for(i=0; i<curMemoryBlocks; i++) { if(memoryAllocInfo[i]==-1) { return i; } } return -1;//返回-1表示不存在空閒記憶體塊 } //FIFO淘汰 //找到在記憶體塊中存活時間最久的頁面 int fifoPage() { int i=0; int maxTime=-1; int vpage=-1; for(i=0; i<curProPages; i++) { if(pageList[i].mblock==-1) { continue; } if(pageList[i].loadTime>maxTime) { maxTime=pageList[i].loadTime; vpage=i; } } return vpage; } void fifo() { //開始程式執行,呼叫虛擬機器 int index; int vpage; int fpage; int freeIndex; for(index=0; index<proLength; index++) { vpage=proSort[index]; //檢查是否已經分配物理頁 if(pageList[vpage].mblock!=-1) { //對於已經存在於記憶體的虛擬頁都必須加一個時間點 extnedTime(); } else { //說明虛擬頁沒有在記憶體中 //檢查記憶體中是否有空閒塊 freeIndex=findFreeBlock(); if(freeIndex!=-1) { memoryAllocInfo[freeIndex]=vpage; pageList[vpage].mblock=freeIndex; extnedTime(); } else { //空閒區沒有 //查頁表:淘汰最長時間 fpage=fifoPage(); //找到在記憶體中所佔有的物理塊 freeIndex=pageList[fpage].mblock; //更新淘汰的虛擬頁的相關資訊 pageList[fpage].loadTime=0; pageList[fpage].mblock=-1; //更新分配情況 memoryAllocInfo[freeIndex]=vpage; //更新當前調到記憶體中的虛頁的資訊 pageList[vpage].mblock=freeIndex; extnedTime(); } } showInfo(); } } int main() { //初始化(互動) init(); //顯示() showInfo(); //核心邏輯() fifo(); return 0; }
執行結果如下:
執行結果符合預期
希望能給看到此博文的你一點小小的幫助!