當前位置:首頁 » 操作系統 » 頁面置換演算法報告

頁面置換演算法報告

發布時間: 2022-05-09 15:08:35

⑴ 操作系統頁面置換演算法

先進先出FIFO:(0代表未被佔用)
(1)1,0,0,0(2)1,2,0,0(3)1,2,3,0(4)1,2,3,4(5)1,2,3,4訪問2(6)1,2,3,4訪問1(7)5,2,3,4訪問5替換1(8)5,6,3,4訪問6替換2(9)5,6,2,4訪問2替換3(10)5,6,2,1訪問1替換4(11)5,6,2,1訪問2(12)3,6,2,1訪問3替換5(13)3,7,2,1訪問7替換6(14)3,7,6,1訪問6替換2(15)3,7,6,1訪問3(16)3,7,6,2訪問2替換1(16)1,7,6,2訪問1替換3(17)1,7,6,2訪問2(18)1,3,6,2訪問3替換7(20)1,3,6,2訪問6
缺頁率為:14/20=0.7

最近最久未使用LRU:(0代表未被佔用)
(1)1,0,0,0(2)1,2,0,0(3)1,2,3,0(4)1,2,3,4(5)1,2,3,4訪問2(6)1,2,3,4訪問1(7)1,2,5,4訪問5替換3(8)1,2,5,6訪問6替換4(9)1,2,5,6訪問2(10)1,2,5,6訪問1(11)1,2,5,6訪問2(12)1,2,3,6訪問3替換5(13)1,2,3,7訪問7替換6(14)6,2,3,7訪問6替換1(15)6,2,3,7訪問3(16)6,2,3,7訪問2(17)6,2,3,1訪問1替換7(18)6,2,3,1訪問2(19)6,2,3,1訪問3(20)6,2,3,1訪問6
缺頁率為:10/20=0.5

最佳置換演算法OPT:(0代表未被佔用)
(1)1,0,0,0(2)1,2,0,0(3)1,2,3,0(4)1,2,3,4(5)1,2,3,4訪問2(6)1,2,3,4訪問1(7)1,2,3,5訪問5替換4(8)1,2,3,6訪問6替換5(9)1,2,3,6訪問2(10)1,2,3,6訪問1(11)1,2,3,6訪問2(12)1,2,3,6訪問3(13)7,2,3,6訪問7替換1(14)7,2,3,6訪問6(15)7,2,3,6訪問3(16)7,2,3,6訪問2(17)1,2,3,6訪問1替換7(18)1,2,3,6訪問2(19)1,2,3,6訪問3(20)1,2,3,6訪問6
缺頁率為:8/20=0.4

⑵ 頁面置換演算法的常見的置換演算法

