• 大小: 8KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-16
  • 语言: C/C++
  • 标签: 请求调页  

资源简介

假设每个页面中可存放10条指令,分配给作业的内存块数为4。 用C语言语言模拟一个作业的执行过程,该作业共有320条指令, 即它的地址空间为32页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需要记录缺页的次数,并将相应页调入内存。如果4个内存块均已装入该作业,则需要进行页面置换,最后显示其物理地址,并转向下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。 置换算法:请分别考虑最佳置换算法(OPT)、先进先出(FIFO)算法和最近最久未使用算法(LRU)。 作业中指令的访问次序按下述原则生成: 50%的指令是顺序执行的; 25%的指令是均匀分布在前地址部分; 25%的指令是均匀分布在后地址部分; 具体的实施方法是:    在[0,319]的指令地址之间随机选取一起点m;    顺序执行下一条指令,即执行地址序号为m+1的指令;    通过随机数,跳转到前地址部分[0,m+1]中的某条指令处,其序号为m1;    顺序执行下一条指令,其地址序号为m1+1的指令;    通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2;    顺序执行下一条指令,其地址序号为m2+1的指令; 重复跳转到前地址部分,顺序执行,跳转到后地址部分,顺序执行的过程直至执行320条指令。

资源截图

代码片段和文件信息

#include
#include
#define Bsize 4

typedef struct BLOCK        //定义物理块结构体
{
    int pageNum;            //页号
    int accessed_time;      //访问字段,其值表示多久未被访问

} 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 random();              //产生320条随机数显示并存储到temp[320]
void show_Q_Page();         //显示调用的页面队列
void OPT();                 //OPT算法
void LRU();                 //LRU算法
void FIFO();                //FIFO算法

void init()
{
    //初始化内存物理块数组,缺页次数和程序计数器
    for(int i = 0; i < Bsize; i++)
    {
        block[i].pageNum = -1;
        block[i].accessed_time = 0;
        pc = n = 0;
    }
}

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

    for(int i = 0; i < Bsize; i++)
    {
        //若检测到内存中有该页面,返回在block中的位置
        if(block[i].pageNum == curpage )
            return i;
    }
    return -1;              //若没有则返回-1.
}

int findSpace()
{
    //查找是否有空闲物理块
    for(int i = 0; i < Bsize; i++)
    {
        //若找到空闲的block,返回在block的位置
        if(block[i].pageNum == -1)
            return i;
    }
    return -1;              //否则返回-1.
}

int findReplace()
{
    //找到应予置换页面,即最近最久未使用的页面,返回其所在块的位置
    int pos = 0;
    for(int i = 0; i < Bsize; i++)
    {
        if(block[i].accessed_time > block[pos].accessed_time)
            pos = i;
    }
    return pos;
}

void random()
{
    //产生320条随机数显示并存储到temp[320]
    int flag = 0;
    scanf(“%d“ &pc);                //在[0,319]的指令地址之间随机选取一起点m
    printf(“         - - - - - - 产生的320条指令序列:- - - - -\n“);
    for(int i = 0; i < 320; i++)
    {
        temp[i] = pc;
        if(flag % 2 == 0) pc = ++pc % 320; //产生50%的顺序执行指令(flag=0或2时顺序执行)
        if(flag == 1) pc = rand() % (pc - 1); //产生25%的均匀分布在前地址部分指令
        if(flag == 3) pc = pc + 1 + (rand() % (320 - (pc + 1)));
        //产生25%的均匀分布在后地址部分指令
        flag = ++flag % 4;
        printf(“ %03d“ temp[i]);
        if((i + 1) % 15 == 0) printf(“\n“);
    }
}

void show_Q_Page()
{
    //显示随机数
    for(int i = 0; i < 320; i++)
    {
        printf(“ %03d“ temp[i] / 10);
        if((i + 1) % 15 == 0) printf(“\n“);
    }

}

void OPT()
{   
    int exist space position ;
    int curpage;
    int f = 0;
    printf(“访问页   物理地址\t缺页\t\t访问页   物理地址\t缺页“);
    for(int i = 0; i < 320; i++)
    {
        f++;
        if(f % 2 == 1)printf(“\n“);
        if(i % 100 == 0) getchar();
        pc = temp[i];
        curpage = pc / 10;
        printf(“%4d“ curpage);
        exist = findExist(curpage);//查找内存中是否有当前页面
        if(exist == -1)           //若没有
        {
            space = findSpace();           //在内存中查找是否有空闲块
            if(space != -1)        

评论

共有 条评论