国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

操作系統(tǒng)實驗三虛擬存儲器管理之模擬頁面置換算法(FIFO&LRU)

這篇具有很好參考價值的文章主要介紹了操作系統(tǒng)實驗三虛擬存儲器管理之模擬頁面置換算法(FIFO&LRU)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

操作系統(tǒng)實驗三虛擬存儲器管理之模擬頁面置換算法(FIFO&LRU)

文章目錄

一、概述

?(1)置換算法

?(2)缺頁率與命中率

二、先進先出置換算法(FIFO)

?? (1)定義

?? (2)示例

?(3)Belady異常

?三、最近最久未使用置換算法(LRU)

(1)定義

(2)示例

四、FIFO&LRU置換算法的模擬

?? (1)流程圖

?(2)完整代碼

?(3)實驗結果


一、概述

(1)置換算法

????????進程運行時,若其訪問的頁面不在內存中而需要將其調入,但內存已經(jīng)無空閑空間時,就需要從內存中調出一頁程序或者數(shù)據(jù),送入磁盤的對換區(qū)。

????????選擇調出頁面的算法就稱為頁面置換算法。常見的頁面置換算法有以下四種:

  • 最佳置換算法(OPT)
  • 先進先出頁面置換算法(FIFO)
  • 最近最久未使用置換算法(LRU)
  • 時鐘置換算法(CLOCL)

(2)缺頁率與命中率

????????當前訪問的頁面不在內存中時,此時發(fā)生缺頁中斷,選擇合適的頁面置換算法來從內存中調出一頁程序或者數(shù)據(jù),送入磁盤的對換區(qū),與當前要訪問的頁面進行置換,從而滿足當前的訪問需求。這種情況就叫缺頁,相反,如果當前訪問的頁面在內存中時,即為命中。二者有如下關系:

  • 缺頁率+命中率=1
  • 缺頁率=缺頁次數(shù)/總頁面訪問次數(shù)
  • 命中率=命中次數(shù)/總頁面訪問次數(shù)

本次實驗重點是模擬先進先出和最近最久未使用算法的執(zhí)行過程。


二、先進先出置換算法(FIFO)

(1)定義

????????優(yōu)先淘汰那些最早進入內存的頁面,即淘汰在內存中駐留時間最久的頁面。該算法實現(xiàn)簡單,只需把已調入內存的頁面根據(jù)先后次序鏈接成隊列,設置一個指針總是指向最老的頁面。

(2)示例

假定系統(tǒng)為某個進程分配了3個物理塊,訪問頁面依次如下:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1

操作系統(tǒng)實驗三虛擬存儲器管理之模擬頁面置換算法(FIFO&LRU)

按照FIFO算法, 當依次訪問頁面7,0,1時,由于都不在內存中發(fā)生缺頁中斷,因為有3個物理塊且內存空閑,所以可以不用置換頁面直接將這三個頁面依次放入內存中;當訪問頁面2時,由于不在內存中,發(fā)生缺頁中斷,此時按照FIFO置換算法將內存中最早進入內存的頁面7與2置換,讓2進入內存,后面以此類推。

(3)Belady異常

????????分配給進程的物理塊增多,但是缺頁率卻不減反增的現(xiàn)象被稱之為Belady異常。如圖:

操作系統(tǒng)實驗三虛擬存儲器管理之模擬頁面置換算法(FIFO&LRU)

?當進程有3個物理塊時,缺頁次數(shù)為9,缺頁率為75%

?當進程有4個物理塊時,缺頁次數(shù)為10,缺頁率為83.33%

?另外,只有FIFO算法會出現(xiàn)Belady異常,其它算法不會出現(xiàn)這種情況!


?三、最近最久未使用置換算法(LRU)

(1)定義

????????選擇最近最長時間未訪問過的頁面予以淘汰,它認為過去一段時間內未訪問過的頁面,在最近的將來可能也不會被訪問。該算法為每個頁面設置一個訪問字段,用來記錄頁面自上次被訪問以來所經(jīng)歷的時間,淘汰頁面時選擇現(xiàn)有頁面中值最大的予以淘汰。

(2)示例

????????再對上面的例子采用LRU算法進行頁面置換,如圖3.25所示。進程第一次對頁面 2訪問時,將最近最久未被訪問的頁面7置換出去。然后在訪問頁面3時,將最近最久未使用的頁面1換出。

操作系統(tǒng)實驗三虛擬存儲器管理之模擬頁面置換算法(FIFO&LRU)