最簡單的頁面置換演算法是先入先出(FIFO)法。這種演算法的實質是,總是選擇在主存中停留時間最長(即最老)的一頁置換,即先進入內存的頁,先退出內存。理由是:最早調入內存的頁,其不再被使用的可能性比剛調入內存的可能性大。建立一個FIFO隊列,收容所有在內存中的頁。被置換頁面總是在隊列頭上進行。當一個頁面被放入內存時,就把它插在隊尾上。
這種演算法只是在按線性順序訪問地址空間 時才是理想的,否則效率不高。因為那些常被訪問的頁,往往在主存中也停留得最久,結果它們因變「老」而不得不被置換出去。
FIFO的另一個缺點是,它有一種異常現象,即在增加存儲塊的情況下,反而使缺頁中斷率增加了。當然,導致這種異常現象的頁面走向實際上是很少見的。
FIFO演算法和OPT演算法之間的主要差別是,FIFO演算法利用頁面進入內存後的時間長短作為置換依據,而OPT演算法的依據是將來使用頁面的時間。如果以最近的過去作為不久將來的近似,那麼就可以把過去最長一段時間里不曾被使用的頁面置換掉。它的實質是,當需要置換一頁時,選擇在之前一段時間里最久沒有使用過的頁面予以置換。這種演算法就稱為最久未使用演算法(Least Recently Used,LRU)。
LRU演算法是與每個頁面最後使用的時間有關的。當必須置換一個頁面時,LRU演算法選擇過去一段時間里最久未被使用的頁面。
LRU演算法是經常採用的頁面置換演算法,並被認為是相當好的,但是存在如何實現它的問題。LRU演算法需要實際硬體的支持。其問題是怎麼確定最後使用時間的順序,對此有兩種可行的辦法:
1.計數器。最簡單的情況是使每個頁表項對應一個使用時間欄位,並給CPU增加一個邏輯時鍾或計數器。每次存儲訪問,該時鍾都加1。每當訪問一個頁面時,時鍾寄存器的內容就被復制到相應頁表項的使用時間欄位中。這樣我們就可以始終保留著每個頁面最後訪問的「時間」。在置換頁面時,選擇該時間值最小的頁面。這樣做, 不僅要查頁表,而且當頁表改變時(因CPU調度)要 維護這個頁表中的時間,還要考慮到時鍾值溢出的問題。
2.棧。用一個棧保留頁號。每當訪問一個頁面時,就把它從棧中取出放在棧頂上。這樣一來,棧頂總是放有目前使用最多的頁,而棧底放著目前最少使用的頁。由於要從棧的中間移走一項,所以要用具有頭尾指針的雙向鏈連起來。在最壞的情況下,移走一頁並把它放在棧頂上需要改動6個指針。每次修改都要有開銷,但需要置換哪個頁面卻可直接得到,用不著查找,因為尾指針指向棧底,其中有被置換頁。
因實現LRU演算法必須有大量硬體支持,還需要一定的軟體開銷。所以實際實現的都是一種簡單有效的LRU近似演算法。
一種LRU近似演算法是最近未使用演算法(Not Recently Used,NUR)。它在存儲分塊表的每一表項中增加一個引用位,操作系統定期地將它們置為0。當某一頁被訪問時,由硬體將該位置1。過一段時間後,通過檢查這些位可以確定哪些頁使用過,哪些頁自上次置0後還未使用過。就可把該位是0的頁淘汰出去,因為在之前最近一段時間里它未被訪問過。
4)Clock置換演算法(LRU演算法的近似實現)
5)最少使用(LFU)置換演算法
在採用最少使用置換演算法時,應為在內存中的每個頁面設置一個移位寄存器,用來記錄該頁面被訪問的頻率。該置換演算法選擇在之前時期使用最少的頁面作為淘汰頁。由於存儲器具有較高的訪問速度,例如100 ns,在1 ms時間內可能對某頁面連續訪 問成千上萬次,因此,通常不能直接利用計數器來記錄某頁被訪問的次數,而是採用移位寄存器方式。每次訪問某頁時,便將該移位寄存器的最高位置1,再每隔一定時間(例如100 ns)右移一次。這樣,在最近一段時間使用最少的頁面將是∑Ri最小的頁。
LFU置換演算法的頁面訪問圖與LRU置換演算法的訪問圖完全相同;或者說,利用這樣一套硬體既可實現LRU演算法,又可實現LFU演算法。應該指出,LFU演算法並不能真正反映出頁面的使用情況,因為在每一時間間隔內,只是用寄存器的一位來記錄頁的使用情況,因此,訪問一次和訪問10 000次是等效的。
6)工作集演算法
7)工作集時鍾演算法
8)老化演算法(非常類似LRU的有效演算法)
9)NRU(最近未使用)演算法
10)第二次機會演算法
第二次機會演算法的基本思想是與FIFO相同的,但是有所改進,避免把經常使用的頁面置換出去。當選擇置換頁面時,檢查它的訪問位。如果是 0,就淘汰這頁;如果訪問位是1,就給它第二次機會,並選擇下一個FIFO頁面。當一個頁面得到第二次機會時,它的訪問位就清為0,它的到達時間就置為當前時間。如果該頁在此期間被訪問過,則訪問位置1。這樣給了第二次機會的頁面將不被淘汰,直至所有其他頁面被淘汰過(或者也給了第二次機會)。因此,如果一個頁面經常使用,它的訪問位總保持為1,它就從來不會被淘汰出去。
第二次機會演算法可視為一個環形隊列。用一個指針指示哪一頁是下面要淘汰的。當需要一個 存儲塊時,指針就前進,直至找到訪問位是0的頁。隨著指針的前進,把訪問位就清為0。在最壞的情況下,所有的訪問位都是1,指針要通過整個隊列一周,每個頁都給第二次機會。這時就退化成FIFO演算法了。

