虚拟存储器管理(C++实现)
生活随笔
收集整理的這篇文章主要介紹了
虚拟存储器管理(C++实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
算法思想:
進行缺頁中斷處理,中斷返回后,重新執行該指令。假定主存的每塊長度為64個字節,現有一個具有8頁的作業系統,為其分配的4個主存塊(即m=4),且最多分四塊。其中第0頁至第3頁已經裝入主存。
(4)當采用LRU算法時。則淘汰最近很少訪問的頁。
代碼:
#include<iostream> #include<vector> #include<list> #include<string> using namespace std;typedef struct pageTable{int pageNumber;int sign=0;int mainStorageBlockNumber;int modifiedBit=0;int externalAddress; }pageTable;typedef struct instructionTable{string operation;int pageNumber;int unitNumber; }instructionTable;void initPageTable(vector<pageTable>&p){int pageNumber[]={0,1,2,3,4,5,6,7};int sign[]={1,1,1,1,0,0,0,0};int mainStorageBlockNumber[]={5,8,9,10,-1,-1,-1,-1};int modifiedBit[]={1,1,0,0,-1,-1,-1,-1};int externalAddress[]={11,12,13,15,17,025,212,213};pageTable s;for(int i=0;i<8;i++){s.pageNumber=pageNumber[i];s.sign=sign[i];s.mainStorageBlockNumber=mainStorageBlockNumber[i];s.modifiedBit=modifiedBit[i];s.externalAddress=externalAddress[i];p.push_back(s);} }void initInstructionTable(vector<instructionTable>&p){string operation[]={"+","+","*","存","取","-","移位","+","存","取","+","取"};int pageNumber[]={0,1,2,3,0,6,4,5,1,7,4,6};int unitNumber[]={40,50,16,22,54,40,52,22,34,56,2,76};instructionTable s;for(int i=0;i<12;i++){s.operation=operation[i];s.pageNumber=pageNumber[i];s.unitNumber=unitNumber[i];p.push_back(s);} }void printPageTable(vector<pageTable>p){cout<<"頁表中的內容如下:"<<endl;cout<<"頁號\t"<<"標志\t"<<"主存塊號\t"<<"外存地址\t"<<"修改位"<<endl;for(vector<pageTable>::iterator it=p.begin();it!=p.end();it++){cout<<it->pageNumber<<"\t"<<it->sign<<"\t"<<it->mainStorageBlockNumber<<"\t\t"<<it->externalAddress<<"\t\t"<<it->modifiedBit<<endl;} }void printInstructionTable(vector<instructionTable>p){cout<<"指令表的內容如下:"<<endl;cout<<"操作\t"<<"頁號\t"<<"單元號"<<endl;for(vector<instructionTable>::iterator it=p.begin();it!=p.end();it++)cout<<it->operation<<"\t"<<it->pageNumber<<"\t"<<it->unitNumber<<endl;cout<<endl; }void addressTranform(vector<pageTable>&p,vector<instructionTable>&q){int absoluteAddress;vector<int>l;bool flag;for(vector<instructionTable>::iterator it=q.begin();it!=q.end();it++){cout<<"當前指令:"<<endl;cout<<"操作\t"<<"頁號\t"<<"單元號"<<endl;cout<<it->operation<<"\t"<<it->pageNumber<<"\t"<<it->unitNumber<<endl;vector<pageTable>::iterator it2;for(it2=p.begin();it2!=p.end();it2++)if(it->pageNumber==it2->pageNumber)break;if(it2->sign==1){absoluteAddress=it2->mainStorageBlockNumber*64+it->unitNumber;cout<<"絕對地址:"<<absoluteAddress<<endl;if(it->operation=="存")it2->modifiedBit=1;flag=true;for(vector<int>::iterator it3=l.begin();it3!=l.end();it3++)if(it->pageNumber==*it3){l.erase(it3);l.insert(l.begin(),it->pageNumber);flag=false;break;}if(flag){if(l.size()<4)l.insert(l.begin(),it->pageNumber);else{l.pop_back();l.insert(l.begin(),it->pageNumber);}}}else{cout<<"該頁不在主存,產生缺頁中斷"<<endl;int t=l.back();l.pop_back();l.insert(l.begin(),it->pageNumber);vector<pageTable>::iterator i;for(i=p.begin();i!=p.end();i++)if(i->pageNumber==t){i->sign=0;i->modifiedBit=-1;it2->sign=1;it2->mainStorageBlockNumber=i->mainStorageBlockNumber;i->mainStorageBlockNumber=-1;break;}absoluteAddress=it2->mainStorageBlockNumber*64+it->unitNumber;cout<<"絕對地址:"<<absoluteAddress<<endl;}printPageTable(p);cout<<"棧中的序列:";for(vector<int>::iterator i=l.begin();i!=l.end();i++)cout<<*i<<"";cout<<endl<<endl<<endl;} }int main(){vector<pageTable>p;vector<instructionTable>q;cout<<"初始化頁表和指令表:"<<endl;initPageTable(p);printPageTable(p);initInstructionTable(q);printInstructionTable(q); addressTranform(p,q);getchar();getchar();return 0; }結果:
?
總結
以上是生活随笔為你收集整理的虚拟存储器管理(C++实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用银行家算法避免死锁(C++实现)
- 下一篇: RHEL7配置本地yum源