1. 程式人生 > >設計一個程序,有一個虛擬存儲區和內存工作區,實現下述三種算法中的任意兩種,計算訪問命中率(命中率=1-頁面失效次數/頁地址流長度)。附加要求:能夠顯示頁面置換過程。算法包括:先進先出的算法(FIFO)、最少使用算法(LFU)、最近未使用算法(NUR)

設計一個程序,有一個虛擬存儲區和內存工作區,實現下述三種算法中的任意兩種,計算訪問命中率(命中率=1-頁面失效次數/頁地址流長度)。附加要求:能夠顯示頁面置換過程。算法包括:先進先出的算法(FIFO)、最少使用算法(LFU)、最近未使用算法(NUR)

== oat 程序 表示 隊列 ini ++ 等待 進程

第一部分。。。

#include <cstdlib>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define bsize 4 //物理塊大小
#define psize 16 //進程大小
typedef struct page
{
int num; /*記錄頁面號*/
int time; /*記錄調入內存時間*/
}Page; /* 頁面邏輯結構,結構為方便算法實現設計*/
Page b[bsize]; /*內存單元數*/
int c[bsize][psize]; /*暫保存內存當前的狀態:緩沖區*/
int queue[100]; /*記錄調入隊列*/
int K; /*調入隊列計數變量*/
int phb[bsize]={0}; //物理塊標號
int pro[psize]={0}; //進程序列號
int flag[bsize] = {0}; //進程等待次數(存放最久未被使用的進程標誌)
int i = 0, j = 0,k = 0; //i表示進程序列號,j表示物理塊號
int m = -1, n = -1; //物理塊空閑和進程是否相同判斷標誌
int max = -1,maxflag = 0; //標記替換物理塊進程下標
int count = 0; //統計頁面缺頁次數
//隨機產生序列號函數
int* build()
{
printf("隨機產生一個進程序列號為:\n");
int i = 0;
for(i=0; i<psize; i++)
{
pro[i] = 10*rand()/(RAND_MAX+1)+1;
printf("%d ",pro[i]);
}
printf("\n");
return(pro);
}
//查找空閑物理塊

int searchpb()
{
for(j=0; j<bsize; j++)
{
if(phb[j] == 0)
{
m = j;
return m;
break;
}
}
return -1;
}
//查找相同進程

int searchpro()
{
for(j = 0; j < bsize; j++)
{
if(phb[j] == pro[i])
{
n = j;
return j;
}
}
return -1;
}
//初始化內存
void empty()
{
for(i=0;i<bsize;i++)
phb[i]=0;
count=0; //計數器置零
}
//先進先出頁面置換算法
void FIFO()
{
for(i = 0; i<psize; i++)
{
m=searchpb();
n=searchpro();
//找flag值最大的
for(j = 0; j < bsize;j++)
{
if(flag[j]>maxflag)
{
maxflag = flag[j];
max = j;
}
}
if(n == -1) //不存在相同進程
{
if(m != -1) //存在空閑物理塊
{
phb[m] = pro[i]; //進程號填入該空閑物理塊
count++;
flag[m] = 0;
for(j = 0;j <= m; j++)
{
flag[j]++;
}
m = -1;
}
else //不存在空閑物理塊
{
phb[max] = pro[i];
flag[max] = 0;
for(j = 0;j < bsize; j++)
{
flag[j]++;
}
max = -1;
maxflag = 0;
count++;
}
}
else //存在相同的進程
{
phb[n] = pro[i];
for(j = 0;j < bsize; j++)
{
flag[j]++;
}
n = -1;
}
for(j = 0 ;j < bsize; j++)
{
printf("%d ",phb[j]);
}
printf("\n");
}
printf("缺頁次數為:%d\n",count);
printf("缺頁率為:%16.6f",(float)count/16);
printf("\n");
}
/*初始化內存單元、緩沖區*/
void Init(Page *b,int c[bsize][psize])
{
int i,j;
for(i=0;i<psize;i++)
{
b[i].num=-1;
b[i].time=psize-i-1;
}
for(i=0;i<bsize;i++)
for(j=0;j<psize;j++)
c[i][j]=-1;
}

設計一個程序,有一個虛擬存儲區和內存工作區,實現下述三種算法中的任意兩種,計算訪問命中率(命中率=1-頁面失效次數/頁地址流長度)。附加要求:能夠顯示頁面置換過程。算法包括:先進先出的算法(FIFO)、最少使用算法(LFU)、最近未使用算法(NUR)