操作系统——分页分段算法c++实现
生活随笔
收集整理的這篇文章主要介紹了
操作系统——分页分段算法c++实现
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
具體如下:有問(wèn)題請(qǐng)?zhí)岢鰜?lái)吧,希望能幫到大家
#include<stdio.h> #include<algorithm> #include<cstring> #include<iostream> #include <ctime> using namespace std; int pagesize=1024; int ybx,dbx,fd;//ybx頁(yè)表項(xiàng),dbx段表項(xiàng),fd分段判斷 int page[10],jz[10],dc[10],mw[10];//page塊號(hào),jz基址,dc段長(zhǎng),mw基址+段長(zhǎng) void pageinit(); void fdpageinit(); void randominit(int begin,int end,int size,int array[]); int randompage(int begin,int end); void show(); void showfd(); void fdjs(); void fyjs(); void menu();void pagechoose(){//分頁(yè)頁(yè)面大小選擇 cout<<"請(qǐng)輸入每頁(yè)大小:(0-1K;1-2K;2-4K;3-隨機(jī)選擇)"<<endl;int choose;cin>>choose;switch(choose){case 0:pagesize=1*1024;break;case 1:pagesize=2*1024;break;case 2:pagesize=4*1024;break;case 3:pagesize=randompage(0,2);break;default:;} }void pageinit(){//手動(dòng)輸入 for(int i=0;i<ybx;i++){cin>>page[i];//cout<<endl;for(int j=0;j<i;j++){if(page[i]==page[j]){cout<<"您輸入的塊號(hào)有誤,與第"<<j<<"號(hào)頁(yè)面輸入的塊號(hào)重復(fù),請(qǐng)重新輸入第"<<i<<"號(hào)頁(yè)面對(duì)應(yīng)的塊號(hào)!"<<endl;i--;}}} }void fdpageinit(){int flag=0;for(int i=0;i<dbx;i++){cin>>jz[i]>>dc[i];mw[i]=jz[i]+dc[i]; for(int j=0;j<i;j++){//沖突,有三種。1.基址在其他段長(zhǎng)內(nèi),末尾不在2.末尾在,基址不在3.二者都在 if( (jz[i]<=jz[j]&&mw[i]>=jz[j]) || (jz[i]<mw[j]&&mw[i]>mw[j])){flag=1;}if(flag==1){cout<<"您輸入的數(shù)據(jù)有誤,與第"<<i<<"號(hào)分段(基址"<<jz[i]<<",段長(zhǎng)"<<dc[i]<<")沖突,請(qǐng)重新輸入第"<<j<<"號(hào)分段對(duì)應(yīng)的基址和段長(zhǎng)!"<<endl;i--;flag=0;}}} }void randominit(int begin,int end,int size,int array[]){ //begin隨機(jī)起點(diǎn),end隨機(jī)終點(diǎn),size隨機(jī)個(gè)數(shù),array 隨機(jī)數(shù)存放位置 srand((unsigned)time(NULL));for(int i=0;i<size;i++){array[i] =(rand() % (end-begin+1))+ begin;for(int j=0;j<i;j++){if(array[i]==array[j])i--;} }}int randompage(int begin,int end){//jizhi為1時(shí),調(diào)用基址生成 ,此時(shí)begin從1開(kāi)始,否則從0開(kāi)始 /*if(fd==1){return ((rand() % (end-begin+1))+ begin)*1024;}else {*/srand((unsigned)time(NULL));int size[4]={1,2,4,8};return size[(rand() % (end-begin+1))+ begin]*1024;//}}void fdrandominit(int begin,int end,int size,int a[],int b[]){ //begin隨機(jī)起點(diǎn),end隨機(jī)終點(diǎn),size隨機(jī)個(gè)數(shù),array 隨機(jī)數(shù)存放位置 srand((unsigned)time(NULL));int temp[size];for(int i=0;i<size;i++){a[i]=((rand() % (end-begin+1))+ begin)*1024;b[i]=randompage(0,3);temp[i]=a[i]+b[i];for(int j=0;j<i;j++){if((a[i]<=a[j]&&temp[i]>=a[j]) || (a[i]<temp[j]&&temp[i]>temp[j]))i--;} }}void pagingmenu(int fd){//fd即分段,判斷是否為分段,分頁(yè)分段公用一套函數(shù) int choose;if(fd==1){//分段 cout<<"請(qǐng)輸入段表項(xiàng)個(gè)數(shù):(5到10之間整數(shù),含端點(diǎn))"<<endl;cin>>dbx;cout<<"\n請(qǐng)輸入頁(yè)表中每段對(duì)應(yīng)的基址和段長(zhǎng):(0-手動(dòng)輸入;1-隨機(jī)生成)";cin>>choose;switch(choose){case 0:fdpageinit(); break;case 1:fdrandominit(1,100,dbx,jz,dc);break;}}else {//分頁(yè) pagechoose();cout<<"請(qǐng)輸入頁(yè)表項(xiàng)個(gè)數(shù):(5到10之間整數(shù),含端點(diǎn))"<<endl;cin>>ybx;cout<<"\n請(qǐng)輸入頁(yè)表中每頁(yè)對(duì)應(yīng)的塊號(hào):(0-手動(dòng)輸入;1-隨機(jī)生成0至10之間的非重復(fù)整數(shù)作為塊號(hào))";cin>>choose;switch(choose){case 0:pageinit(); break;case 1:randominit(0,10,10,page);break;}} }void show(){cout<<" 您選擇了分頁(yè)方式,輸入的數(shù)據(jù)如下:"<<endl;cout<<"每頁(yè)大小"<<pagesize/1024<<"K,頁(yè)表為"<<endl;cout<<"頁(yè)號(hào)\t塊號(hào)"<<endl; for(int i=0;i<ybx;i++){cout<<i<<"\t"<<page[i]<<endl;}fyjs(); } void showfd(){cout<<"您選擇了分段方式,輸入的數(shù)據(jù)如下:"<<endl;cout<<"段號(hào)\t基址\t段長(zhǎng)"<<endl;for(int i=0;i<dbx;i++){cout<<i<<"\t"<<jz[i]<<"\t"<<dc[i]<<endl;}fdjs(); }void fyjs(){cout<<"請(qǐng)開(kāi)始你的表演(輸入邏輯地址)"<<endl;int ljdz,yh,yp,kh,wldz,flag=0;do{if(flag>0)cout<<"您輸入的地址已溢出,請(qǐng)重新輸入!"<<endl;cin>>ljdz;yh=ljdz/pagesize;flag++;}while(yh>ybx);yp=ljdz%pagesize;kh=page[yh];wldz=kh*pagesize+yp;cout<<"您選擇了分頁(yè)方式,輸入的邏輯地址為"<<ljdz<<",其對(duì)應(yīng)的頁(yè)號(hào)為"<<yh<<",頁(yè)偏移為"<<yp<<";該地址對(duì)應(yīng)的塊號(hào)為"<<kh<<",塊偏移為"<<yp<<",物理地址為"<<wldz<<"。";cout<<"是否繼續(xù)?(Y/N)"<<endl;char ss;cin>>ss;if(ss=='Y')menu();else ; }void fdjs(){cout<<"請(qǐng)開(kāi)始你的表演(輸入邏輯地址)"<<endl;int ljdz,dh,dp,jizhi,wldz;cin>>ljdz;int temp=ljdz,i,z=ljdz;for(i=0;i<dbx;i++){ljdz-=dc[i];if(ljdz<0)break;temp=ljdz;}dh=i;dp=temp;jizhi=jz[i];wldz=jz[i]+dp;cout<<"您選擇了分頁(yè)方式,輸入的邏輯地址為"<<z<<",其對(duì)應(yīng)的段號(hào)為"<<dh<<",段偏移為"<<dp<<";該地址對(duì)應(yīng)的基址為"<<jizhi<<",段偏移為"<<dp<<",物理地址為"<<wldz<<"。";cout<<"是否繼續(xù)?(Y/N)"<<endl;char ss;cin>>ss;if(ss=='Y')menu();else ; }void menu(){system("cls");cout << "------------------分頁(yè)------------------------" << endl;cout << "* 1.分頁(yè) *" << endl;cout << "* 2.分段 *" << endl;cout << "* 3.退出 *" << endl;cout << "-----------------------------------------------" << endl;cout << "請(qǐng)選擇:";int choose=0;scanf("%d",&choose);switch(choose){case 1:pagingmenu(0);show();break;case 2:pagingmenu(1);showfd();break;case 3:return ; default:printf("輸入出錯(cuò),請(qǐng)重新輸入\n"); } } int main(){/*randominit(0,10,10,page);for(int i=0;i<10;i++){cout<<page[i]<<" ";}dbx=5;fdpageinit();*/menu();return 0; }總結(jié)
以上是生活随笔為你收集整理的操作系统——分页分段算法c++实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: gnome显示桌面图标_gnome3.2
- 下一篇: s3c2440移植MQTT