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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

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

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

算法思想:

  • 請(qǐng)求分頁(yè)虛擬存儲(chǔ)管理技術(shù),是把作業(yè)地址空間的全部信息存放在磁盤上。當(dāng)作業(yè)被選中運(yùn)行時(shí),先把作業(yè)的開(kāi)始幾頁(yè)裝入主存,并啟動(dòng)運(yùn)行。為此,在為作業(yè)建立頁(yè)表時(shí),應(yīng)說(shuō)明哪些頁(yè)已在主存,哪些頁(yè)不在主存。其中標(biāo)志表示對(duì)應(yīng)頁(yè)是否已經(jīng)裝入主存。1表示對(duì)應(yīng)頁(yè)已經(jīng)裝入主存;0表示對(duì)應(yīng)頁(yè)未裝入主存;主存塊號(hào)表示該頁(yè)對(duì)應(yīng)的主存塊號(hào);修改位指示該頁(yè)調(diào)入主存后是否修改過(guò)的標(biāo)志;外存地址指示該頁(yè)所在的外存地址。
  • 作業(yè)執(zhí)行時(shí),指令中的邏輯地址指出參加運(yùn)算的操作數(shù)(或指令)地址中的頁(yè)號(hào)和頁(yè)內(nèi)偏移量。硬件地址轉(zhuǎn)換機(jī)構(gòu)按頁(yè)號(hào)查頁(yè)表。若該頁(yè)的標(biāo)志為1,則表示該頁(yè)已在主存,從而找到該頁(yè)對(duì)應(yīng)的主存塊號(hào)。計(jì)算關(guān)系式,絕對(duì)地址等于塊號(hào)*塊的長(zhǎng)度+頁(yè)內(nèi)偏移量。計(jì)算出預(yù)訪問(wèn)的主存地址。由于頁(yè)長(zhǎng)為2的整次冪。所以只要將塊號(hào)和頁(yè)內(nèi)偏移量相拼接。放入主存地址寄存器即可。按照該地址取指令或取操作數(shù),完成指定的操作。
  • 設(shè)計(jì)一個(gè)地址變換程序,模擬硬件地址變換過(guò)程,當(dāng)訪問(wèn)的頁(yè)在主存時(shí),則形成絕對(duì)地址后,不去模擬指令的執(zhí)行,而是輸出被轉(zhuǎn)換的地址,當(dāng)訪問(wèn)的頁(yè)不在主存時(shí),則輸出該頁(yè)不在主存,產(chǎn)生缺頁(yè)中斷,以表示產(chǎn)生了一次缺頁(yè)中斷。
  • 進(jìn)行缺頁(yè)中斷處理,中斷返回后,重新執(zhí)行該指令。假定主存的每塊長(zhǎng)度為64個(gè)字節(jié),現(xiàn)有一個(gè)具有8頁(yè)的作業(yè)系統(tǒng),為其分配的4個(gè)主存塊(即m=4),且最多分四塊。其中第0頁(yè)至第3頁(yè)已經(jīng)裝入主存。

    (4)當(dāng)采用LRU算法時(shí)。則淘汰最近很少訪問(wèn)的頁(yè)。

    代碼:

    #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<<"頁(yè)表中的內(nèi)容如下:"<<endl;cout<<"頁(yè)號(hào)\t"<<"標(biāo)志\t"<<"主存塊號(hào)\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<<"指令表的內(nèi)容如下:"<<endl;cout<<"操作\t"<<"頁(yè)號(hào)\t"<<"單元號(hào)"<<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<<"當(dāng)前指令:"<<endl;cout<<"操作\t"<<"頁(yè)號(hào)\t"<<"單元號(hào)"<<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<<"絕對(duì)地址:"<<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<<"該頁(yè)不在主存,產(chǎn)生缺頁(yè)中斷"<<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<<"絕對(duì)地址:"<<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<<"初始化頁(yè)表和指令表:"<<endl;initPageTable(p);printPageTable(p);initInstructionTable(q);printInstructionTable(q); addressTranform(p,q);getchar();getchar();return 0; }

    結(jié)果:

    ?

    總結(jié)

    以上是生活随笔為你收集整理的虚拟存储器管理(C++实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。