⑴ 虛擬存儲器採用的頁面調度演算法是「先進先出」(FIFO)演算法嗎
虛擬存儲器採用的頁面調度演算法是「先進先出」(FIFO)演算法嗎。常見的替換演算法有4種。
①隨機演算法:用軟體或硬體隨機數產生器確定替換的頁面。
②先進先出:先調入主存的頁面先替換。
③近期最少使用演算法(LRU,Least Recently Used):替換最長時間不用的頁面。
④最優演算法:替換最長時間以後才使用的頁面。這是理想化的演算法,只能作為衡量其他各種演算法優劣的標准。
虛擬存儲器的效率是系統性能評價的重要內容,它與主存容量、頁面大小、命中率,程序局部性和替換演算法等因素有關。
(1)fifo演算法增加頁面擴展閱讀
虛擬存儲器地址變換基本上有3種形虛擬存儲器工作過程式:全聯想變換、直接變換和組聯想變換。任何邏輯空間頁面能夠變換到物理空間任何頁面位置的方式稱為全聯想變換。每個邏輯空間頁面只能變換到物理空間一個特定頁面的方式稱為直接變換。
組聯想變換是指各組之間是直接變換,而組內各頁間則是全聯想變換。替換規則用來確定替換主存中哪一部分,以便騰空部分主存,存放來自輔存要調入的那部分內容。
在段式虛擬存儲系統中,虛擬地址由段號和段內地址組成,虛擬地址到實存地址的變換通過段表來實現。每個程序設置一個段表,段表的每一個表項對應一個段,每個表項至少包括三個欄位:有效位(指明該段是否已經調入主存)、段起址(該段在實存中的首地址)和段長(記錄該段的實際長度)。
⑵ FIFO演算法(假定開始時先把1,2,3,4號頁面裝入內存)
FIFO:
頁 4 1 2 5 1 2 3 4 5
內存423 413 412 512 no no 532 534 no
LRU:
頁 4 1 2 5 1 2 3 4 5
內存423 413 412 512 no no 312 342 345
樓主 看一下這個
(缺頁發生 也就是 需要進行 交換 初始 裝入內存的 三個頁 是不發生缺頁的 所以 從4開始)
上面是 裝入的 頁面 下面是 裝入後 內存的狀態 (no代表不缺頁)
我 也是才看過 三級的教程 大概算了一下
FIFO 是 先進 先出 , 也就是的 每次 總是 不 最早進來的 換出去 和 頁面值 無關(此演算法是基於內存塊的 順序, 最長未更新的內存塊 , 先更新, 明白這意思吧, 可以對照 前面的數據看下)
LRU 是 更新 最長為使用的 頁面, 也就是 這個演算法 是 根據頁面值來 交換的
也就是 新裝入的 頁面值 如果 在內存快裡面 有 就會更新這個 頁面的 某個標記狀態(標記 其多久未使用, 其實就是個 變數, 很容易實現)
顯然 一直到5 都是和FIFO演算法 是一樣的 ,
為什麼呢, 因為 前幾頁 都是 缺頁的 並沒有 改變 標記變數, 所以 就 按照 先裝入,則 距今未使用時間最長,則 先交換的原則啦
開始需要 1(5後面那個) 那麼 內存 目前狀態時 512 , 1是在內存中的 不發生缺頁,】
所以 更新 標記變數(標明 1剛被使用過)
然後 需要 2 內存中依然 存在 則 更新 2的 標記變數, 則 現在內存中 任然是 512 但是 標記變數已經變了 2最新, 1次之 , 5最久 (最久未使用) 所以下次 交換 就先 換 5
內存 變為 321 現在 3最新, 2次之, 1最久 下次缺頁 就 換 1
思路 就是 這樣。
⑶ 請問操作系統fifo演算法,當分配的頁面數增加時,缺頁中斷次數可能不變嗎謝謝。
你肯定是遼東學院的
⑷ 一個程序的頁面走向,FIFO和LRU頁面置換演算法
FIFO(先進先出頁面置換演算法):
1 2 3 4 1 2 5 1 2 3 4 5
————————————
1 1 1 1 1 1 2 3 4 5 1 2
2 2 2 2 2 3 4 5 1 2 3
3 3 3 3 4 5 1 2 3 4
4 4 4 5 1 2 3 4 5
X X X X X X X X X X
共10次缺頁中斷
LRU(最近最少使用頁面置換演算法):
1 2 3 4 1 2 5 1 2 3 4 5
————————————
1 1 1 1 2 3 4 4 4 5 1 2
2 2 2 3 4 1 2 5 1 2 3
3 3 4 1 2 5 1 2 3 4
4 1 2 5 1 2 3 4 5
X X X X X X X X
共八次缺頁中斷
⑸ 頁式管理的請求頁式管理中的置換演算法
功能:需要調入頁面時,選擇內存中哪個物理頁面被置換。稱為replacement policy。
出發點:把未來不再使用的或短期內較少使用的頁面調出,通常只能在局部性原理指導下依據過去的統計數據進行預測。
頁面鎖定(frame locking):用於描述必須常駐內存的操作系統的關鍵部分或時間關鍵(time-critical)的應用進程。實現方法為在頁表中加上鎖定標志位(lock bit)。 輪轉法(RR,round robin)和先進先出演算法(FIFO,first in first out):輪轉法循回換出內存可用區內一個可以被換出的頁,無論該頁是剛被換進或已換進內存很長時間。FIFO演算法總是選擇在內存駐留時間最長的一員將其淘汰。
FIFO演算法認為先調入內存的頁不再被訪問的可能性要比其它頁大,因而選擇最先調入內存的頁換出。實現FIFO演算法需要把各個已分配頁面按分配時間順序鏈接起來,組成FIFO隊列,並設置一置換指針指向FIFO隊列的隊首頁面。這樣,當要進行置換時,只需把置換指針所指的FIFO隊列前頭的頁順次換出,而把換入的頁鏈接在FIFO隊尾即可。
由實驗和測試發現FIPO演算法和RR演算法的內存利用率不高。這是因為,這兩種演算法都是基於CPU按線性順序訪問地址空間這一假設。事實上,許多時候.CPU不是按線性順序訪問地址空間的。
Belady現象:一般來說,對於任一作業或進程,如果給它分配的內存頁面數越接近於它所要求的頁面數,則發生缺頁的次數會越少。在極限情況下,這個推論是成立的。因為如果給一個進程分配了它所要求的全部頁面,則不會發生缺頁現象。但是,使用FIFO演算法時,在未給進程或作業分配足它所要求的頁面數時,有時會出現分配的頁面數增多,缺頁次數反而增加的奇怪現象。這種現象稱為Belady現象。 最近最久未使用頁面置換演算法(LRU, Least Recently Used):
選擇內存中最久未使用的頁面被置換。這是局部性原理的合理近似,性能接近最佳演算法。但由於需要記錄頁面使用時間的先後關系,硬體開銷太大。硬體機構如:
(1) 一個特殊的棧:把被訪問的頁面移到棧頂,於是棧底的是最久未使用頁面。
(2) 每個頁面設立移位寄存器:被訪問時左邊最高位置1,定期右移並且最高位補0,於是寄存器數值最小的是最久未使用頁面。
比較常用的近似演算法有:
(a) 最不經常使用頁面淘汰演算法(LFU, Least Frequently Used)
(b) 最近沒有使用頁面淘汰(NRU, Not Recently Used) 理想型淘汰演算法(OPT,Optimal Replacement Algorithm)
該演算法淘汰在訪問串中將來再也不出現的或是離當前最遠的位置上出現的頁。它是一種理想化的演算法,性能最好,但在實際上難於實現。
⑹ 內存FIFO、LRU頁面置換演算法的設計
完整代碼已發到你的郵箱了,請注意查收。記得一定要加分哦!!!!
⑺ fifo演算法是什麼
FIFO(First Input First Output),即先進先出隊列。
FIFO是隊列機制中最簡單的,每個介面上都存在FIFO隊列,FIFO演算法維護一個先進先出隊列,隊列長度為分配給這個進程的頁面數M。開始時隊列是空的,裝入進程的第一頁即可啟動運行,當訪問到某個不在內存的頁面時,把它從輔存調入,加入FIFO隊列的尾部。
fifo演算法的特點
FIFO演算法的優點是簡單,一個很嚴重的缺點是在有的情況下,給進程的頁面數M增加時,同樣的頁面序列P,缺頁率反而增加,這稱為FIFO異常。有興趣的話,不妨自己構造這種例子。當某個頁面剛被淘汰又要調入時容易產生這種現象。可以構造出無限多個例子。
⑻ 在請求分頁存儲管理中,若採用FIFO頁面淘汰演算法,則當可供分配的頁楨樹增加時,缺頁中斷次數怎樣麻
理論上是減少的,但如果是FIFO演算法
在分頁式虛擬存儲器管理中,發生缺頁時的置換演算法採用FIFO(先進先出)演算法時,如果對一個進程未分配它所要求的全部頁面,有時就會出現分配的頁面數增多但缺頁率反而提高的異常現象。稱為belady現象。
答案是可能增加也可能減少
⑼ FIFO演算法的解釋
/*我知道FIFO演算法的原理,可還是不理解這代碼,哪位高手指教下各個程序段的意思啊?不勝感激! */
#include <stdio.h>
#include <stdlib.h>
#define mSIZE 3//分配三個內存頁框
#define pSIZE 12//總共12個進程
static int memery[mSIZE] = {0};
static int process[pSIZE] = {1,2,3,4,1,2,5,1,2,3,4,5};//頁面訪問序列
void FIFO();
int main()
{
get();
printf("\n(FIFO)\tcount\n");
FIFO();
system("PAUSE");
return 0;
}
get()
{
int w[12]={1,2,3,4,1,2,5,1,2,3,4,5}; //需要訪問的資源序列
int i,n;
for(i=0;i<12;i++) //輸出序列
{
printf("%d ",w[i]);
}
}
void FIFO()
{
int time[mSIZE] = {0}; //分配的三個頁框初始化為0
int i = 0, j = 0;
int m = -1, n = -1;
int max = -1,maxtime = 0;
int count = 0;
for(i = 0; i<pSIZE; i++) //開始循環,在頁框中尋找所需資源
{
for(j=0; j<mSIZE; j++) //判斷頁框中是否滿
{
if(memery[j] == 0) //尋找空頁框,並且記錄頁號
{
m = j;
break;
}
}
for(j = 0; j < mSIZE; j++)
{
if(memery[j] == process[i]) //判斷頁框中是否有進程所需訪問的資源
{
n = j;
}
}
for(j = 0; j < mSIZE;j++) //記錄在頁框中存放最長時間的資源,即第一個進入的資源
{
if(time[j]>maxtime)
{
maxtime = time[j]; //將存放最長時間資源的計數器的值賦給maxtime
max = j;
}
}
if(n == -1) //由於沒有在頁框中找到所需資源,並且也表已滿,發生缺頁中斷。
{
if(m != -1)
{
memery[m] = process[i]; //沒有替換的資源,則它對應的計數器加一
time[m] = 0;
for(j = 0;j <= m; j++)
{
time[j]++;
}
m = -1;
}
else
{
memery[max] = process[i]; //發生缺頁中斷,從前面的標記中尋找第一個進入頁表的資源替換
time[max] = 0; //替換後原來的最長則清0,
for(j = 0;j < mSIZE; j++)
{
time[j]++; //替換後,此資源對應的計數器加一
}
max = -1;
maxtime = 0;
count++;
}
}
else
{
memery[n] = process[i];
for(j = 0;j < mSIZE; j++) //一次分配對所有在頁表中的資源的計數器加一
{
time[j]++;
}
n = -1;
}
for(j = 0 ;j < mSIZE; j++)
{
printf("%d ",memery[j]); //輸出此次資源訪問時頁表中資源的情況。
}
printf("\t%d\n",count);
}
}