//程序功能: 段页虚拟存储管理
//程序设计者 余凡
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define Processcount 10//假设进程数为10
#define AssumeBlock 100//假设内存块大小有100块
#define Segnumber 4//假设每个进程最大段数是4
#define Keepmemory 8//驻留集大小
#define SegLength 16//段长最长16
/*页表相关信息*/
typedef struct
{
int pageNumber;
int frameNumber;
int pageFlag;
int accesstime;
int runcount;
}Page;
//段表相关信息*
typedef struct
{
int segmentNumber;
int segmentlength; //段长即每一个段的页数
int startAddress;
Page pagenum[SegLength];
int segFlag;
int pagereal;
}Segment;
/*进程相关信息*/
typedef struct
{
Segment segment[Segnumber];
int isInmemory;
int segtotalnumber;
int inpage; //载入内存中的页数
int segreal;
}Process;
int blocksize; //块大小
int blocknumbers;//块数量
int processnumber;//进程数量
int AvailableBlock;//内存中可用块数量
int offset; //页内偏移量
Process process[Processcount];//进相关信息程
int memory[AssumeBlock];//内存块相关信息
int occupied;//已被占用的内存块数量
void Applyspace()
{
printf("*************内存空间申请**************\n");
printf("输入进程数目:");
scanf("%d",&processnumber);
while(processnumber<=0||processnumber>Processcount)
{
printf("警告:进程数目不能大于10且不能小于0,请重新输入:");
scanf("%d",&processnumber);
}
for(int i=0;i<processnumber;i++)
{
printf("\n");
printf("%d号进程有几个段:",i);
scanf("%d",&process[i].segtotalnumber);
while(process[i].segtotalnumber<=0||process[i].segtotalnumber>4)
{
printf("警告:进程每个段的数目不能大于4且不能小于0,请重新输入:");
scanf("%d",&process[i].segtotalnumber);
}
for(int j=0;j<process[i].segtotalnumber;j++)
{
printf("%d号段需要的段长是多少:",j);
scanf("%d",&process[i].segment[j].segmentlength);
while(process[i].segment[j].segmentlength<0||process[i].segment[j].segmentlength>16)
{
printf("警告:进程每个段的段长不能大于16且不能小于0,请重新输入:");
scanf("%d",&process[i].segment[j].segmentlength);
}
for(int k=0;k<process[i].segment[j].segmentlength;k++)
{
process[i].segment[j].pagenum[k].accesstime=0;
process[i].segment[j].pagenum[k].runcount=0;
process[i].segment[j].pagenum[k].frameNumber=-1;
}
}
process[i].segment[0].startAddress=0;
int address=process[i].segment[0].startAddress;
for(int c=0;c<process[i].segtotalnumber;c++)
process[i].segment[c+1].startAddress=address+process[i].segment[c].segmentlength*1024;
}
}
void InitMemory()
{
int i;
int ran1,ran2,ran3,ran4;
printf("**************内存初始化***************\n");
printf("请输入内存块数(正整数形式):\n");
scanf("%d",&blocknumbers);
while(blocknumbers<=0||blocknumbers>AssumeBlock)
{
printf("警告:内存输入无效,请重新输入!\n");
scanf("%d",&blocknumbers);
}
AvailableBlock=blocknumbers;
printf("请输入内存中块大小(正整数形式)\n");
scanf("%d",&blocksize);
while(blocksize<=0||blocksize>20)
{
printf("警告:块大小输入无效,请重新输入!n");
scanf("%d",&blocksize);
}
/*初始时内存中各块均初始化为空*/
for(i=0;i<blocknumbers;i++)
{
memory[i]=0;
}
srand((unsigned)time(NULL));
ran1=rand()%64;
ran2=rand()%64;
ran3=rand()%64;
ran4=rand()%64;
memory[ran1]=1;
memory[ran2]=1;
memory[ran3]=1;
memory[ran4]=1;
printf("已被占用的块有:%d,%d,%d,%d\n",ran1,ran2,ran3,ran4);
}
void printfAvailable(int j)
{
int i=0;
AvailableBlock=blocknumbers-occupied;
if(AvailableBlock!=0)
printf("对于%d号进程有%d块可用",j,AvailableBlock);
printf("\n");
}
int Judge(int use,int block1)
{
if(use>=block1)
{
printf("内存已满\n");
return 2;
}
else return 3;
}
int Judgekeepmemory(int i,int inpage1)
{
if(inpage1>=Keepmemory)
{
printf("%d号进程的驻留集已满\n",i);
return 2;
}
else return 3;
}
void printTable(int j)
{
printf("************************%d号进程的段表信息如下************************\n",j);
printf(" 段号 在内存中? 段长 基地址 \n");
for(int m=0;m<process[j].segtotalnumber;m++)
printf(" %d %d %d %d\n",m,process[j].segment[m].segFlag,process[j].segment[m].segmentlength,process[j].segment[m].startAddress);
for(int k=0;k<process[j].segtotalnumber;k++)
{
printf("\n");
printf("\n");
printf("************************%d号进程%d号段的页表信息如下************************\n",j,k);
for(int m=0;m<process[j].segment[k].segmentlength;m++)
{
printf("页号 块号 载入时间 \n");
printf(" %d %d %d \n",m,process[j].segment[k].pagenum[m].frameNumber,process[j].segment[k].pagenum[m].runcount);
printf("\n");
}
}
}
void Allocate()
{
occupied=0;
int mem;
int i=0;
int page1,seg;
printf("***********内存分配***************\n");
while(i<processnumber)
{
mem=0;
printf("\n");
printfAvailable(i);
process[i].inpage=0;
process[i].segreal=0;
for( seg=0;seg<process[i].segtotalnumber;seg++)
{
process[i].segment[seg].pagereal=0;
for( page1=0;page1<process[i].segment[seg].segmentlength;page1++)
{
while(memory[mem]==1)//查找内存中的空闲块
mem++;
/*判断驻留集是否满*/
int judge1=Judgekeepmemory(i,process[i].inpage);
/*判断内存是否已满*/
int judge2=Judge(occupied,blocknumbers);
if(judge1==2)
{
seg=process[i].segtotalnumber;
page1=process[i].segment[seg].segmentlength;
}
else
{
if(judge2==3)
{
process[i].isInmemory=1;
process[i].inpage++;
occupied++;
process[i].segment[seg].pagenum[page1].frameNumber=mem;
process[i].segment[seg].pagenum[page1].pageFlag=1;
process[i].segment[seg].segFlag=1;
process[i].segment[seg].pagereal++;
memory[mem]=1;
mem++;
for(int p1=0;p1<=process[i].segtotalnumber;p1++)
for(int p=0;p<=process[i].segment[p1].segmentlength;p++)
{
if( process[i].segment[p1].pagenum[p].pageFlag==1)
{
process[i].segment[p1].pagenum[p].runcount++;
process[i].segment[p1].pagenum[p].accesstime++;
}
else
process[i].segment[p1].pagenum[p].frameNumber=-1;
}
}
else
i=processnumber;//内存已满时跳出循环,不再进行内存分配
}
}//end for(int page1=0;page1<process[i].segment[seg].segmentlength;page1++)
if(process[i].segment[seg].segFlag==1)
process[i].segreal++;
}//end for(int seg=0;seg<process[i].segtotalnumber;seg++)
i++;
}
for(int j=0;j<processnumber;j++)
{
printf("************************%d号进程的段表信息如下************************\n",j);
printf(" 段号 在内存中? 段长 基地址 \n");
for(int m=0;m<process[j].segtotalnumber;m++)
{
printf(" %d %d %d %d\n",m,process[j].segment[m].segFlag,process[j].segment[m].segmentlength,process[j].segment[m].startAddress);
}
for(int k=0;k<process[j].segtotalnumber;k++)
{
printf("\n");
printf("\n");
printf("************************%d号进程%d号段的页表信息如下************************\n",j,k);
for(int m=0;m<process[j].segment[k].segmentlength;m++)
{
printf("页号 块号 载入时间\n");
printf(" %d %d %d\n",m,process[j].segment[k].pagenum[m].frameNumber,process[j].segment[k].pagenum[m].runcount);
printf("\n");
}
}
}
}
void transform(int processnumber7,int segmentnumber7, int pagenumber7,int seglong,int pagelong)
{
process[processnumber7].segment[segmentnumber7].pagenum[pagenumber7].frameNumber=process[processnumber7].segment[seglong].pagenum[pagelong].frameNumber;
process[processnumber7].segment[segmentnumber7].pagenum[pagenumber7].pageFlag=1;
process[processnumber7].segment[segmentnumber7].segFlag=1;
process[processnumber7].segment[seglong].pagenum[pagelong].frameNumber=-1;
proces
没有合适的资源?快使用搜索试试~ 我知道了~
segment-page.rar_page_segment page_操作系统段页
共1个文件
cpp:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 35 浏览量
2022-09-23
00:26:21
上传
评论
收藏 4KB RAR 举报
温馨提示
段页式虚拟设计管理 用于操作系统课程设计作业,可支持LRU和FIFO访问
资源推荐
资源详情
资源评论
收起资源包目录
segment-page.rar (1个子文件)
段页.cpp 15KB
共 1 条
- 1
资源评论
小波思基
- 粉丝: 70
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功