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

📄 main.cpp

📁 是操作系统的的内存管理
💻 CPP
字号:
#include "stdio.h" 
#include <stdlib.h> 
#include "conio.h"
#include <time.h>     //用来产生随机函数的
#define getpch(type) (type*)malloc(sizeof(type)) 
#define NULL 0 
#define N 5

struct pcb { /* 定义进程控制块PCB */ 
	int name; 
	char state; /*进程的状态是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一*/
	int nspace;   //
	int rspace;
	int ntime;   //need time 
	int rtime;   //have ran time
	struct pcb* link; 
}*ready=NULL,*readytail=NULL,*running=NULL,*runningtail=NULL,*p; 

typedef struct pcb PCB;

int mem[8]={20,20,40,40,40,40,60,60};
int memp[8]={-1,-1,-1,-1,-1,-1,-1,-1};
int memflag[8]={0,0,0,0,0,0,0,0};

void sort() /*insert进程*/ 
{ 
	if(!ready) 
	{	ready=readytail=p; 	} 
	else 
	{ 	readytail->link=p;readytail=p;	}
}

void input() /* 建立进程控制块函数*/ 
{ 
	int i,num;
	system("cls"); /*清屏*/ 
	printf("\n请输入进程块数?"); 
	scanf("%d",&num); 
	for(i=1;i<=num;i++) 
	{
		p=getpch(PCB);
		p->name=i;
		p->nspace=(1+rand()%6)*10;
		p->rspace=-1;
		p->ntime=1+rand()%5;
		p->rtime=0;
		p->state='w';
		p->link=NULL;
		sort(); /* 调用sort函数*/ 
	}
} 

void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ 
{
	printf("\t|  %d\t",pr->name); 
    printf("  %c\t",pr->state); 
	printf("  %d\t",pr->nspace);
	printf("  %d\t",pr->rspace);
	printf("  %d\t",pr->ntime); 
	printf("  %d |\n",pr->rtime); 
}

void displayqueue(PCB* ppp)
{
	PCB*pr=ppp;
	printf("\t---------------------------------------------\n");
	printf("\t|名称\t状态\t需存\t地址\t需时\t运时|\n"); 
	while(pr!=NULL) 
	{ 
		disp(pr);
		pr=pr->link;
	}
	printf("\t---------------------------------------------\n");
}

void run() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ 
{
	PCB *r,*first=NULL,*last=NULL;
	while(running)
	{
		r=running;
		running=running->link;
		r->link=NULL;  //一定要加,注意
		r->rtime++;
		if( r->rtime == r->ntime )
		{
			memflag[r->rspace]=0;
			memp[r->rspace]=-1;
			printf("\t进程%d已经完成\n",r->name);
		}
		else
		{
			if(!first)
			{	first=last=r;	}
			else
			{
				last->link=r; last=r;last->link=NULL;
			}
		}
	}
	running=first;
}

void sleep(int n)
{
	time_t temp=time(NULL);
	while(time(NULL)<temp+n) ;
}

void displaytable()
{
	int i,address=0;
	printf("\t=========================================\n");
	printf("\t|分区号\t大小\t起址\t状态\t进程\t|\n");
	for(i=0;i<8;i++)
	{
		printf("\t|  %d\t %d\t %d\t  %d\t %d\t|\n",i,mem[i],address,memflag[i],memp[i]);
		address+=mem[i];
	}
	printf("\t=========================================\n");

}

int findn(PCB* l)
{
	int i;
	for(i=0;i<8;i++)
	{
		if((l->nspace <= mem[i]) && !memflag[i] )
			return i;
	}
	return -1;
}

void main() /*主函数*/ 
{ 
	int n,t=0;
	int flag=1;
	srand(time(0));
	printf("用固定分区分配管理内存n\t");
	sleep(1);
	input();
	printf("当前产生的进程:\n");
	displayqueue(ready);
	getchar();
	printf("\n请按任意键开始运行内存分配。。。\n");
	getchar();

	while( running || ready ) /*运行和就绪队列*/
	{ 
		//system("cls");
		printf("\t time:%d\n",t);
		while( flag && ready )
		{
			p=ready;
			n=findn(p);
			if(n>=0)
			{
				memflag[n]=1;
				memp[n]=p->name;
				p->rspace=n;
				if(!running) {running=runningtail=p;}
				else { runningtail->link=p; runningtail=p; }
				ready=ready->link;
				runningtail->link=NULL;
			}
			else
			{ flag=0; }
		} 
		flag=1;
		displaytable();
		printf("\n当前的运行队列\n");
		displayqueue(running);
		t++;
		run();	
		sleep(1);
	} 
	printf("\n 全部进程已经完成.\n");
	getchar(); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -