?? 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 + -