⑶ 操作系統 實現請求分頁系統中頁面置換演算法

用鏈表實現,當頁面命中時就把頁面提到列表最前面,未命中時把頁面插入到列表最前面並移除鏈表最後一個節點。
#include"stdlib.h"
#include"stdio.h"
#defineSEC_NUM4//cachesize
#definePAGE_NUM12//pagenumber

typedefstructNode{
charpage;
structNode*next;
}Node;
typedefstructNode*linkList;

//showcurrentstatusofcache
voidshow(Node*cache){
Node*tmp=cache;
inti;
printf("Cachestatus:");
for(i=0;i<SEC_NUM;i++){
printf("%c",tmp->page);
tmp=tmp->next;
}
printf(" ");
}

//
Node*isIncluded(Node*head,charpage){
Node*tmp=head,*flag=NULL;
inti;
for(i=0;i<SEC_NUM;i++){
if(tmp->next->page==page)
flag=tmp;
tmp=tmp->next;
}
returnflag;
}

intmain()
{
inti=0,index=-1;
charpages[]={'4','3','2','1','4','3','5','4','3','2','1','5'};
Node*head,*cache,*tmp,*tmp2;
intmiss_num=0;
floatmiss_ratio=0;
//initializethelist
if((head=(linkList)malloc(sizeof(Node)))==NULL){
printf("Cannotallocatememory.");
return1;
}
head->page='0';
head->next=NULL;
cache=head;

//assignvaluestocache
for(i=0;i<SEC_NUM;i++){
if((tmp=((linkList)malloc(sizeof(Node))))==NULL){
printf("Cannotallocatememory.");
return1;
}
cache->next=tmp;
tmp->page='0';
tmp->next=NULL;
cache=tmp;
}
show(head->next);
for(i=0;i<PAGE_NUM;i++){
//thepageisalreadyincache
//movethepagetothefirstposition(rightafterhead)
if((tmp=isIncluded(head,pages[i]))!=NULL){
tmp2=head->next;
head->next=tmp->next;
tmp->next=tmp->next->next;
head->next->next=tmp2;
}
//thepageisnotincache
//,andremovethelastnode
else{
miss_num++;
tmp2=head->next;
if((head->next=(linkList)malloc(sizeof(Node)))==NULL){
printf("Cannotallocatememory.");
return1;
}
head->next->page=pages[i];
head->next->next=tmp2;
head->next->next->next->next->next=NULL;//assignNULLtothe*nextofthefourthnod(removethelastnode)
}
show(head->next);
}
miss_ratio=(float)miss_num/PAGE_NUM;
printf("Numberofmissesis%d,andmissratiois%f ",miss_num,miss_ratio);
return0;
}

⑷ lru頁面置換演算法是什麼

用雙向鏈表和哈希表來實現。

LRU演算法的提出,是基於這樣一個事實:在前面幾條指令中使用頻繁的頁面很可能在後面的幾條指令中頻繁使用。

反過來說,已經很久沒有使用的頁面很可能在未來較長的一段時間內不會被用到。這個,就是著名的局部性原理——比內存速度還要快的cache,也是基於同樣的原理運行的。因此,只需要在每次調換時,找到最近最少使用的那個頁面調出內存。這就是LRU演算法的全部內容。

一種LRU近似演算法是最近未使用演算法。

它在存儲分塊表的每一表項中增加一個引用位,操作系統定期地將它們置為0。當某一頁被訪問時,由硬體將該位置1。過一段時間後,通過檢查這些位可以確定哪些頁使用過,哪些頁自上次置0後還未使用過。就可把該位是0的頁淘汰出去,因為在之前最近一段時間里它未被訪問過。

以上內容參考:網路-頁面置換演算法

⑸ 先進先出頁面置換演算法的實現過程

假定系統為某進程分配了三個物理塊,並考慮有以下頁面號引用串:7, 0, 1, 2, 0, 3, 0,4,2,3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1。釆用FIFO演算法進行頁面置換,進程訪問頁面2時,把最早進入內存的頁面7換出。然後訪問頁面3時,再把2, 0, 1中最先進入內存的頁換出。由下圖可以看出,利用FIFO演算法時進行了12次頁面置換。 訪問頁面70120304230321201701物理塊1777222444000777物理塊200033322211100物理塊31110003332221缺頁否√√√√√√√√√√√√√√√

