📄 gg.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
struct pcb{ //模拟进程
int num; //进程号
int kjnum; //进程空间大小
int pbegin; //进程始址
int pend; //进程结束地址
};
struct kxq{
int knum; //空闲区号
int kbegin; //空闲区始址
int kend; //空闲区终址
int ksize;
};
pcb *pcblist;
kxq *kxqlist;
int kxsize=1;
int pcbnum=0;
int sign=0;
void initpcb() //初始化进程
{
while(pcbnum<1 || pcbnum >5) //随机生成进程数
{
pcbnum=(int)(20*rand()/(RAND_MAX+1.0));
}
pcblist=new pcb[pcbnum];
for (int i=0;i<pcbnum;i++)
{
pcblist[i].num=i;
pcblist[i].kjnum=(int)(1000*rand()/(RAND_MAX+1.0))+1;
pcblist[i].pbegin=0;
pcblist[i].pend=0;
}
}
void initkxq() //初始化空闲区
{
kxqlist=new kxq[10];
int temp=0;
while(temp<3000 || temp >4000) //随机生成空间大小
{
temp=(int)(5000*rand()/(RAND_MAX+1.0));
}
kxqlist[0].knum=0;
kxqlist[0].kbegin=0;
kxqlist[0].ksize=temp;
kxqlist[0].kend=temp-1;
}
void fenpei(int p) //分配内存
{
int i;
for(i=0;i<kxsize;i++)
{
if(pcblist[p].kjnum<kxqlist[i].ksize)
{
pcblist[p].pbegin=kxqlist[i].kbegin;
pcblist[p].pend=kxqlist[i].kbegin+pcblist[p].kjnum-1;
kxqlist[i].kbegin=kxqlist[i].kbegin+pcblist[p].kjnum;
break;
}
else
{
if(pcblist[p].kjnum=kxqlist[i].ksize)
{
pcblist[p].pbegin=kxqlist[i].kbegin;
pcblist[p].pend=kxqlist[i].kend;
for(int j=i;j<kxsize-1;j++)
{
kxqlist[j].knum=kxqlist[j+1].knum;
kxqlist[j].kbegin=kxqlist[j+1].kbegin;
kxqlist[j].kend=kxqlist[j+1].kend;
kxqlist[j].ksize=kxqlist[j+1].ksize;
}
break;
}
else
{
sign=1;
printf("由于空闲区容量不够,进程%d需要的空间无法提供!\n",p);
}
}
}
}
void print(int p) //打印进程状态
{
printf("\n内存分配情况:\n进程号 进程空间大小 进程始址 进程终址\n");
printf("%d %d %d %d\n",pcblist[p].num,pcblist[p].kjnum,pcblist[p].pbegin,pcblist[p].pend);
}
void main()
{
initpcb();
initkxq();
int tp=0,tp2=0,j;
printf("进程号 进程空间大小\n");
for(j=0;j<pcbnum;j++)
{
printf("%d %d\n",pcblist[j].num,pcblist[j].kjnum);
}
printf("\n");
for(j=0;j<pcbnum;j++)
{
fenpei(j);
if(sign==0)
{
print(j);
printf("请输入要访问的虚拟地址:");
scanf("%d",&tp);
tp2=0;
while(tp2==0)
{
if(tp<=pcblist[j].kjnum)
{
printf("对应的物理地址是:%d\n",pcblist[j].pbegin+tp);
tp2=1;
}
else
{
printf("要访问的地址越界!请重新输入!\n");
tp2=0;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -