操作系统——分页分段算法c++实现

具体如下:有问题请提出来吧,希望能帮到大家

#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<<"您输入的数据有误,与第"<<i<<"号分段(基址"<<jz[i]<<",段长"<<dc[i]<<")冲突,请重新输入第"<<j<<"号分段对应的基址和段长!"<<endl;
				i--;
				flag=0;
			}
		}
		
	}
}

void randominit(int begin,int end,int size,int array[]){ //begin随机起点,end随机终点,size随机个数,array 随机数存放位置 
	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随机个数,array 随机数存放位置 
	
	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即分段,判断是否为分段,分页分段公用一套函数 
	int choose;
	if(fd==1){//分段 
		cout<<"请输入段表项个数:(5到10之间整数,含端点)"<<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<<"请输入页表项个数:(5到10之间整数,含端点)"<<endl;
		cin>>ybx;
		cout<<"\n请输入页表中每页对应的块号:(0-手动输入;1-随机生成0至10之间的非重复整数作为块号)";
		cin>>choose;
		switch(choose){
			case 0:pageinit(); break;
			case 1:randominit(0,10,10,page);break;
		}
	}
}

void show(){
	cout<<" 您选择了分页方式,输入的数据如下:"<<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<<"您选择了分段方式,输入的数据如下:"<<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<<"是否继续?(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<<"是否继续?(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;
} 
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值