⑹ 頁面置換演算法的實驗

#include <stdio.h>
#define PROCESS_NAME_LEN 32 /*進程名稱的最大長度*/
#define MIN_SLICE 10 /*最小碎片的大小*/
#define DEFAULT_MEM_SIZE 1024 /*默認內存的大小*/
#define DEFAULT_MEM_START 0 /*默認內存的起始位置*/

/* 內存分配演算法 */
#define MA_FF 1
#define MA_BF 2
#define MA_WF 3

int mem_size=DEFAULT_MEM_SIZE; /*內存大小*/
int ma_algorithm = MA_FF; /*當前分配演算法*/
static int pid = 0; /*初始pid*/
int flag = 0; /*設置內存大小標志*/

struct free_block_type
{
int size;
int start_addr;
struct free_block_type *next;
};
struct free_block_type *free_block;

struct allocated_block
{
int pid;
int size;
int start_addr;
char process_name[PROCESS_NAME_LEN];
struct allocated_block *next;
};
struct allocated_block *allocated_block_head;

/*初始化空閑塊,默認為一塊,可以指定大小及起始地址*/
struct free_block_type* init_free_block(int mem_size)
{

struct free_block_type *fb;

fb=(struct free_block_type *)malloc(sizeof(struct free_block_type));
if(fb==NULL)
{
printf("No mem\n");
return NULL;
}
fb->size = mem_size;
fb->start_addr = DEFAULT_MEM_START;
fb->next = NULL;
return fb;
}

void display_menu()
{
printf("\n");
printf("1 - Set memory size (default=%d)\n", DEFAULT_MEM_SIZE);
printf("2 - Select memory allocation algorithm\n");
printf("3 - New process \n");
printf("4 - Terminate a process \n");
printf("5 - Display memory usage \n");
printf("0 - Exit\n");
}

/*設置內存的大小*/
int set_mem_size()
{
int size;
if(flag!=0)
{ /*防止重復設置*/
printf("Cannot set memory size again\n");
return 0;
}
printf("Total memory size =");
scanf("%d", &size);
if(size>0)
{
mem_size = size;
free_block->size = mem_size;
}
flag=1;
return 1;
}
/*Best-fit使用最小的能夠放下將要存放數據的塊,First-first使用第一個能夠放下將要存放數據的塊,Worst-fit使用最大的能夠放下將要存放數據的塊。*/
/* 設置當前的分配演算法 */
/*分區分配演算法(Partitioning Placement Algorithm)
*/
void set_algorithm()
{
int algorithm;
printf("\t1 - First Fit\n");/*首次適應演算法(FF):。 */
printf("\t2 - Best Fit\n");/*最佳適應演算法(BF): */

printf("\t3 - Worst Fit\n");
scanf("%d", &algorithm);
if(algorithm>=1 && algorithm <=3) ma_algorithm=algorithm;
/*按指定演算法重新排列空閑區鏈表*/
rearrange(ma_algorithm);
}

void swap(int* data_1,int* data_2)
{
int temp;
temp=*data_1;
*data_1=*data_2;
*data_2=temp;
}

void rearrange_FF()
{
struct free_block_type *tmp, *work;
printf("Rearrange free blocks for FF \n");
tmp = free_block;
while(tmp!=NULL)
{
work = tmp->next;
while(work!=NULL)
{
if( work->start_addr < tmp->start_addr)
{ /*地址遞增*/
swap(&work->start_addr, &tmp->start_addr);
swap(&work->size, &tmp->size);
}
else
{
work=work->next;
}
}
tmp=tmp->next;
}
}
/*按BF演算法重新整理內存空閑塊鏈表(未完成)
void rearrange_BF()
{
struct free_block_type *tmp,*work;
printf("Rearrange free blocks for BF\n");
tmp=free_block;
while(tmp!=NULL)
{
work=tmp->next;
while(work!=NULL)
{

}
}

}

*/
/*按WF演算法重新整理內存空閑塊鏈表(未完成)
void rearrange_WF()
{
struct free_block_type *tmp,*work;
printf("Rearrange free blocks for WF \n");
tmp=free_block;
while(tmp!=NULL)
{
work=tmp->next;
while(work!=NULL)
{

}
}
}
*/