????????LRU算法的性能較好,但需要寄存器和棧的硬件支持。LRU是堆棧類的算法。理論上可以證明,堆棧類算法不可能出現(xiàn)Belady異常。FIFO 算法基于隊列實現(xiàn),不是堆棧類算法。


四、FIFO&LRU置換算法的模擬

(1)流程圖

操作系統(tǒng)實驗三虛擬存儲器管理之模擬頁面置換算法(FIFO&LRU)

?(2)完整代碼

/*
虛擬存儲器之頁面置換算法的模擬 
測試數(shù)據(jù)1:20個訪問的頁面  3個物理塊:
7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
測試數(shù)據(jù)2:10個訪問頁面  2個物理塊
4 2 3 0 3 2 1 2 0 1
*/
#include <stdio.h>
#define phy 100
#define page 100//頁面最大數(shù)
#define phyBlock 100//物理塊最大數(shù)
int phyBlockNum;//物理塊的數(shù)量
int pageNum;//頁面數(shù)量
int pageNumStrList[page];//保存頁面號引用串
//初始化隊列
void initializeList(int list[], int number)
{
    for (int i = 0; i < number; i++)
    {
        list[i] = -1;
    }
}
//展示當前隊列狀態(tài)
void showList(int list[], int number)
{
    for (int i = 0; i < number; i++)
    {
        printf("%2d", list[i]);
    }
    printf("\n");
}
//展示當前系統(tǒng)內存狀態(tài)
void showMemoryList(int list[], int phyBlockNum)
{
    for (int i = 0; i < phyBlockNum; i++)
    {
        if (list[i] == -1)
        {
            break;
        }
        printf("  |%d|\t", list[i]); 
    }
    printf("\n");
}
//頁面置換結果分析統(tǒng)計 
void informationCount(int missingCount, int replaceCount, int pageNum)
{
    printf("---------------------------結果分析--------------------------\n");
    printf("缺頁次數(shù):%d\n", missingCount);
    double a=(double)missingCount/pageNum;//計算缺頁率以百分號形式表示 
    printf("缺頁率:%.2f%%\n", a*100);
    double result = (double)(pageNum - missingCount) / (double)pageNum;
    printf("置換次數(shù):%d\n", replaceCount);
    printf("------------------------------------------------------------\n");
}
//尋找該頁面下次要訪問的位置
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;
}
//FIFO:先進先出置換算法
void replacePageByFIFO(int memoryList[], int phyNum, int strList[], int pageNum) {
    int replaceCount = 0; //置換次數(shù)
    int missingCount = 0; //缺頁次數(shù)
    int pointer = 0; //記錄當前最早進入內存的下標
    int isVisited = 0;//記錄當前頁面的訪問情況: 0表示未訪問,1表示已訪問 
    for (int i = 0; i < pageNum; i++) {
        isVisited = 0;
        //判斷是否需要置換,內存已滿且需要訪問的頁面不在內存中
        for (int j = 0; j < phyNum; j++) {
            if (memoryList[j] == strList[i]) {
                //1.該頁面已經(jīng)存在內存中
                //修改訪問情況
                isVisited = 1;
                //修改訪問時間
                printf("%d\t", strList[i]);
                printf("\n");
                break;
            }
            if (memoryList[j] == -1) {
                //2.頁面不在內存中且內存未滿則直接存入即可 
                memoryList[j] = strList[i];
                //修改訪問情況
                isVisited = 1;
                missingCount++;
                printf("%d\t", strList[i]);
                showMemoryList(memoryList, phyNum);
                break;
            }
        }
        //當前頁面還未被訪問過,需要進行頁面置換
        if (!isVisited) {
            //直接把這個頁面存到所記錄的下標中
            memoryList[pointer] = strList[i];
            pointer++; //下標指向下一個
            //如果到了最后一個,將下標歸零
            if (pointer > phyNum - 1) {
                pointer = 0;
            }
            missingCount++;
            replaceCount++;
            printf("%d\t", strList[i]);
            showMemoryList(memoryList, phyNum);
        }
    }
    informationCount(missingCount, replaceCount, pageNum);
}

