h>
#include〈stdio.h>
intsettable1(intn,intk);//创建页表
intprintTable1(intn,intk);//显示页表
inttranst(intn,intk,intadd);//分页地址换算
intdefSect(intn,int*t);//创建段表
intprintSect(intn);//输出段表内容
inttransSect(intn,ints,intd);//进行分段地址换算函数
intsetSectTable(intn,intk);//创建段页式内容
intprintSectTable(intn,intk);//显示段页内容
inttransSectPage(intn,intk,ints1,ints2,ints3);//段页式地址换算
//定义页表结构体
typedefstructstable
{
inty1;//页号
inty2;//块号
}stable;
structstablesetst[512];
//建立段表的结构体
typedefstructsetsect
{
intd1;//段号
intd2;//段长
intd3;//基址
}setsect;
structsetsectsets[512];//定义段表的总长度
//建立段页式内的页表的结构体
typedefstructtable
{
intdy1;//页号
intdy2;//块号
}table;
//建立段页式的结构体
typedefstructsetAll
{
structtablec1[512];//定义段内页表的结构体
intc2;//段号
intc3;//段长
intc4;//起始地址
}setAll;
structsetAllset[512];//定义段页式的总长度
intmain()
{
intchoice1,choice2;
inttruth=0,truth1;
intjobAddr;//进程的逻辑地址空间
intmd;//页面大小
intaddr1;//输入的逻辑地址
intdc;//定义段表的长度
intdh,sAddr;//定义段表的逻辑地址的段号和段内地址
intdyc;//段页式的段表长度
intjobs,jobt,joba;//段页式逻辑段号、段内页号、页内地址
do{
printf(”组员:
符小平崔健王菲菲王天渤\n”);
printf(”--——--——-——-—-操作系统课程设计题目:
分页、分段、段页式地址换算-—--—---—-—--—--———\n\n”);
printf("总菜单\n”);
printf("1。
分页方式\n”);
printf(”2。
分段方式\n");
printf("3.段页式\n");
printf("4。
结束\n\n”);
printf("—-———-—-—--—-————-———-—--——-----—-—---——--———-—-—--——-—-—-\n");
printf(”请输入您的选择:
\n”);
scanf(”%d",&choice1);
switch(choice1)
{
case1:
{//分页方式
do{
printf("分页方式\n”);
printf(”---——-—-——-—--—-———--—---———-—---—-———-—-—-—--—--—-\n");
printf("1。
随机生成进程大小\n");
printf("2.进程创建页表\n”);
printf("3。
显示页表的信息\n”);
printf("4。
地址换算\n”);
printf(”5.退出\n");
printf(”---—-—————-—--—-——--—-————---—-————————-—--——————--\n\n”);
printf(”请输入您的选择:
”);
scanf(”%d",&choice2);
switch(choice2)
{
case1:
{
printf("随机生成一个进程(大小在1024K至2048K)\n");
printf("————-—--—-—-—-—-————-—-——-—----—-——-—--—--—————-—-—\n”);
do{
jobAddr=rand()%2048;//随机产生进程的逻辑地址空间
}while(jobAddr<1024);
printf("该进程的逻辑地址空间是:
%d(K)\n",jobAddr);
printf("页面的大小:
”);
scanf("%d”,&md);
truth=1;
printf(”---——-—--—----——------—-——-——--—————-—--——--——-——--\n");
}break;
case2:
{
if(truth==1){
printf("\n进程创建的页表\n”);
printf(”—--——-——-————-—-——----———————-—-—\n\n");
settable1(jobAddr,md);
truth1=1;
printf("\n\n--——-———-----———---—--—------——-—\n");
}else{
printf(”\n\n--—-—--------——-—-—-———----—-————\n”);
printf(”\n还没有创建进程。
请先选择1创建进程。
\n\n");
printf(”\n\n———--——-——--————-——--—-—---—-——-—\n");
break;
}
}break;
case3:
{
if(truth==1){
if(truth1==1){
printf("\n显示进程创建的页表\n”);
printf("—-—-—-—-—-----—————-----—---————-\n\n");
printTable1(jobAddr,md);
printf("\n\n—-———-——--——--———-—-—-——————-——-—\n”);
}else{
printf(”\n\n-—-------—-——--————--—-—----—-—--\n”);
printf("\n还没有创建页表.请先选择2创建页表.\n\n”);
printf(”\n\n——————-—-—-—--———--—-————-—————--\n");
break;
}
}else{
printf("\n\n-———-—--——-—-———————-——-——--—-—--\n”);
printf(”\n还没有创建进程。
请先选择1创建进程.\n\n");
printf("\n\n-—-—-—-—-—-————---—-—-——--——--—--\n");
break;
}
}break;
case4:
{
if(truth==1){
if(truth1==1){
printf(”\n地址换算\n");
printf(”---———--—----—---———------—-—-——-\n\n");
printf("请你输入要进行换算的逻辑地址(K):
");
scanf("%d",&addr1);
if(addr1〉jobAddr){
do{
printf(”输入的逻辑地址大于进程地址空间,请重新输入逻辑地址(K):
");
scanf(”%d",&addr1);
}while(addr1>jobAddr);
}
transt(jobAddr,md,addr1);
printf(”\n\n---——----———-—--——----———--———-——\n");
}else{
printf("\n\n-—--————--———-—-----——-—--——-——-—\n”);
printf(”\n还没有创建页表。
请先选择2创建页表。
\n\n");
printf("\n\n—--—---—-——-—-——---—-————-----—--\n");
break;
}
}else{
printf(”\n\n—--—-—-—-—-——---—-—-———---—------\n");
printf("\n还没有创建进程.请先选择1创建进程.\n\n”);
printf("\n\n—--—-—-——--—---——-----—-——--——--—\n");
break;
}
}break;
case5:
{
printf(”-——-—————-—-------——————----——-——--—-----—————-————\n\n”);
printf("退出分页方式地址换算选项,进入总菜单.\n");
printf(”-—————--—-----—-——-—--—--—--———---—-——--————-—---——\n\n”);
}break;
default:
{
printf(”--————----—-——-——-——-—--—--———---———---\n”);
printf(”错误提示:
你输入的选择有错,请重新选择!
\n");
printf("—-———-——---———--—--—--—-———--—---—-————\n”);}
}
}while(choice2!
=5);
}break;
case2:
{//分段方式
do{
printf(”分段方式地址换算\n”);
printf(”—-——---——---———--—-————-—-—--—————--—--——---—--——-—\n");
printf(”1。
创建段表\n");
printf("2.显示段表\n”);
printf("3。
地址换算\n");
printf(”4。
退出\n”);
printf("--—-——-—--——————--—-———-——-—-—-—---—-—-——---————-—-\n\n”);
printf("请输入您的选择:
”);
scanf(”%d",&choice2);
switch(choice2)
{
case1:
{
printf("开始创建段表\n”);
printf(”—--—-----—--—---——--—————-——-—-————------—-—-———--—\n”);
printf(”请输入你要创建的段表长度(最大为512个):
");
scanf("%d",&dc);
defSect(dc,&truth);
printf("—---———-—-—-——-——-——---—-————----—--———---—-———--—-\n”);
}break;
case2:
{
if(truth==1){
printf("\n显示已经创建的段表内容\n");
printf(”———--—-——--————-—--—--—————-——---\n\n”);
printSect(dc);
printf("\n\n——-----———---—-——--—-—---—--—-—--\n”);
}else{
printf("\n\n----—--———--———-——-—-——----———-—-\n");
printf("\n还没有创建段表.请先选择1创建段表。
\n\n");
printf(”\n\n--—-————-——-—-—————--—--—--—-----\n");
break;
}
}break;
case3:
{
if(truth==1){
printf(”分段地址换算\n");
printf(”——----——-—-——-———--—-——-——-———-———-——-——-——-—-——---\n”);
printf(”请您输入逻辑地址的段号,段内地址(K):
”);
scanf("%d,%d”,&dh,&sAddr);
transSect(dc,dh,sAddr);
printf(”--——-—-—-—-—-—-—-——---——--———--——-——-——------——-—--\n");
}else{
printf(”--———-—-----—--—-—----—-—-—-——————-——-—-—---—-—--——\n");
printf("\n还没有创建段表.请先选择1创建段表.\n\n");
printf("-—--—-——--——————-—--———---——------—-—-——---——---———\n");
break;
}
}break;
case4:
{
printf(”-—--—------———-—----——--——--—-——-—-—-——--—-—-——-—-—\n\n");
printf(”退出分段方式地址换算选项,进入总菜单。
\n");
printf("—---—---—-——--—-——-——-——-———---——————--—————-——————\n\n”);
}break;
default:
{
printf("-—-—--—————--———-—--—-—---—---—--—----—\n");
printf(”错误提示:
你输入的选择有错,请重新选择!
\n");
printf("—-————-———-—----——---—-----—-—-——-————-\n”);}
}
}while(choice2!
=4);
}break;
case3:
{//段页式
do{
printf("段页式地址换算\n");
printf(”--——-——----—--—-—-—-------——--—-——-—--————--------—\n");
printf(”1.创建段页式\n”);
printf(”2.显示段页式结构\n”);
printf("3.地址换算\n");
printf(”4。
退出\n");
printf(”-——--—-————--———---------—-——-——--—----—----——--—-—\n\n”);
printf(”请输入您的选择:
");
scanf(”%d",&choice2);
switch(choice2)
{
case1:
{
printf(”开始创建段页式\n”);
printf("———————-----—-—--—-—-——--—--——-------——---——---—--—\n”);
printf(”请输入你要创建的段表长度(最大为512个):
”);
scanf("%d”,&dyc);
printf(”页面的大小K:
”);
scanf(”%d”,&md);
setSectTable(dyc,md);
truth=1;
printf("——-——--—-——-——-—---—-————--—--—--—-—-—