/*按指定的演算法整理內存空閑塊鏈表*/
int rearrange(int algorithm)
{
switch(algorithm)
{
case MA_FF: rearrange_FF(); break;
/*case MA_BF: rearrange_BF(); break; */
/*case MA_WF: rearrange_WF(); break; */
}
}

/*創建新的進程,主要是獲取內存的申請數量*/
int new_process()
{
struct allocated_block *ab;
int size;
int ret;
ab=(struct allocated_block *)malloc(sizeof(struct allocated_block));
if(!ab)
exit(-5);
ab->next = NULL;
pid++;
sprintf(ab->process_name, "PROCESS-%02d", pid);
ab->pid = pid;

printf("Memory for %s:", ab->process_name);
scanf("%d", &size);
if(size>0) ab->size=size;
ret = allocate_mem(ab); /* 從空閑區分配內存,ret==1表示分配ok*/
/*如果此時allocated_block_head尚未賦值,則賦值*/
if((ret==1) &&(allocated_block_head == NULL))
{
allocated_block_head=ab;
return 1;
}
/*分配成功,將該已分配塊的描述插入已分配鏈表*/
else if (ret==1)
{
ab->next=allocated_block_head;
allocated_block_head=ab;
return 2;
}
else if(ret==-1)
{ /*分配不成功*/
printf("Allocation fail\n");
free(ab);
return -1;
}
return 3;
}

/*分配內存模塊*/
int allocate_mem(struct allocated_block *ab)
{
struct free_block_type *fbt,*pre,*r;
int request_size=ab->size;
fbt=pre=free_block;
while(fbt!=NULL)
{
if(fbt->size>=request_size)
{
if(fbt->size-request_size>=MIN_SLICE)
{
fbt->size=fbt->size-request_size;
}
/*分配後空閑空間足夠大,則分割*/

else
{
r=fbt;
pre->next=fbt->next;
free(r);
/*分割後空閑區成為小碎片,一起分配*/

return 1;
}
}
pre = fbt;
fbt = fbt->next;
}

return -1;
}

/*將ab所表示的已分配區歸還,並進行可能的合並*/
int free_mem(struct allocated_block *ab)
{
int algorithm = ma_algorithm;
struct free_block_type *fbt, *pre, *work;

fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type));
if(!fbt)
return -1;
fbt->size = ab->size;
fbt->start_addr = ab->start_addr;
/*插入到空閑區鏈表的頭部並將空閑區按地址遞增的次序排列*/
fbt->next = free_block;
free_block=fbt;
rearrange(MA_FF);
fbt=free_block;
while(fbt!=NULL)
{
work = fbt->next;
if(work!=NULL)
{
/*如果當前空閑區與後面的空閑區相連,則合並*/
if(fbt->start_addr+fbt->size == work->start_addr)
{
fbt->size += work->size;
fbt->next = work->next;
free(work);
continue;
}
}
fbt = fbt->next;
}
rearrange(algorithm); /*重新按當前的演算法排列空閑區*/
return 1;
}

/*?釋放ab數據結構節點*/
int dispose(struct allocated_block *free_ab)
{
struct allocated_block *pre, *ab;

if(free_ab == allocated_block_head)
{ /*如果要釋放第一個節點*/
allocated_block_head = allocated_block_head->next;
free(free_ab);
return 1;
}
pre = allocated_block_head;
ab = allocated_block_head->next;

while(ab!=free_ab)
{
pre = ab;
ab = ab->next;
}
pre->next = ab->next;
free(ab);
return 2;
}
/*查找要刪除的進程*/
struct allocated_block* find_process(int pid)
{
struct allocated_block *temp;
temp=allocated_block_head;
while(temp!=NULL)
{
if(temp->pid==pid)
{
return temp;
}
temp=temp->next;
}
}

/*刪除進程,歸還分配的存儲空間,並刪除描述該進程內存分配的節點*/
void kill_process()
{
struct allocated_block *ab;
int pid;
printf("Kill Process, pid=");
scanf("%d", &pid);
ab=find_process(pid);
if(ab!=NULL)
{
free_mem(ab); /*釋放ab所表示的分配區*/
dispose(ab); /*釋放ab數據結構節點*/

}
}

