⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gg.cpp

📁 操作系统课程设计
💻 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 + -