//LRU:最近最久未使用置換算法
void replacePageByLRU(int memoryList[], int phyNum, int strList[], int pageNum) {
    int replaceCount = 0;//置換次數(shù)
    int missingCount = 0;    //缺頁次數(shù)
    int timeRecord[phy]; //記錄內存中最近一次訪問至今的時間
    initializeList(timeRecord, phyNum);
    int isVisited = 0;
    //記錄已經(jīng)在內存中的頁面數(shù)量
    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] != -1) {
                timeRecord[j] ++;
            }
            if (memoryList[j] == strList[i]) {
                //該頁面已經(jīng)存在內存中
                //修改訪問情況
                isVisited = 1;
                //重置訪問時間
                timeRecord[j] = -1;
                printf("%d\t", strList[i]);
                printf("\n");
                break;
            }
            if (memoryList[j] == -1) {
                //頁面不在內存中且內存未滿,直接存入
                memoryList[j] = strList[i];
                pageCount++;
                //修改訪問情況
                isVisited = 1;
                //修改訪問時間
                timeRecord[j]++;
                missingCount++;
                printf("%d\t", 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\t", strList[i]);
            showMemoryList(memoryList, phyNum);
        }
    }
    informationCount(missingCount, replaceCount, pageNum);
}
//測試 
int main(int argc, const char* argv[])
{
	printf("------------------虛擬存儲器之頁面置換算法------------------\n"); 
    printf("請輸入內存的物理塊數(shù)量:");
    scanf("%d", &phyBlockNum);
    //生成內存隊列
    int memoryList[phyBlock];
    //初始化內存狀態(tài)
    initializeList(memoryList, phyBlockNum);
    //showMemoryList(memoryList,phyBlockNum);
    printf("請輸入要訪問的頁面總數(shù):");
    scanf("%d", &pageNum);
    printf("請輸入要訪問的頁面號:");
    for (int i = 0; i < pageNum; i++) {
        scanf("%d", &pageNumStrList[i]);
    }
    printf("------------------------------------------------------------\n");
    int chose;
    while (1)
    {
        printf("★請選擇你要執(zhí)行的操作:(1.FIFO算法 2.LRU算法 3.退出):");
        scanf("%d", &chose);
        switch (chose)
        {
        case 1:
        	printf("------------------------------------------------------------\n");
        	printf("頁面號\t");
        	for(int i=0;i<phyBlockNum;i++){
        		printf("物理塊%d\t",i+1);
        	}
        	printf("\n");
            replacePageByFIFO(memoryList, phyBlockNum, pageNumStrList, pageNum);
            //重新初始化內存
            initializeList(memoryList, phyBlockNum);
            break;
        case 2:
        	printf("------------------------------------------------------------\n");
            printf("頁面號\t");
        	for(int i=0;i<phyBlockNum;i++){
        		printf("物理塊%d\t",i+1);
        	}
        	printf("\n");
            replacePageByLRU(memoryList, phyBlockNum, pageNumStrList, pageNum);
            //重新初始化內存
            initializeList(memoryList, phyBlockNum);
            break;
        default:
        	printf("退出成功");
            return 0;
            break;
        }
    }
    return 0;
}

(3)實驗結果

操作系統(tǒng)實驗三虛擬存儲器管理之模擬頁面置換算法(FIFO&LRU)

最后, 如果本文內容對你有所幫助,記得點贊收藏哈。文章來源地址http://www.zghlxwxcb.cn/news/detail-445299.html

