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

📄 综合.cpp

📁 这是操作系统的一个课程设计.主存空间的分配与回收 包含多种算法. 花了不少心思才编写出来.还有实验报告
💻 CPP
字号:
#include<iostream.h>
#include "stdlib.h" 
#include "stdio.h" 
#include<cstring>
#include <conio.h> 
#define NULL 0
#define get(type) (type*)malloc(sizeof(type))
struct rcb//空闲表的结点
{
	int startAdd;//起始地址
	int size;//容量大小
	char state[10];//状态
	rcb *next;//后向指针
}*start=NULL,*tp;//tp在循环首次适应算法中只是上次中到分区的下一个空闲区

struct jcb//作业结点
{
	char name[10];
	int size;
	int ntime;//需要cpu的时间
	struct jcb *next;
}*ready=NULL;
void linkJcb(jcb *p)//结点链接,先来先服务
{
	jcb *a,*b;
	if(ready==NULL) 
	{
		p->next=ready;
		ready=p;
	}
	else
	{	b=ready;
		a=ready->next;
	   while(a)
	   {  b=a;
	      a=a->next;
	   }
	   b->next=p;
	   p->next=a;
	 }
}
//------------------------------
void creatJcb()//创建结点并链接成单链表
{
	jcb *p;	
	int i,num; 
	cout<<" 请输入作业数目:"; 
	cin>>num; 
	for(i=1;i<=num;i++) 
	{ 
		cout<<endl<<"作业号No."<<i<<":"; 
		p=get(jcb); 
		cout<<endl<<" 输入作业名:"; 
		cin>>p->name;
		cout<<"输入作业占用内存大小:";
		cin>>p->size;	
		cout<<"输入作业占有cpu的时间:";
		cin>>p->ntime;
		p->next=NULL; 
		linkJcb(p); //调用linkJcb函数
	} 
}
void dispJcb() //显示作业状况
{ 
	jcb *pr;
	pr=ready;
	if(pr==NULL)
		cout<<"外存中没有了作业"<<endl;
	else
	{
	cout<<endl<<"显示外存未分配作业:"<<endl;
	while(pr)
	{
		cout<<"name \t size \t ntime "<<endl; 
		cout<<pr->name<<"         "; 
		cout<<pr->size<<"         ";
		cout<<pr->ntime<<"   "<<endl;
		pr=pr->next;
	}
	}
}
//-------------------
void linkRcb(rcb *p)//按照 首地址优先 链接分区成链表
{
	rcb *a,*b;
	if(start==NULL||p->startAdd < start->startAdd)
	{
		p->next=start;
		start=p;
	}
	else
	{
		b=start;
		a=start->next;
		while(a&&a->startAdd < p->startAdd)
		{
			b=a;
			a=a->next;
		}
		p->next=a;
		b->next=p;
	}
}
//-------
void linkRcb2(rcb *p)//按照分区的大小链接
{
	rcb *a,*b;
	if(start==NULL||p->size < start->size)
	{
		p->next=start;
		start=p;
	}
	else
	{
		b=start;
		a=start->next;
		while(a&&a->size < p->size)
		{
			b=a;
			a=a->next;
		}
		p->next=a;
		b->next=p;
	}
}
//-----
void creatRcb(int m)// 创建分区
{
	rcb *p;	
	int i,num; 
	cout<<"分区表中的分区数目:"; 
	cin>>num; 
	for(i=1;i<=num;i++) 
	{ 
		cout<<endl<<"分区No."<<i<<":"; 
		p=get(rcb); 
		cout<<"输入分区的起址:";
		cin>>p->startAdd;
		cout<<"输入分区的大小:";
		cin>>p->size;
		strcpy(p->state,"未分配");
		p->next=NULL;
		if(m==1)//进行首次适应算法和循环首次适应算法
			linkRcb(p); 
		else
			linkRcb2(p);
	}
}
//-------------
void dispRcb()
{
	rcb *a;
	int i=1;
	a=start;
	cout<<endl;
	cout<<"---------------------"<<endl;
	cout<<"             内存分区说明表                "<<endl;
	cout<<"|分区号|  大小 |   起址 |    状态|"<<endl;
	while(a)
	{
		cout<<"  "<<i<<"       |"<<a->size<<"   |  "<<a->startAdd<<"    |"<<a->state<<"|"<<endl;
		i++;
		a=a->next;
	}
	cout<<"---------------------"<<endl;
}
//-----------------
void destroy(jcb *p)
{
		if(p==ready)
			{
				ready=ready->next;
				p=ready;
			}
		else
		{
			jcb *a;
			a=ready;
			while(a->next!=p)
				a=a->next;
			a->next=a->next->next;
			p=a->next;
		}
}

