?? 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 + -