資源簡介
計算并輸出下述各種算法在不同內存容量下的命中率。
A. FIFO先進先出的算法
B. LRR最近最少使用算法
C. OPT最佳淘汰算法(先淘汰最不常用的頁地址)

代碼片段和文件信息
#include
#include
#include?
#include
struct?aa{//結構體?模擬內存區
??int?page;
??int?count;//被命中次數
??aa*?next;
??};
void?main()
{while(1){//為了驗證結果添加的循環?實驗去掉
?time_t?t;
?srand(unsigned(time(&t)));////用來設置隨機序列的第一個數,否則每次出來的序列都是一樣的
?int?injiimanswerffalsecountfangfatemp1minnnmm;
?double?sum;
?aa?*head*tail*temp*table*first*ti;
/*?nn=4;mm=1;
?for(nn=4;nn<32;nn++)
?{
??for(mm=1;mm<5;mm++)
??{*/
?cout<<“輸入物理塊數:“;
?cin>>m;??//產生存儲結構體的數量
?//m=nn;
?/**
?*** FIFO?先進先出
?*** LRR?最近最少使用算法
?*** OPT 最優淘汰算法
?*** LFR 最少訪問頁面算法
?*** NUR 最近沒有使用頁面先淘汰
?**/
?cout< ?cout<<“fangfa:??1-FIFO;2-LRR;3-OPT;4-LFR;5-NUR“< ?cout<<“Mothed:“;
?cin>>fangfa;
?//fangfa=mm;
?ffalse=0;
?answer=0;
?table=new(aa);//鏈表的表頭
?temp=table;
?table->page=-1;
?table->count=0;
?head=table;
?for(ii=2;ii<=m;ii++)
?{
????table=new(aa);//動態生成模擬內存區內的訪問區間
????table->page=-1;//初始化
????table->count=0;
????temp->next=table;//原鏈表(下句temp=table使得temp總指向鏈表的最后一個結構體)的最后一個結構體的指向此結構體??
????temp=table;//剛創建的新的結構體,也就是鏈表最后的結構體??
????if?(ii==m){table->next=NULL;}?//置空??
?}
?tail=table;//tail指向最后一個結構體???末尾
?temp=head;
?first=head;//head?temp?全都指向鏈表頭
?count=0;?//計算指令所在頁的根據
?i=0;
?while(i<320)
?{
min=400;
????if?(count==0)?{n=(rand()%320+1)%320;?j=n/10;}
if?(count==1)?{n=rand()%(n+1);j=n/10;}
if(count==2)?{j=((n+1)%320)/10;}
if(count==3)?{j=((rand()%(320-n-2))+n+2)/10;}
???table=head;
???temp=head;
???answer=0;//?標志位?命中的時候置1?
???min=400;
????if?(fangfa==5)
???{
while(table!=NULL)
{
if?(table->page==j)
{
answer=1;
table->count=2;
}
table=table->next;
}
if?(answer!=1)
{
table=head;
while?(table!=NULL)
{
if?(table->count {
temp=table;
min=table->count;
}
table=table->next;
}
if?(temp->page!=-1)?++ffalse;
temp->page=j;
temp->count=1;
}
table=head;
if?((i%32)==0)
{
while(table!=NULL)
{
if?(table->page!=-1)?table->count=1;
//?if?(table->page==j){answer=1;++(table->count);}
table=table->next;
}
}
???}//if?fangfa=5結束
???//思想:循環中最少被訪問者被替換
???if?((fangfa==4)||(fangfa==3))
???{
while(table!=NULL)
{
if?(table->page==j)//命中
{
answer=1;//更改標志位
++(table->count);//增加命中次數
}
table=table->next;
}//直接返回外循環
if(answer!=1)//此輪循環(外循環)中?所有結構體均未命中?替換
{??
table=head;//指向表頭
while?(table!=NULL)
{//遍歷鏈表
if?(table->count {
temp=table;
min=table->count;//循環所有的結構體之后?temp指向了整個鏈表中最少被訪問(命中)的結構體
}
table=table->next;
}
if?(temp->page!=-1)//不是第一次訪問
{
++ffalse;//增加未命中次數
temp->page=j;//temp指向為最少?替換掉最少的那個
table=head;//重新指向
while(table)
{
table->count=1;//全部鏈表訪問次數賦1?為下一循環做準備?否則被替換掉的永遠是這個位置(剛替換進來?count肯定最小)
table=table->next;
}
}
else{
temp->page=j;//第一次訪問?等于命中
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????5361??2011-06-28?20:08??test.cpp
-----------?---------??----------?-----??----
?????????????????5361????????????????????1
評論
共有 條評論