最佳置換算法(OPT)
什么是OPT
最佳置換算法,其所選擇的被淘汰的頁面將是以后永不使用的,或是在最長(未來)時間內(nèi)不再被訪問的頁面。采用最佳置換算法通常可保證最低的缺頁率。但是人們目前還無法與之,一個進程在內(nèi)存的若干個頁面中,哪一個頁面是未來最長時間內(nèi)不再被訪問的,因而該算法是無法實現(xiàn)的,但是可以利用該算法取評價其他的算法。
算法思想
舉例如下:
我們將頁面隊列存在一個Vector動態(tài)數(shù)組中。我們可以從圖中得知:當發(fā)生頁面置換時,就要尋找在未來最長時間內(nèi)不再被訪問的頁面,將其置換出去,比如當內(nèi)存中存在的頁面為 7、0、1,且要訪問頁面2時,此時我們要尋找頁面隊列中將要訪問到的頁面2以后的頁面隊列(0、3、0、4、2、3、0、3、2、1、2、0、1、7、0、1)中,頁面7、0、1哪個最久未被訪問到,即尋找頁面7、0、1在以后的隊列中第一次出現(xiàn)的這三個頁面的下標值最大的那一個。因為頁面7在后面的頁面隊列中再次被訪問到是數(shù)組中下標為17的地方,頁面0再次被訪問到是數(shù)組下標為4的地方,頁面1再次被訪問的是數(shù)組中下標為13,所以頁面7是未來最久才被訪問的頁面,所以將頁面7置換出去,將頁面2調(diào)入內(nèi)存中。
具體算法:
每個頁面都有兩個屬性,一個是頁面號id,一個是時間參數(shù)count(此屬性在LRU中才會用到)
//pageId 要調(diào)入內(nèi)存的頁面號
//currentPoint 記錄當前將要調(diào)入內(nèi)存中頁面所在頁面隊列中的下標號
void OPT::replace(int pageId, int currentPoint)
{
//cur為內(nèi)存塊下標,searchCounter紀錄是否內(nèi)存塊搜索完畢
//循環(huán)爆出最長為使用的頁面
int max = 0, perCount, outPageId = -1, cur = 0;
int search_count[PRO_MEMORY];
for (int i = 0; i < PRO_MEMORY; i++)
{
//比如,從頁面2后面的頁面開始掃描記錄頁面7、0、1再次被訪問的數(shù)組的下標號
for (int j = currentPoint + 1; j < length; j++)
{
if (pages_OPT[i].getId() == usePageNumList_OPT[j])
{
search_count[i] = j;
break;
}
}
if (search_count[i] == 0)
{
search_count[i] = length;
}
}
//以上面內(nèi)存中存在的是頁面7、0、1為例。尋找頁面7、0、1再次被訪問的下標號最大的 //哪個頁面
for (int k = 0; k < PRO_MEMORY; ++k)
{
perCount = search_count[k];
if (max < perCount)
{
max = perCount;
cur = k;
}
}
outPageId = pages_OPT[cur].getId();
pages_OPT[cur].setId(pageId);
cout << "頁號ID:" << pageId << "正在放入內(nèi)存,頁號ID:" << outPageId << "被替換出去" << endl;
ofs_OPT << "頁號ID:" << pageId << "正在放入內(nèi)存,頁號ID:" << outPageId << "被替換出去\n";
}