1實驗目的
通過對頁面、頁表、位址轉換和頁面置換過程的模擬,加深對請求調頁系統的原理和實現過程的理解。
2實驗內容
(1)假設每個頁面中可存放10條指令,分配給乙個作業的記憶體塊數為4。
(2)模擬乙個作業的執行過程。該作業共有320條指令,即它的位址空間為32頁,目前它的所有頁都還未調入記憶體。在模擬過程中,如果所訪問的指令已經在記憶體中,則顯示其實體地址,並轉下一條指令。如果所訪問的指令還未裝入記憶體,則發生缺頁,此時需記錄缺頁的次數,並將相應頁調入記憶體。如果4個記憶體塊中均已裝入該作業,則需進行頁面置換。最後顯示其實體地址,並轉下一條指令。在所有320條指令執行完畢後,請計算並顯示作業執行過程中發生的缺頁率。
(3)置換演算法:請分別考慮opt、fifo和lru演算法。
(4)作業中指令的訪問次序按下述原則生成:
•50%的指令是順序執行的。
•25%的指令是均勻分布在前位址部分。
•25%的指令時均勻分布在後位址部分。
3實驗結果(給出編寫的程式源**和執行結果的截圖)
import random
#共有4個記憶體塊,乙個記憶體塊存放乙個頁面,乙個頁面存放10條指令,共32個頁面,指令在頁面中順序存放
class block(object):
def __init__(self,numpage=-1,accessed=0):
self.numpage=numpage #頁號
self.accessed=accessed #訪問情況,數值表示多久未被訪問
size=4 #記憶體塊數目
count=0 #記錄指令的序號
n=0 #缺頁數目
block= #記憶體塊
zhilin=
def initdata(block):
for i in range(size):
a=block(numpage=-1,accessed=0)
def findpage(block,curpage): #查詢物理塊中是否有該頁面
for i in range(size):
if block[i].numpage==curpage:
return i
return -1
def findexchange(block): #查詢置換的頁號
pos=0
for i in range(size):
if block[i].accessed>block[pos].accessed:
pos=i
return pos
def display(block):
for i in range(size):
if block[i].numpage!=-1:
print block[i].numpage,
print
def randomcin(zhilin): #生成隨機指令序列
flag=0
count=raw_input()
count=int(count)
print ("生成隨機指令序列:")
for i in range(320):
if flag%2==0:
count=count+1
count=count%320
if flag==1:
count=random.randint(0,count-2)
if flag==3:
count=random.randint(count+1,319)
#count=count+1+random.randint(0,320-count-1)
flag=flag+1
flag=flag%4
print zhilin[i],
if (i+1)%10==0:
print
def findspace(block):
for i in range(size):
if block[i].numpage==-1:
return i
return -1
def pringpage(zhilin):
for i in range(320):
print zhilin[i]%10,
if i%10==0:
print
def fifo(block,n):
curpage=-1
exchange=-1
for i in range(320):
count=zhilin[i]
curpage=count/10
exsist=findpage(block,curpage)
if exsist==-1:
space=findspace(block)
if space==-1:
exchange=findexchange(block)
block[exchange].numpage=curpage
display(block)
n=n+1
block[exchange].accessed=-1
else:
block[space].numpage=curpage
display(block)
n=n+1
else:
for i in range(size):
if block[i].numpage != -1:
print block[i].numpage,
print "指令已在記憶體,頁號為",exsist
for j in range(size):
block[j].accessed+=1
print "缺頁次數為:",n
v=n/320.0*100
print "缺頁率為:",v,"%"
def lru(blcok,n):
curpage=-1
exchange=-1
for i in range(320):
count=zhilin[i]
curpage=count/10
exsist=findpage(block,curpage)
if exsist==-1:
space=findspace(block)
if space==-1:
exchange=findexchange(block)
block[exchange].numpage=curpage
display(block)
n=n+1
block[exchange].accessed=-1
else:
block[space].numpage=curpage
display(block)
n=n+1
else:
block[exsist].accessed=-1
for i in range(size):
if block[i].numpage != -1:
print block[i].numpage,
print "指令已在記憶體,頁號為", exsist
for j in range(size):
block[j].accessed += 1
print "缺頁次數為:", n
v = n / 320.0 * 100
print "缺頁率為:", v, "%"
def opt(block,n):
curpage=-1
exchange=-1
for i in range(320):
count=zhilin[i]
curpage=count/10
exsist=findpage(block,curpage)
if exsist==-1:
space=findspace(block)
if space==-1:
for h in range(size):
for k in range(i,320):
if block[h].numpage!=zhilin[k]/10:
block[h].accessed=1000
else:
block[h].accessed=k
break
exchange=findexchange(block)
block[exchange].numpage=curpage
display(block)
n=n+1
else:
block[space].numpage=curpage
display(block)
n=n+1
else:
for i in range(size):
if block[i].numpage != -1:
print block[i].numpage,
print "指令已在記憶體,頁號為", exsist
print "缺頁次數為:", n
v = n / 320.0 * 100
print "缺頁率為:", v, "%"
print "輸入第一條指令號:"
randomcin(zhilin)
initdata(block)
while 1:
print "輸入1執行fifo,輸入2執行lru,輸入3執行opt:"
a=raw_input()
a=int(a)
if a==1:
fifo(block, n)
elif a==2:
lru(block, n)
elif a==3:
opt(block,n)
請求調頁儲存管理方式的模擬
1 實驗目的 通過對頁面 頁表 位址轉換和頁面置換過程的模擬,加深對請求調頁系統 的原理和實現過程的理解。2 實驗內容 1 假設每個頁面中可存放 10 條指令,分配給一作業的記憶體塊數為 4。2 用 c 語言模擬一作業的執行過程。該作業共有 320 條指令,即它的位址空 間為 32 頁,目前它的所有...
請求分頁儲存管理方式
請求分頁系統是建立在基本分頁的基礎上的,為了能支援虛擬儲存器功能而增加了請求調頁功能和頁面置換功能。相應地,每次調入和換出的基本單位都是長度固定的頁面,這使得請求分頁系統在實現上要比請求分段系統簡單 請求分段系統在換進和 換出時是 可變長度的段 因此,請求分頁便成為目前最常用的一種實現虛擬儲存器的方...
4 6分段儲存管理方式 段頁式儲存管理方式
1.分段 3.段表與位址變換機構 段是連續存放在記憶體中。段表中針對每個 段編號 記錄 記憶體首位址 和 段長 同樣有兩次記憶體訪問問題 解決方法 設定聯想暫存器,用於儲存最近常用的段表項。位址變換機構 4.分頁和分段的主要區別 1 需求 分頁是出於系統管理的需要,是一種資訊的物理劃分單位,分段是出...