//-----------------------
void running(int hh)//hh=1时运行首次适应和最佳适应算法;hh=2时循环首次适应
{
	jcb *p;
	p=ready;
	rcb *q;
	while(p)
	{
		tp=start;
		int flag=0;
		if(hh==1)//---
			q=start;
		else
			q=tp;
		while(q&&!flag)
		{
			if(p->size==q->size&&!strcmp(q->state,"未分配"))
			{
				flag++;
				strcpy(q->state,"已分配");
				tp=q->next;//指示下一个空闲区
			}
			else if(p->size<q->size&&!strcmp(q->state,"未分配"))
			{
				rcb *t;
				t=get(rcb);
				t->size=q->size-p->size;
				t->startAdd=q->startAdd+p->size;
				strcpy(t->state,"未分配");
				q->size=p->size;
				strcpy(q->state,"已分配");
				rcb *l;
				l=q->next;
				t->next=l;
				q->next=t;
				flag++;
				tp=t;//指示下一个空闲区
			}
			else
			{
				q=q->next;
			}
			if(q==NULL&&!flag&&hh==2)
			{
				q=start;
				hh--;
			}
		}
		if(flag==0)
		{
			cout<<"此作业"<<p->name<<"无法进行分配操作"<<endl;
			p=p->next;
		}
		else
		{
			if(p==ready)
			{
				ready=ready->next;
				p=ready;
			}
			else
			{
				jcb *a;
				a=ready;
				while(a->next!=p)
					a=a->next;
				a->next=p->next;
				p=a->next;
			}
		}
	}
	dispRcb();
	dispJcb();
}
//--------------------------
void callBack()//回收分配区空间
{
	rcb *p,*q;
	p=start;
	while(p)
	{
		strcpy(p->state,"未分配");
		p=p->next;
	}
	q=start;
	int m;
	while(q)
	{	p=start;
		while(p)
		{
			m=q->startAdd+q->size;
			if(p->startAdd==m)
			{
				q->size+=p->size;
				q->next=q->next->next;
				p=q->next;
			}
			else
			{
				p=p->next;
			}
		}
		q=q->next;
	}
	dispRcb();
}
void menu1()
{
	cout<<"***************************************"<<endl;
	cout<<"         1 .采用首次适应算法"<<endl;
	cout<<"         2 .采用循环首次适应算法"<<endl;
	cout<<"         3 .采用最佳适应算法"<<endl;
	cout<<"         0 .exit"<<endl;
        cout<<"***************************************"<<endl;
}
void menu()
{
	cout<<"1 .创建分区说明表"<<endl;
	cout<<"2 .创建外存作业表"<<endl;
	cout<<"3 .通过算法调入内存"<<endl;
	cout<<"4 .分区回收空间"<<endl;
	cout<<"5 .显示分区说明表和外存作业表"<<endl;
	cout<<"0 .exit"<<endl;
}
int main()
{
	int i=1;
	int a;
	system("cls");
	menu1();
	cout<<"输入功能键<0-3>:";
	cin>>a;
	if(a==1)
	{
	int b;	
	while(i)
	{
		system("cls");
		menu();
		cout<<"输入功能键<0-5>:";
		cin>>b;
		switch(b)
		{
		case 1:
			creatRcb(1);
			break;
		case 2:
			creatJcb();
			break;
		case 3:
			running(1);
			break;
		case 4:
			callBack();
			break;
		case 5:
			dispJcb();
			dispRcb();
			break;
		case 0:
		default:
			break;
		}
		if(b==0)
		{i=0;break;}
		cout<<"输入任意键继续...";
		getch();
	}
	}
	else if(a==2)
	{
	int b;	
	while(i)
	{
		system("cls");
		menu();
		cout<<"输入功能键<0-5>:";
		cin>>b;
		switch(b)
		{
		case 1:
			creatRcb(1);
			break;
		case 2:
			creatJcb();
			break;
		case 3:
			running(2);
			break;
		case 4:
			callBack();
			break;
		case 5:
			dispJcb();
			dispRcb();
			break;
		case 0:
		default:
			break;
		}
		if(b==0)
		{i=0;break;}
		cout<<"输入任意键继续...";
		getch();
	}
	}
	else if(a==3)
	{
	int b;	
	while(i)
	{
		system("cls");
		menu();
		cout<<"输入功能键<0-5>:";
		cin>>b;
		switch(b)
		{
		case 1:
			creatRcb(2);
			break;
		case 2:
			creatJcb();
			break;
		case 3:
			running(1);
			break;
		case 4:
			callBack();
			break;
		case 5:
			dispJcb();
			dispRcb();
			break;
		case 0:
		default:
			break;
		}
		if(b==0)
		{i=0;break;}
		cout<<"输入任意键继续...";
		getch();
	}
	}
	else
		cout<<"退出系统"<<endl;
	return 0;
	}
	












		



⌨️ 快捷键说明

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