1. 程式人生 > >c模擬 頁式管理頁面置換演算法之FIFO

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;
}

執行結果如下:

執行結果符合預期

希望能給看到此博文的你一點小小的幫助!