虚拟存储器实验报告Word下载.docx
《虚拟存储器实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《虚拟存储器实验报告Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
![虚拟存储器实验报告Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/3/31a0d970-d38d-4a03-b904-2263647f07db/31a0d970-d38d-4a03-b904-2263647f07db1.gif)
时,可把作业的开始几页先装入主存且启动执行。
为此,在为作业建立页
其中,标志----用来表示对应页是否已经装入主存,标志位=1,则表示该
页已经在主存,标志位=0,则表示该页尚未装入主存。
主存块号----用来表示已经装入主存的页所占的块号。
在磁盘上的位置----用来指出作业副本的每一页被存放在磁盘上的位置。
(2)作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元
号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式:
绝对地址=块号×
块长+单元号
计算出欲访问的主存单元地址。
如果块长为2的幂次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。
若访
问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,有操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。
(3)设计一个“地址转换”程序来模拟硬件的地址转换工作。
当访问的页在主
存时,则形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。
当访问的页不在主存时,则输出“*该页页号”,表示产生了一次缺页中断。
该模拟程序的算法如图2-1。
(4)假定主存的每块长度为128个字节;
现有一个共七页的作业,其中第0页至第3页已经装入主存,其余三页尚未装入主存;
该作业的页表为:
如果作业依次执行的指令序列为:
(4)运行设计的地址转换程序,显示或打印运行结果。
因仅模拟地址转换,并
不模拟指令的执行,故可不考虑上述指令序列中的操作。
五、运行代码
#include
#include"
list"
usingnamespacestd;
#defineN11
#defineM12
#defineMEMORYBLOK10
#defineLENGTH128
structpage{
intnumber;
intflag;
intframe;
intlocation;
intchange;
};
structaction{
charoperate;
intpageNum;
intoffset;
structpagepageTable[N];
listactionForm;
voidinit(){
pagep第一文库网age0={0,0,5,11,0};
pageTable[0]=page0;
pagepage1={1,1,8,12,0};
pageTable[1]=page1;
pagepage2={2,1,9,13,0};
pageTable[2]=page2;
pagepage3={3,1,1,21,0};
pageTable[3]=page3;
pagepage4={4,0,-1,22,0};
pageTable[4]=page4;
pagepage5={5,0,-1,23,0};
pageTable[5]=page5;
pagepage6={6,0,-1,121,0};
pageTable[6]=page6;
//
pageTable[7]=page6;
pageTable[8]=page6;
pageTable[9]=page6;
pageTable[10]=page6;
//对的初始化
/*for(inti=0;
i
Q[i]=-1;
}
for(i=0;
P[i]=-1;
i
if(pageTable[i].flag==1){
P[K]=i;
K=(K+1)%MEMORYBLOK;
if(pageTable[i].flag==1){
intframe=pageTable[i].frame;
Q[frame]=pageTable[i].number;
}*/
actiona1={'
+'
1,70};
actiona2={'
1,50};
actiona3={'
*'
2,15};
actiona4={'
s'
3,21};
actiona5={'
g'
0,56};
actiona6={'
-'
6,40};
actiona7={'
y'
4.53};
actiona8={'
5,23};
actiona9={'
1,37};
actiona10={'
2,78};
actiona11={'
4,1};
actiona12={'
6,84};
actionForm.push_back(a1);
actionForm.push_back(a2);
actionForm.push_back(a3);
actionForm.push_back(a4);
actionForm.push_back(a5);
actionForm.push_back(a6);
actionForm.push_back(a7);
actionForm.push_back(a8);
actionForm.push_back(a9);
actionForm.push_back(a10);
actionForm.push_back(a11);
actionForm.push_back(a12);
voidrun(){
while(!
actionForm.empty()){
actiona=actionForm.front();
cout
if(a.operate=='
)
elseif(a.operate=='
else
intpageNum=a.pageNum;
//如果不在主存中
if(pageTable[pageNum].flag==0){
//计算绝对地址
else{
intresult;
result=pageTable[pageNum].frame*LENGTH+a.offset;
"
pageTable[pageNum].change=1;
actionForm.pop_front();
main(){
init();
run();
return0;
六、运行结果
七、实验总结
有了上一次的实验,我对c++6.0这一软件已经有了而初步的认识,在本次上机前我对实验进行了玉溪,对实验的原理和实验的设计也有了初步的了解,在具体的实验操作过程中,主要考验的是细心和耐心,一旦某个细节忽略了就很容易出现错误,造成大量时间的浪费,所以在做一些细节步骤的时候一定要细心和耐心。
最后是验证,通过验证我们可以对许多理论知识有新的理解。
实践是检验真理的标准,四节课的时间让我虚拟存储器以及它的功能有了深刻的了解,对书本上的知识有了更深刻的认识,也学到了课本上学不到的知识。
内容仅供参考