C语言模拟FIFO算法,随机生成320条指令,有四块物理块,为什么错了?

C语言模拟FIFO算法,随机生成320条指令,有四块物理块,为什么错了?,第1张

这可是hen宝贵的啊

#include

#include

#include

#include

#define Bsize 4

typedef struct BLOCK//声明一种新类型——物理块类型

{

int pagenum//页号

int accessed//访问字段,其值表示多久未被访问

}BLOCK

int pc//程序计数器,用来记录指令的序号

int n//缺页计数器,用来记录缺页的次数

static int temp[320]//用来存储320条随机数

BLOCK block[Bsize]//定义一大小为4的物理块数组

//*************************************************************

void init( )//程序初始化函数

int findExist(int curpage)//查找物理块中是否有该页面

int findSpace( )//查找是否有空闲物理块

int findReplace( )//查找应予置换的页面

void display ( )//显示

void suijishu( )//产生320条随机数,显示并存储到temp[320]

void pagestring( )//显示陵郑调用喊拦的页面队列

void OPT( )//OPT算法

void LRU( )// LRU算法

void FIFO( )//FIFO算法

//*************************************************************

void init( )

{

for(int i=0i<Bsizei++)

{

block[i].pagenum=-1

block[i].accessed=0

pc=n=0

}

}

//-------------------------------------------------------------

int findExist(int curpage)

{

for(int i=0i<Bsizei++)

{

if(block[i].pagenum == curpage )

return i//检测到内存中有该页面,返回block中的位置

}

return -1

}

//-------------------------------------------------------------

int findSpace( )

{

for(int i=0i<Bsizei++)

{

if(block[i].pagenum == -1)

return i//找到空闲的block,返回block中的位置

}

return -1

}

//-------------------------------------------------------------

int findReplace( )

{

int pos = 0

for(int i=0i<Bsizei++)

{

if(block[i].accessed >block[pos].accessed)

pos = i//找到应予置换页面,返回BLOCK中位置

}

return pos

}

//-------------------------------------------------------------

void display( )

{

for(int i=0i<Bsizei++)

{

if(block[i].pagenum != -1)

{ printf(" %02d",block[i].pagenum)}

}

cout<<endl

}

//-------------------------------------------------------------

void suijishu( )

{ int flag=0

cin>>pc

cout<<"******按照要郑汪胡求产生的320个随机数:*******"<<endl

for(int i=0i<320i++)

{

temp[i]=pc

if(flag%2==0) pc=++pc%320

if(flag==1) pc=rand( )% (pc-1)

if(flag==3) pc=pc+1+(rand( )%(320-(pc+1)))

flag=++flag%4

printf(" %03d",temp[i])

if((i+1)%10==0) cout<<endl

}

}

//-------------------------------------------------------------

void pagestring( )

{

for(int i=0i<320i++)

{

printf(" %02d",temp[i]/10)

if((i+1)%10==0) cout<<endl

}

}

//-------------------------------------------------------------

void OPT( )

{

int exist,space,position

int curpage

for(int i=0i<320i++)

{

if(i%100==0) getch( )

pc=temp[i]

curpage=pc/10

exist = findExist(curpage)

if(exist==-1)

{

space = findSpace ( )

if(space != -1)

{

block[space].pagenum = curpage

display( )

n=n+1

}

else

{

for(int k=0k<Bsizek++)

{

for(int j=ij<320j++)

{

if(block[k].pagenum!= temp[j]/10)

{

block[k].accessed = 1000

}//将来不会用,设置为一个很大数

else

{

block[k].accessed = j

break

}

}

}

position = findReplace( )

block[position].pagenum = curpage

display( )

n++

}

}

}

cout<<"缺页次数:"<<n<<endl

cout<<"缺页率:"<<(n/320.0)*100<<"%"<<endl

}

//-------------------------------------------------------------

void LRU( )

