日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统页面置换算法实验报告

發布時間:2025/3/20 windows 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统页面置换算法实验报告 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實驗指導 一
、頁面置換算法的基本內容
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);//記錄當前頁面的訪問情況: 0 未訪問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) {//當前頁面還沒訪問過//內存已滿且當前訪問不在內存中->進行置換//1.尋找到最晚才被訪問到的頁面int max = 0;for (int k = 1; k < phyNum; k ++) {if (nextPosition[max] < nextPosition[k]) {max = k;}}//2.將該位置的頁面換出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;//記錄當前頁面的訪問情況: 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);//記錄當前頁面的訪問情況: 0 未訪問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) {//需要置換//1.遍歷時間記錄表,尋找最久未訪問的頁面所在的內存下標int max = 0;for (int k = 0; k < phyNum; k ++) {if (timeRecord[max] < timeRecord[k]) {max = k;}}//2.將該位置的頁面換出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);//showMemoryList(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; }

總結

以上是生活随笔為你收集整理的操作系统页面置换算法实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。