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