{

int exist,space,position

int curpage

for(int i=0i<320i++)

{

if(i%100==0) getch( )

pc=temp[i]

curpage=pc/10

exist = findExist(curpage)

if(exist==-1)

{

space = findSpace( )

if(space != -1)

{

block[space].pagenum = curpage

display( )

n=n+1

}

else

{

position = findReplace( )

block[position].pagenum = curpage

display( )

n++

}

}

else block[exist].accessed = -1//恢复存在的并刚访问过的BLOCK中页面accessed为-1

for(int j=0j<4j++)

{block[j].accessed++}

}

cout<<"缺页次数:"<<n<<endl

cout<<"缺页率:"<<(n/320.0)*100<<"%"<<endl

}

//-------------------------------------------------------------

void FIFO( )

{

int exist,space,position

int curpage

for(int i=0i<320i++)

{

if(i%100==0) getch( )

pc=temp[i]

curpage=pc/10

exist = findExist(curpage)

if(exist==-1)

{

space = findSpace( )

if(space != -1)

{

block[space].pagenum = curpage

display( )

n=n+1

}

else

{

position = findReplace( )

block[position].pagenum = curpage

display( )

n++

block[position].accessed--

}

}

for(int j=0j<Bsizej++)

block[j].accessed++

}

cout<<"缺页次数:"<<n<<endl

cout<<"缺页率:"<<(n/320.0)*100<<"%"<<endl

}

//*************************************************************

void main( )

{

int select

cout<<"请输入第一条指令号(0~320):"

suijishu( )

cout<<"*****对应的调用页面队列*******"<<endl

pagestring( )

do

{

cout<<"****************************************"<<endl

cout<<"------1:OPT 2:LRU 3:FIFO 4:退出-----"<<endl

cout<<"****************************************"<<endl

cout<<" 请选择一种页面置换算法:"

cin>>select

cout<<"****************************************"<<endl

init( )

switch(select)

{

case 1:cout<<"最佳置换算法OPT:"<<endl

cout<<"*****************"<<endl

OPT( )

break

case 2:cout<<"最近最久未使用置换算法LRU:"<<endl

cout<<"**************************"<<endl

LRU( )

break

case 3:cout<<"先进先出置换算法FIFO:"<<endl

cout<<"*********************"<<endl

FIFO( )

break

default:

}

}while(select!=4)

}

你试试可以不,应该没问题的

要注意这是用C++编写的,你改一下就可以用了

[fifo.rar] - *** 作系统中内存页面的先进先出的替换算法fifo

[先进先出页面算法程序.rar] - 分别实现最佳置换算法(optimal)、先进先出(fifo)页面置换算法和最近最久未使用(LRU)置换算法,并给出各算法缺页次数和缺页率。

[0022.rar] - 模拟分页式虚拟存储管理宴丛仿中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断

[Change.rar] - 用java实现 *** 作系统的页面置换 其中包括 最佳置换算法(Optimal)、先进先出算法(First-in, First-out) 、最近最久不用的页面置换算法(LeastRecently Used Replacement)三种算法的实现

[M_Management.rar] - *** 作系统中内存管理页面置换算法的模拟程序,采用的是LRU置换算法

[detail_of_44b0x_TCPIP.rar] - TCPIP 程序包加载到44b0x 的ADS1.2工程文件的说明书。说名了加载过程的细节和如何处理演示程序和代码。演示代码已经上传,大家可以搜索

[OperatingSystemPageReplacementAlgorithm.rar] - java *** 作系统页面置换算法: (1)郑租进先出的算法(fifo) (2)最近最少使用的算法(LRU) (3)最佳淘汰算法(OPT) (4)最少访问页面算法(LFU) (注:由本人改成改进型Clock算法)晌纤 (5)最近最不经常使用算法(NUR)

    

    分别使用FIFO、OPT、LRU三种置换算法来模拟页面置换的过程。(Linux、Windows下皆可)

    输入:  3  //页帧数带裂皮

7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1  //待处理的页

输出:页面置换过程中各帧的变化过程和出现页错误的次数

[cpp]

#include<iostream>  

using namespace std 

int input[20]= {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1} 

class page 

