日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

虚拟存储器管理(C++实现)

發布時間:2025/3/20 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 虚拟存储器管理(C++实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算法思想:

  • 請求分頁虛擬存儲管理技術,是把作業地址空間的全部信息存放在磁盤上。當作業被選中運行時,先把作業的開始幾頁裝入主存,并啟動運行。為此,在為作業建立頁表時,應說明哪些頁已在主存,哪些頁不在主存。其中標志表示對應頁是否已經裝入主存。1表示對應頁已經裝入主存;0表示對應頁未裝入主存;主存塊號表示該頁對應的主存塊號;修改位指示該頁調入主存后是否修改過的標志;外存地址指示該頁所在的外存地址。
  • 作業執行時,指令中的邏輯地址指出參加運算的操作數(或指令)地址中的頁號和頁內偏移量。硬件地址轉換機構按頁號查頁表。若該頁的標志為1,則表示該頁已在主存,從而找到該頁對應的主存塊號。計算關系式,絕對地址等于塊號*塊的長度+頁內偏移量。計算出預訪問的主存地址。由于頁長為2的整次冪。所以只要將塊號和頁內偏移量相拼接。放入主存地址寄存器即可。按照該地址取指令或取操作數,完成指定的操作。
  • 設計一個地址變換程序,模擬硬件地址變換過程,當訪問的頁在主存時,則形成絕對地址后,不去模擬指令的執行,而是輸出被轉換的地址,當訪問的頁不在主存時,則輸出該頁不在主存,產生缺頁中斷,以表示產生了一次缺頁中斷。
  • 進行缺頁中斷處理,中斷返回后,重新執行該指令。假定主存的每塊長度為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++实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。