/* 顯示當前內存的使用情況,包括空閑區的情況和已經分配的情況 */

int display_mem_usage()
{
struct free_block_type *fbt=free_block;
struct allocated_block *ab=allocated_block_head;
if(fbt==NULL) return(-1);
printf("----------------------------------------------------------\n");

/* 顯示空閑區 */
printf("Free Memory:\n");
printf("%20s %20s\n", " start_addr", " size");
while(fbt!=NULL)
{
printf("%20d %20d\n", fbt->start_addr, fbt->size);
fbt=fbt->next;
}
/* 顯示已分配區 */
printf("\nUsed Memory:\n");
printf("%10s %20s %10s %10s\n", "PID", "ProcessName", "start_addr", " size");
while(ab!=NULL)
{
printf("%10d %20s %10d %10d\n", ab->pid, ab->process_name, ab->start_addr, ab->size);
ab=ab->next;
}
printf("----------------------------------------------------------\n");
return 0;
}

**********************************************************************
樓主啊,小女子給你的是殘缺版滴,要是你給我分,我就把剩下滴給你,上次在北京大學貼吧都被人騙了,世道炎涼啊O(∩_∩)O~

⑺ 求一個操作系統頁面置換演算法先進先出的實驗報告

一選擇
1.B 2.c 3。 D 4B 5B
二填空
1,最優;先進先出;最近最久未使用
2. 13;15;
3. 123456721;123567421
4.段;段;頁;頁;三;二
三,問答
1.答:三個頁面的物理起始地址分別是:4k,6K,12K,
2500= 2K+452,所以在第二個邏輯頁面6K的起始地址,實際地址是6K+452;
2.LRU:裝入順序:2 3 1 5 4 3 2
換出順序: 3 1 2 4 缺頁次數7次
FIFO:裝入順序:2 3 1 5 2 4 3 5 2
換出順序: 2 3 1 5 2 4 缺頁次數9次
時鍾:裝入順序:2 3 1 5 2 4 3 2
換出順序: 2 3 1 2 4 缺頁次數8次
時鍾演算法性能處於中間,優於FiFo,差於LRU,但由於LRU演算法的硬體實現比較麻煩,所以時鍾演算法問兼顧了效率和硬體實現

⑻ 最佳頁面置換演算法的演算法描述

當產生缺頁中斷時,利用相應的淘汰頁面的演算法選擇需要淘汰的頁面。
頁面置換演算法在淘汰頁面時的演算法:
輸入:頁面號引用串P1,P2...Pn;
輸出:淘汰頁面Pt
實現:
1、如果頁框中的某個頁面P以後永不使用,則該頁面為淘汰頁面Pt。
2、如果每個P都會再次被訪問,那麼其中最長未來時間內不再被訪問的頁面為淘汰頁面Pt。

⑼ 頁面置換演算法的介紹

在地址映射過程中,若在頁面中發現所要訪問的頁面不在內存中,則產生缺頁中斷。當發生缺頁中斷時,如果操作系統內存中沒有空閑頁面,則操作系統必須在內存選擇一個頁面將其移出內存,以便為即將調入的頁面讓出空間。而用來選擇淘汰哪一頁的規則叫做頁面置換演算法。

熱點內容
android區域網視頻 發布:2024-10-08 18:35:29 瀏覽:691
java訪問私有變數 發布:2024-10-08 18:34:50 瀏覽:84
vivo鎖屏壁紙緩存在哪 發布:2024-10-08 18:34:49 瀏覽:535
insta360oner配多大的存儲卡 發布:2024-10-08 18:34:40 瀏覽:212
csgo和永劫無間哪個配置要求高 發布:2024-10-08 18:20:47 瀏覽:48
43資料庫 發布:2024-10-08 18:19:20 瀏覽:816
svn伺服器不能訪問 發布:2024-10-08 18:18:36 瀏覽:984
壓縮面膜多少錢 發布:2024-10-08 18:18:01 瀏覽:539
徐州少兒編程培訓機構 發布:2024-10-08 17:52:29 瀏覽:389
c語言常用函數大全 發布:2024-10-08 17:46:33 瀏覽:410