到了這里,關于操作系統(tǒng)實驗三虛擬存儲器管理之模擬頁面置換算法(FIFO&LRU)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【操作系統(tǒng)復習之路】存儲器管理(第四章 &超詳細講解)

    【操作系統(tǒng)復習之路】存儲器管理(第四章 &超詳細講解)

    目錄 一、存儲器的層次結構 二、程序的裝入和鏈接 2.1 邏輯地址和物理地址 2.2?絕對裝入方式 2.3?可重定位裝入方式 2.4?動態(tài)運行時裝入方式 2.5 靜態(tài)鏈接? 2.6 裝入時動態(tài)鏈接 2.7 運行時動態(tài)鏈接 三、連續(xù)分配存儲器管理方式 3.1?單一連續(xù)分配 3.2?固定分區(qū)分配 3.3?動態(tài)分區(qū)

    2024年04月27日
    瀏覽(28)
  • 操作系統(tǒng)考試復習——第四章 存儲器管理 4.1 4.2

    操作系統(tǒng)考試復習——第四章 存儲器管理 4.1 4.2

    存儲器的層次結構: 存儲器的多層結構: 存儲器至少分為三級:CPU寄存器,主存和輔存。 但是 一般分為6層 為寄存器,高速緩存,主存儲器,磁盤緩存,固定磁盤,可移動存儲介質。 這幾個部分是 速度依次減小 但是 存儲容量是依次增大 的。 ?只有固定磁盤和可移動存儲

    2024年02月03日
    瀏覽(24)
  • 實驗二 存儲器實驗

    實驗二 存儲器實驗

    一、FPGA 中 LPM_ROM 定制與讀出實驗的實驗步驟 第一步:創(chuàng)建新的工程建立mif文件 File---New Project wizard.... ---選擇芯片cyclone IV EP4CE22F17C8---建立存儲器初始化文件ROM1.mif ?---創(chuàng)建一個128*32bits空間大小的存儲空間---輸入初始化數(shù)據(jù)(如圖5.1ROM1的數(shù)據(jù)) 圖5.1 ROM1的數(shù)據(jù) 第二步:調用

    2024年02月03日
    瀏覽(19)
  • 靜態(tài)存儲器擴展實驗

    靜態(tài)存儲器擴展實驗

    一、實驗目的: ? ?按照規(guī)則字寫存儲器,編寫實驗程序,將N個數(shù)寫入SRAM的某段空間中,查看該存儲空間,檢測寫入是否正確。 二、實驗內容與要求: ? ? ? 按照規(guī)則字寫存儲器,編寫實驗程序,將0000H~000FH 共16個數(shù)寫入SRAM的從0000H起始的一段空間中,然后通過系統(tǒng)命令查

    2023年04月09日
    瀏覽(20)
  • quartus存儲器實驗

    quartus存儲器實驗

    實驗目的 1、掌握FPGA中l(wèi)pm_ROM只讀存儲器配置方法。 2、用文本編輯器編輯mif文件配置ROM,加載于ROM中; 3、驗證FPGA中mega_lpm_ROM的功能 ? 設置硬件。不設置不影響仿真。 新建好了一個空的工程。 注意:電路圖文件名和頂層名字要一樣。 開始畫圖,雙擊空白地方。 ? ?點擊ok,

    2024年02月05日
    瀏覽(32)
  • 虛擬存儲器

    虛擬存儲器

    虛擬存儲器是 主存-輔存 層次的,虛擬存儲器主要是由操作系統(tǒng)實現(xiàn),在計算機組成原理中應更加關注主存-Cache 1、實地址(物理地址):計算機物理內存的訪問地址。 2、虛地址(邏輯地址):用戶編程時使用的地址。 3、再定位:程序進行虛地址到實地址轉換的過程。 4、

    2024年02月05日
    瀏覽(23)
  • 西電計組實驗一 存儲器實驗

    西電計組實驗一 存儲器實驗

    一.實驗目的 ??1.掌握FPGA中l(wèi)pm_ROM的設置,作為只讀存儲器ROM的工作特性和配置方法; ??2.用文本編輯器編輯mif文件配置ROM,學習將程序代碼以mif格式文件加載于lpm_ROM中; ??3.在初始化存儲器編輯窗口編輯mif文件配置ROM; ??4.驗證FPGA中mega_lpm_ROM的功能。 二.實驗原

    2024年02月04日
    瀏覽(18)
  • 計算機組成原理實驗 實驗一 存儲器實驗

    計算機組成原理實驗 實驗一 存儲器實驗

    目錄 實驗1? 存儲器實驗 一、實驗目的 二、實驗原理 三、實驗電路 四、實驗步驟 五、實驗數(shù)據(jù)分析 六、思考題 1.熟悉DVCC計算機組成原理實驗機的結構,掌握其主要操作。 2.掌握靜態(tài)隨機存儲器RAM工作特性。 3.掌握靜態(tài)隨機存儲器RAM的數(shù)據(jù)讀寫方法。 4.能夠運用靜態(tài)隨機存

    2023年04月18日
    瀏覽(23)
  • 計算機組成原理實驗——三、存儲器實驗

    計算機組成原理實驗——三、存儲器實驗

    1.掌握存儲器的工作原理和接口。 2.掌握存儲器的實現(xiàn)方法和初始化方法。 3.掌握RISC-V中存儲器的存取方式。 1.利用vivado IP核創(chuàng)建64 32的ROM,并在 系數(shù)文件中設置數(shù)據(jù)為123489ab; 2.利用vivado IP核創(chuàng)建64 32的RAM,并在 其上封裝一個模塊,使得其能完成risc-v 的load/store指令功能。

    2024年02月04日
    瀏覽(22)
  • 計算機組成原理 存儲器實驗

    計算機組成原理 存儲器實驗

    計算機組成原理實驗環(huán)境 掌握靜態(tài)隨機存儲器 RAM 的工作特性。 掌握靜態(tài)隨機存儲器 RAM 的讀寫方法。 做好實驗預習,熟悉 MEMORY6116 芯片各引腳的元器件的功能和連接方式,熟悉其他實驗元器件的功能特性和使用方法,看懂電路圖。 按照實驗內容與步驟的要求,認真仔細地

    2024年02月02日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包