生活随笔
收集整理的這篇文章主要介紹了
操作系统页面置换算法实验报告
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
實驗指導 一
、頁面置換算法的基本內容
1.1 頁面置換算法是在當進程運行過程中,若其要訪問的頁面不在內存且內存已滿時,要決定將哪個頁面換出的算法。常見的頁面置換算法包括最佳置換、先進先出置換、最近最久未使用置換和Clock置換等。本次的實驗實現的算法包括最佳置換算法(OPT)、先進先出置換算法(FIFO)和最近最久未使用算法(LRU)。
1.2 頁面置換算法涉及到一些概念如下: 缺頁率:當需要訪問的頁面不在內存時稱為缺頁,此時需要將頁面調入內存。缺頁率就是要訪問的頁面不在內存中的概率。因此缺頁率=缺頁次數/要訪問的頁面總數。需要注意的是,缺頁的時候不一定需要進行頁面置換(如果內存還沒滿,直接將頁面調入內存即可)。
置換率:置換就是將舊頁面調出內存,新頁面調進內存,即新頁面代替舊頁面的過程。置換率就是需要進行頁面置換的概率。所以置換率=置換次數/要訪問的頁面總數。
命中率:就是要訪問的頁面恰好在內存中的概率。可以發現(缺頁率+命中率=1)。 最佳置換算法
最佳置換算法,就是所選擇內存中以后永遠不再使用,或者是在未來最長的一段時間內不再被訪問的頁面來換出。用這種算法可以保證獲得最低的缺頁率,最低的置換次數,因此效率最高。然而在實際情況中,我們是無法知道哪個頁面是未來最長時間內不再被訪問的,所以實際上它是無法實現的。
先進先出置換算法 先進先出置換算法,就是選擇內存中最先進入內存,在內存中呆的最久的頁面來換出。它實現簡單,但是效率不高。 最近最久未使用算法
最近最久未使用算法,是選擇當前內存中,最久沒有被訪問的頁面來換出。它是希望通過過去頁面訪問的情況,來預測未來頁面的訪問情況,但是頁面過去與未來的走向之間并沒有必然的聯系,因此它的效率也不是十分高。
根據實驗指導書搜索資料編寫實驗代碼
代碼功能:
根據自己輸入 物理塊數量,訪問頁面總數,要訪問的頁面號,
然后選擇所需的置換算法 OPT,FIFO,LRU 三選一. 計算過程,并得出 缺頁次數,缺頁率,置換次數,命中率的結果;
1.使用FIFO置換算法
2.使用OPT置換算法
#include
<stdio.h>
void initializeList(int list
[],int number
){for (int i
= 0; i
< number
; i
++) {list
[i
] = -1;}
}
void showList(int list
[], int number
){for (int i
= 0; i
< number
; i
++) {printf("%2d",list
[i
]);}printf("\n");
}
void showMemoryList(int list
[],int phyBlockNum
){for (int i
= 0; i
< phyBlockNum
; i
++) {if (list
[i
] == -1) {break;}printf(" |%d|",list
[i
]);}printf("\n");
}void informationCount(int missingCount
,int replaceCount
,int pageNum
){printf("缺頁次數:%d 缺頁率:%d/%d\n",missingCount
,missingCount
,pageNum
);double result
= (double)(pageNum
- missingCount
)/(double)pageNum
;printf("置換次數:%d 命中率:%.2f\n",replaceCount
,result
);
}
int getNextPosition(int currentPage
,int currentPosition
,int strList
[],int pageNum
){for (int i
= currentPosition
+1; i
< pageNum
; i
++) {if (strList
[i
] == currentPage
) {return i
;}}return 100;
}
void replacePageByOPT(int memoryList
[],int phyNum
,int strList
[],int pageNum
){int replaceCount
= 0;int missingCount
= 0;int nextPosition
[phyNum
];initializeList(nextPosition
, phyNum
);int isVisited
;for (int i
= 0; i
< pageNum
; i
++) {isVisited
= 0;for (int j
= 0; j
< phyNum
; j
++) {if (memoryList
[j
] == strList
[i
]) {nextPosition
[j
] = getNextPosition(memoryList
[j
], i
, strList
, pageNum
);isVisited
= 1;printf("%d\n",strList
[i
]);break;}if (memoryList
[j
] == -1) {memoryList
[j
] = strList
[i
];nextPosition
[j
] = getNextPosition(memoryList
[j
], i
, strList
, pageNum
);missingCount
++;isVisited
= 1;printf("%d\n",strList
[i
]);showMemoryList(memoryList
, phyNum
);break;}}if (!isVisited
) {int max
= 0;for (int k
= 1; k
< phyNum
; k
++) {if (nextPosition
[max
] < nextPosition
[k
]) {max
= k
;}}memoryList
[max
] = strList
[i
];nextPosition
[max
] = getNextPosition(memoryList
[max
], i
, strList
, pageNum
);missingCount
++;replaceCount
++;printf("%d\n",strList
[i
]);showMemoryList(memoryList
, phyNum
);}}informationCount(missingCount
, replaceCount
,pageNum
);
}
void replacePageByFIFO(int memoryList
[],int phyNum
,int strList
[],int pageNum
){int replaceCount
= 0;int missingCount
= 0;int pointer
= 0;int isVisited
= 0;for (int i
= 0; i
< pageNum
; i
++) {isVisited
= 0;for (int j
= 0; j
< phyNum
; j
++) {if (memoryList
[j
] == strList
[i
]) {isVisited
= 1;printf("%d\n",strList
[i
]);break;}if (memoryList
[j
] == -1) {memoryList
[j
] = strList
[i
];isVisited
= 1;missingCount
++;printf("%d\n",strList
[i
]);showMemoryList(memoryList
, phyNum
);break;}}if (!isVisited
) {memoryList
[pointer
] = strList
[i
];pointer
++;if (pointer
> phyNum
-1) {pointer
= 0;}missingCount
++;replaceCount
++;printf("%d\n",strList
[i
]);showMemoryList(memoryList
, phyNum
);}}informationCount(missingCount
, replaceCount
, pageNum
);
}
void replacePageByLRU(int memoryList
[],int phyNum
,int strList
[],int pageNum
){int replaceCount
= 0;int missingCount
= 0;int timeRecord
[phyNum
];initializeList(timeRecord
, phyNum
);int isVisited
= 0;int pageCount
= 0;for (int i
= 0; i
< pageNum
; i
++) {isVisited
= 0;for (int p
= 0; p
< pageCount
; p
++) {if (memoryList
[p
] != -1) {timeRecord
[p
] ++;}}for (int j
= 0; j
< phyNum
; j
++) {if (memoryList
[j
] == strList
[i
]) {isVisited
= 1;timeRecord
[j
] = -1;printf("%d\n",strList
[i
]);break;}if (memoryList
[j
] == -1) {memoryList
[j
] = strList
[i
];pageCount
++;isVisited
= 1;timeRecord
[j
] ++;missingCount
++;printf("%d\n",strList
[i
]);showMemoryList(memoryList
, phyNum
);break;}}if (!isVisited
) {int max
= 0;for (int k
= 0; k
< phyNum
; k
++) {if (timeRecord
[max
] < timeRecord
[k
]) {max
= k
;}}memoryList
[max
] = strList
[i
];timeRecord
[max
] = -1;missingCount
++;replaceCount
++;printf("%d\n",strList
[i
]);showMemoryList(memoryList
, phyNum
);}}informationCount(missingCount
, replaceCount
, pageNum
);
}int main(int argc
, const char * argv
[]) {int phyBlockNum
;printf("請輸入物理塊數量:\n");scanf("%d",&phyBlockNum
);int memoryList
[phyBlockNum
];initializeList(memoryList
, phyBlockNum
);int pageNum
;printf("請輸入要訪問的頁面總數:\n");scanf("%d",&pageNum
);int pageNumStrList
[pageNum
];printf("請輸入要訪問的頁面號:\n");for (int i
= 0; i
< pageNum
; i
++) {scanf("%d",&pageNumStrList
[i
]);}showList(pageNumStrList
, pageNum
);int chose
;while (1) {printf("請選擇所需的置換算法:\n");printf("1.OPT 2.FIFO 3.LRU 4.退出\n");scanf("%d",&chose
);switch (chose
) {case 1:showList(pageNumStrList
, pageNum
);replacePageByOPT(memoryList
, phyBlockNum
, pageNumStrList
, pageNum
);initializeList(memoryList
, phyBlockNum
);break;case 2:showList(pageNumStrList
, pageNum
);replacePageByFIFO(memoryList
, phyBlockNum
, pageNumStrList
, pageNum
);initializeList(memoryList
, phyBlockNum
);break;case 3:showList(pageNumStrList
, pageNum
);replacePageByLRU(memoryList
, phyBlockNum
, pageNumStrList
, pageNum
);initializeList(memoryList
, phyBlockNum
);break;default:return 0;break;}}return 0;
}
總結
以上是生活随笔為你收集整理的操作系统页面置换算法实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。