#define true 1
#define false 0
#define invalid -1
#define null 0
#define total_instruction 320 /*指令流長*/
#define total_vp 32 /*虛頁長*/
#define clear_period 50 /*清0週期*/
typedef struct /*頁面結構*/
pl_type;
pl_type pl[total_vp]; /*頁面結構陣列*/
struct pfc_struct;
typedef struct pfc_struct pfc_type;
pfc_type pfc[total_vp],*freepf_head,*busypf_head,*busypf_tail;
int diseffect, a[total_instruction];
int page[total_instruction],offset[total_instruction];
int initialize(int);
int fifo(int);
int lru(int);
int lfu(int);
int nur(int);
int opt(int);
int main( )
a[i]=s; /*任選一指令訪問點m*/
a[i+1]=a[i]+1; /*順序執行一條指令*/
a[i+2]=(float)a[i]*rand( )/32767/32767/2; /*執行前位址指令m' */
a[i+3]=a[i+2]+1; /*順序執行一條指令*/
s=(float)(318-a[i+2])*rand( )/32767/32767/2+a[i+2]+2;
if((a[i+2]>318)||(s>319))
printf("a[%d+2],a number which is :%d and s==%d\n",i,a[i+2],s);
}for (i=0;inext;
pl[busypf_head->pn].pfn=invalid;
freepf_head=busypf_head; /*釋放忙頁面佇列的第乙個頁面*/
freepf_head->next=null;
busypf_head=p;
}p=freepf_head->next; /*按fif方式調新頁面入記憶體頁面*/
freepf_head->next=null;
freepf_head->pn=page[i];
pl[page[i]].pfn=freepf_head->pfn;
if(busypf_tail==null)
busypf_head=busypf_tail=freepf_head;
else
freepf_head=p;}}
printf("fifo:%6.4f\n",1-(float)diseffect/320);
return 0;
}int lru (total_pf) /*最近最久未使用演算法*/
int total_pf;
}freepf_head=&pfc[pl[minj].pfn]; //騰出乙個單元
pl[minj].pfn=invalid;
pl[minj].time=-1;
freepf_head->next=null;
}pl[page[i]].pfn=freepf_head->pfn; //有空閒頁面,改為有效
pl[page[i]].time=present_time;
freepf_head=freepf_head->next; //減少乙個free頁面
}else
pl[page[i]].time=present_time; //命中則增加該單元的訪問次數
present_time++;
}printf("lru:%6.4f\n",1-(float)diseffect/320);
return 0;
}int nur(total_pf) /*最近未使用演算法*/
int total_pf;
pl[page[i]].pfn=freepf_head->pfn;
freepf_head=freepf_head->next;
}else
pl[page[i]].counter=1;
if(i%clear_period==0)
for(j=0;jnext=null;
pl[maxpage].pfn=invalid;
}pl[page[i]].pfn=freepf_head->pfn;
freepf_head=freepf_head->next;}}
printf("opt:%6.4f\n",1-(float)diseffect/320);
return 0;
}int lfu(total_pf) /*最不經常使用置換法*/
int total_pf;
pl[j].counter=0;
}freepf_head=&pfc[pl[minpage].pfn];
pl[minpage].pfn=invalid;
freepf_head->next=null;
}pl[page[i]].pfn=freepf_head->pfn; //有空閒頁面,改為有效
pl[page[i]].counter++;
freepf_head=freepf_head->next; //減少乙個free頁面
}else
pl[page[i]].counter++;
}printf("lfu:%6.4f\n",1-(float)diseffect/320);
return 0;
}
儲存器管理 分頁儲存
比較連續分配方式 離散分配記憶體 分頁方式下,記憶體的使用率高,浪費少。但不是絕對沒有碎片 程序的最後一頁不總是能佔滿乙個物理塊 記憶體劃分成多個小單元,每個單元k大小,稱 物理 塊。作業也按k單位大小劃分成片,稱為頁面。物理劃分塊的大小 邏輯劃分的頁的大小 頁面大小要適中。頁號到物理塊號的位址對映...
分頁儲存管理和分段儲存管理
1.採用相聯儲存器後位址轉換過程,用圖表示出來。答 2.詳述分段管理和分頁管理的區別。答 分段是資訊的邏輯單位,有源程式的邏輯結構及含義所決定,是使用者可見的,段長由使用者根據需要來確定,段起始位址可從任何記憶體位址開始。在分段方式中,源程式 段號 段內位移 經鏈結裝配後仍保持二維 位址 結構,引入...
分頁儲存管理和分段儲存管理
1.採用相聯儲存器後位址轉換過程,用圖表示出來 2.詳述分段管理和分頁管理的區別。分頁管理 分頁儲存管理是將乙個程序的邏輯位址空間分成若干個大小相等的片,稱為頁面或頁,並為各頁加以編號,從0開始,如第0頁 第1頁等。相應地,也把記憶體空間分成與頁面相同大小的若干個儲存塊,稱為 物理 塊或頁框 fra...