📄 1.cpp
字号:
for(int w=0;w<ding;w++)
printf("%d ",p[w]);
}
void search_page(int i,int x,int lx)//求c值 求得物理块中与页中相同的值的距离
{
int j;//acc
for(j=lx;j<n;j++)
{
c[i]++;
if(p[i]==y[j])
{
break;
}
}
lx++;
}
void compare(int x)//求调出哪个物理块
{
int max=c[0],i,q=0;
for(i=1;i<m;i++)
{
if(max<c[i])
{
max=c[i];
q=i; //q是第几个块的值
printf("\n调出的物理块:%d",q+1);
}
}
p[q]=y[x];
printf("\n访问后物理块的内容\n");
for(i=0;i<m;i++)
printf("%d ",p[i]);
}
int opt() //算法执行主体
{
int i,j,t,z,l,sign;
l=m;
initial_phy(); //填满物理块
t=n-n2;
z=n2;
if(n2==n)
return 0;
for(j=0;j<t;j++) //判断是否命中
{ sign=0;
for(i=0;i<m;i++)
{
if(p[i]==y[z])
{
sign=1;
break;
}
}
if(sign)
{
printf("\n访问后物理块的内容\n");
for(i=0;i<m;i++)
printf("%d ",p[i]);
printf("命中\n");
hit++;
l++;
}
else
{
for(i=0;i<m;i++)
{
search_page(i,z,l); //求得物理块中与页中相同的值的距离c
}
l++;
compare(z); //比较物理块中c的值
for(i=0;i<m;i++) //比较完一次,c的值归零
c[i]=0;
}
z++;
}
return 1;
}
void hit_rate() //求命中率
{
float rate;
rate=float(hit)/float(n);
printf("\n命中率:%f\n",rate);
}
//页面置换算法之最佳置换算法
//--------------------------------------------------------------
//------------页面置换算法之先进先出置换算法---------------------
int m0,n0,n1,hit0=0;
int ding0=0;
int Y[D],Q[B];
int H;
void init0() //输入物理块,页的信息
{
int i;
printf("1.请输入物理块数:");
scanf("%d",&m0);
printf("2.请输入页数:");
scanf("%d",&n0);
printf("输入页号:\n");
for(i=0;i<n0;i++)
scanf("%d",&Y[i]);
}
int initial_phy0() //物理块的初始化,先将物理块装满
{
int i,q=0,sign0;
Q[0]=Y[0];
ding0++;
sign0=0;
n1=1;
for(i=1;i<m0;i++)
{
for(int t=0;t<i;t++) //判断将要装入的物理块是否与物理块中的内容相同
{
if(Q[t]==Y[n1])
{
sign0=1;
break;
}
}
printf("\n物理块内容:\n");
for(int j=0;j<i;j++) //显示当前物理块内容
{
printf("%d ",Q[j]);
}
if(sign0)
{
printf("\n页");
printf("%d",i+1);
printf("命中\n");
hit0++;
i--;
n1++;
H=1;
}
else //判断与已存在物理块内容不同,进行装入
{
Q[i]=Y[n1];
ding0++;
n1++;
}
sign0=0;
}
printf("\n物理块内容:\n");
for(int w=0;w<ding0;w++)
printf("%d ",Q[w]);
printf("\n");
return sign0;
}
//---------主体部分---------
void Fifo()
{
int i,l;
l=m0;
int sign=initial_phy0(); //填满物理块
i=m0;
if(H==1)
{
sign=0;
i=i+1;
}
for(i;i<n0;i++)
{
for(int j=0;j<l;j++)
{
if(Y[i]==Q[j])
{
printf("页");
printf("%d ",i+1);
printf("命中\n");
hit0++;
sign=1;
}
}
if(sign==0)
{
Q[0]=Y[i];
printf("页");
printf("%d",i+1);
printf("没有命中,替换后的结果为:\n");
for(int k=0;k<m0;k++)
{
printf("%d ",Q[k]);
}
printf("\n");
int a=Q[0];
for(int q=1;q<m0;q++)
{
Q[q-1]=Q[q];
}
Q[m0-1]=a;
}
sign=0;
}
}
//--------------命中率计算------------------
void hit_rate0()
{
float rate;
rate=float(hit0)/float(n0);
printf("命中率:%f\n",rate);
}
//////////////////////////////////////////////////////////////////
//------------------页面置换算法之最近最少使用算法-----------------
const int m1=3;
const int P1=12;
int n3,hit1=0;
int process[P1];
void init1() //输入物理块,页的信息
{
int i;
printf("1.请输入物理块数:");
printf("%d",m1);
printf("\n2.请输入页数:\n");
scanf("%d",&n3);
printf("输入页号:\n");
for(i=0;i<n3;i++)
scanf("%d",&process[i]);
}
typedef struct
{
int data[m1];
int top;
}stack;
stack *init2()
{
stack *s;
s=new stack;
if(!s)
{
printf("空间不足!\n");
return NULL;
}
else
{
s->top=-1;
return s;
}
}
void push(stack *s,int x)
{
s->top++;
s->data[s->top]=x;
}
void pop(stack *s,int y)
{
y=s->data[0];
for(int i=1;i<=s->top;i++)
s->data[i-1]=s->data[i];
s->top--;
}
//栈操作
void lru(stack *s)
{
int n=0;
int i,j;
int a,b=0;
for(i=0;i<n3;i++)
{
if(s->top==-1)
{
push(s,process[i]);
n++;
}
else
{
for(j=0;j<=s->top;j++)
{
if(process[i]==s->data[j])
{
a=s->data[j];
for(int i=j+1;i<=s->top;i++)
{
s->data[j]=s->data[j+1];
j++;
}
s->data[s->top]=a;
break;
}
}
if(j>s->top)
{
if(s->top<m1-1)
{
push(s,process[i]);
n++;
}
else
{
pop(s,b);
push(s,process[i]);
n++;
}
}
}
for(int b=0;b<=s->top;b++)
printf("%d ",s->data[b]);
printf("\n");
}
printf("LRU的缺页次数是");
printf("%d",n);
printf("\nLRU的缺页中断率是");
float rate;
rate=float(n)/float(n3);
printf("%f\n",rate);
}
///////////////////////////////////////////////////////////////////////
void main()
{
int i;
int choice,choice1;
printf("\n");
printf("-----------------------存储器分区分配演示算法-----------------\n");
printf("-----------------------05网络一班--杨青--毕业设计---------------\n");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
InitBlock(); //初始化空闲块
for(i = 0;;i++)
{
printf("\n请选择操作:\n");
printf("\t1.可变分区管理方式 ");
printf("2.页面置换算法 ");
printf("0.退出\n");
scanf("%d",&choice1);
if(choice1==1)
{
printf("--------------------------------------\n");
printf("\t1.\t首次适应算法分配内存\n");
printf("\t2.\t最佳适应算法分配内存\n");
printf("\t3.\t回收存储区\n");
scanf("%d",&choice);
if(choice == 1) FirstAdapt();
else if(choice == 2) BestAdapt();
else if(choice == 3) Callback();
}
else if(choice1==2)
{
printf("--------------------------------------\n");
printf("\t1.\t最佳页面置换算法(OPT)\n");
printf("\t2.\t先进先出页面置换算法(FIFO)\n");
printf("\t3.\t最近最久未使用算法(LRU)\n");
scanf("%d",&choice);
if(choice ==1)
{
printf("******************************最佳置换算法*************************************\n");
init();//初始化
opt();
hit_rate();
}
else if(choice ==2)
{
printf("******************************首先置换算法*************************************\n");
init0();//初始化
Fifo();
hit_rate0();
}
else if(choice ==3)
{
init1();
stack *s;
s=init2();
printf("页面走向:\n");
for(int i=0;i<n1;i++)
printf("%d ",process[i]);
printf("\n");
printf("LRU置换过程如下:\n");
lru(s);
}
}
// printf("--------------------------------------\n");
/* printf("\t1.\t首次适应算法分配内存\n");
printf("\t2.\t最佳适应算法分配内存\n");
printf("\t3.\t回收存储区\n");
*/
/* printf("+++++++++++++++++++++++++++++++++++++++\n");
printf("\n页面置换算法||\n 请选择操作:\n");
printf("--------------------------------------\n");
printf("\t4.\t页面置换算法(OPT)\n");
printf("\t5.\t页面置换算法(FIFO)\n");
printf("\t6.\t页面置换算法(LRU)\n");
printf("+++++++++++++++++++++++++++++++++++++++\n");
printf("\t0.\t退出\n");
printf("---------------------------------------\n");
scanf("%d",&choice);
if(choice == 1) FirstAdapt();
else if(choice == 2) BestAdapt();
else if(choice == 3) Callback();
else if(choice ==4)
{
printf("******************************最佳置换算法*************************************\n");
init();//初始化
opt();
hit_rate();
}
else if(choice ==5)
{
printf("******************************首先置换算法*************************************\n");
init0();//初始化
Fifo();
hit_rate0();
}
else if(choice ==6)
{
init1();
stack *s;
s=init2();
printf("页面走向:\n");
for(int i=0;i<n1;i++)
printf("%d ",process[i]);
printf("\n");
printf("LRU置换过程如下:\n");
lru(s);
}
*/
else if(choice1 == 0)
{printf("系统尚有许多不足,请老师批评指正\n");break;}
else {printf("A wrong choice!\n");getchar();}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -