虛擬分頁儲存管理

2021-08-19 19:52:10 字數 3211 閱讀 8762

#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...