在本實驗中,引用串的長度為
100000
個,生成方法為按照給定的指令跳轉率隨即生成,指令跳轉率由呼叫函式給出。由於指令的跳轉率對最終的各種替換演算法的缺頁率有明顯的影響,所以,在實驗中,我用一組不同的跳轉率來測試在不同指令跳轉條件下不同演算法的缺頁率。
另外,實驗中使用的記憶體的頁面數為
10,虛擬儲存器中的頁面總是為
100。
以下是程式中定義的一些資料結構和函式原形:
#define stream_len 100000
#define max_page_no 100
#define work_pages 10
typedef enum rep;
void best_rep(int *stream, int pos, int *memory);
void fifo_rep(int *stream, int pos, int *memory);
void lru_rep(int *stream, int pos, int *memory);
void clock_rep(int *stream, int pos, int *memory);
void rand_rep(int *stream, int pos, int *memory);
各種替換演算法如課本中所述,再次不再重複。
page_stream.cpp
#include
#include
#include
#include "page_stream.h"
void generatestream(int stream, int stream_len, double jumprate, int maxpageno, int workpages)
return;
}int getstartpage(int range)
double genrate()
int gensubstr(int stream, int startposition, int startpage)
return startposition + i;
}replace_fun.cpp
#include
#include
#include
#include "replace_fun.h"
bool in_mem(int page, int *memory)
}return false;
}void replacepage(int *stream, int *memory, rep rep, int pos)
}static int lruaid[work_pages] = ;
void updatelru(int *memory, int page)
for (i = 0; i < work_pages; i++)
}return;
}static int clockaid[work_pages] = ;
void updateclock(int *memory, int page)
}return;
}double run(int *stream, int *memory, rep rep)
else if (rep == clock_rep)
pos++;
continue;
}else
}return ((double)replacetimes)/stream_len;
}bool check(int *memtemp, int check_page, int replace_page, int *memory)
if (memtemp[i] == check_page)
}if (k == work_pages-1)
memory[i] = replace_page;
return true;
}return false;
}void best_rep(int *stream, int pos, int *memory)
int postemp = pos + 1;
bool hasreplaced = false;
while (postemp != stream_len)
if (!hasreplaced)
memory[i] = stream[pos];
}return;
}void fifo_rep(int *stream, int pos, int *memory)
void lru_rep(int *stream, int pos, int *memory)
}memory[k] = stream[pos];
lruaid[k] = 0;
return;
}static int clockpointer = 0;
void clock_rep(int *stream, int pos, int *memory)
else if (clockaid[clockpointer] == 0)
}memory[clockpointer] = stream[pos];
return;
}void rand_rep(int *stream, int pos, int *memory)
main.cpp
#include
#include
#include "page_stream.h"
#include "main.h"
#include "replace_fun.h"
main()
else
} while (i < work_pages);
printf("指令跳轉率為%f時:/n/n", jumprate);
printf("最佳替換演算法缺頁率:/n");
printf("%f/n", run(stream, memory, best_rep));
printf("隨機替換演算法缺頁率:/n");
printf("%f/n", run(stream, memory, rand_rep));
printf("先進先出替換演算法缺頁率:/n");
printf("%f/n", run(stream, memory, fifo_rep));
printf("最近最久未使用替換演算法缺頁率:/n");
printf("%f/n", run(stream, memory, lru_rep));
printf("clock替換演算法缺頁率:/n");
printf("%f/n", run(stream, memory, clock_rep));
return 0;
}
問三 頁面置換演算法有哪些?
概述 在程式執行過程中,如果要訪問的頁面不在記憶體中,就發生缺頁中斷從而將該頁調入記憶體中。此時如果記憶體已無空閒空間,系統必須從記憶體中調出乙個頁面到磁碟對換區中來騰出空間。頁面置換演算法和快取淘汰策略類似,可以將記憶體看成磁碟的快取。在快取系統中,快取的大小有限,當有新的快取到達時,需要淘汰一部...
作業系統實驗3 頁面置換演算法模擬程式
目的 熟悉頁面置換演算法及其實現,引入計算機系統效能評價方法的概念。內容 編制頁面置換演算法的模擬程式。要求 用隨機數方法產生頁面走向,頁面走向長度為l。根據頁面走向,分別採用fifo和lru演算法進行頁面置換,統計缺頁率。假定可用記憶體塊和頁表長度 作業的頁面數 分別為m和k,初始時,作業頁面都不...
作業系統實驗四 頁面置換演算法 實驗報告
設計和實現最佳置換演算法 先進先出置換演算法 最近最久未使用置換演算法 頁面緩衝置換演算法 通過頁面訪問序列隨機發生器實現對上述演算法的測試及效能比較。1 請求分頁虛擬記憶體管理 請求分頁虛擬記憶體管理是建立在基本分頁基礎上的,為了能支援虛擬儲存器功能,而增加了請求調頁功能和置換功能。2 工作集 多...