public: 

    int num 

    int mark 

    page() 

    { 

        num=0 

        mark=21 

    } 

void FIFO() 

    cout<<"------FIFO-----------"<<endl 

    int error=0 

    page frame[3]//页帧  

    for(int i=0i<3i++)//处理前三个引用  

    { 

        frame[i].num=input[i] 

        error++ 

        cout<<frame[i].num<<" | " 

        for(int j=0j<=ij++) 

            cout<<frame[j].num<<' ' 

        cout<<endl 

    } 

    for(int i=3i<20i++) 

    { 

        int j 

        for(j=0j<3j++) 

            if(input[i]==frame[j].num) 

            { 

                cout<<input[i]<<endl 

                break 

            } 

        if(j==3) 

        { 

            error++ 

            frame[((error-1)%3)].num=input[i]//换掉最旧的页  

            cout<<input[i]<<" | " 

            for(int k=0k<3k++) 

                cout<<frame[k].num<<' ' 

            cout<<endl 

        } 

    } 

    cout<<"Frame Error:"<<error<<endl<<endl 

void OPT() 

    cout<<"------OPT------------"<<endl 

    int error=0 

    page frame[3] 

    for(int i=0i<3i++)//处理前三个引用  

    { 

        frame[i].num=input[i] 

        error++ 

        cout<<frame[i].num<<" | " 

        for(int j=0j<=ij++) 

            cout<<frame[j].num<<' ' 

        cout<<endl 

    } 

    for(int i=3i<20i++) 

    { 

        int j 

        for(j=0j<3j++) 

            if(input[i]==frame[j].num) 

            { 

                cout<<input[i]<<endl 

                break 

            } 

        if(j==3) 

        { 

            error++ 

            for(j=0j<3j++) 

            { 

                frame[j].mark=21 

                for(int k=20k>=ik--)//向后遍历,找到最长时间不用的页  

                { 

                    if(frame[j].num==input[k]) 

                        frame[j].mark=k 

                } 

            } 

            if(frame[0].mark>frame[1].mark&&frame[0].mark>frame[2].mark) 

                frame[0].num=input[i] 

            else if(frame[1].mark>frame[0].mark&&frame[1].mark>frame[2].mark) 

                frame[1].num=input[i] 

            else 

                frame[2].num=input[i] 

            cout<<input[i]<<" | " 

            for(int k=0k<3k++) 

                cout<<frame[k].num<<' ' 

            cout<<endl 

        } 

    } 

    cout<<"Frame Error:"<<error<<endl<<endl 

void LRU() 

    cout<<"------LRU------------"<<endl 

    int error=0 

    page frame[3] 

    for(int i=0i<3i++)//处理前三个引用  

    { 

        frame[i].num=input[i] 

        error++ 

        cout<<frame[i].num<<" | " 

        for(int j=0j<=ij++) 

            cout<<frame[j].num<<' ' 

        cout<<endl 

    } 

    for(int i=3i<20i++) 

    { 

        int j 

        for(j=0j<3j++) 

            if(input[i]==frame[j].num) 

            { 

                cout<<input[i]<<endl 

                break 

            } 

        if(j==3) 

        源缓{ 

            error++ 

            for(j=0j<3j++) 

            { 

                frame[j].mark=0 

                for(int k=0k<=ik++)//向前遍历,找到最近最少使用的  

                { 

                    if(frame[j].num==input[k]) 

                        frame[j].mark=k 

                } 

            } 蠢差

            if(frame[0].mark<frame[1].mark&&frame[0].mark<frame[2].mark) 

                frame[0].num=input[i] 

            else if(frame[1].mark<frame[0].mark&&frame[1].mark<frame[2].mark) 

                frame[1].num=input[i] 

            else 

                frame[2].num=input[i] 

            cout<<input[i]<<" | " 

            for(int k=0k<3k++) 

                cout<<frame[k].num<<' ' 

            cout<<endl 

        } 

    } 

    cout<<"Frame Error:"<<error<<endl<<endl 

int main() 

    FIFO() 

    OPT() 

    LRU() 

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8225234.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存