动态分区存储管理: 首次适应--最佳适应-最坏适应算法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34777600/article/details/79507681

动态分区存储管理: 首次适应--最佳适应-最坏适应算法

1.背景

多个应用程序请求主存空间是一个多对多的问题,在分区存储分配方法中由多个空闲区组成了空闲队列。对一个要进入主存的应用程序而言,主存分配程序在多个空闲区中选择那一个给该应用程序这就是一个放置 策略问题。


2.理论分析

空闲区队列的排序原则就体现了选择一个空闲区的策略。这个队列可以是无序的,即按照主存块释放的先后顺序排列。也可以按照某种分类方法进行排序,下面是两种常用的分类方法:

        1.按地址增加1或减少的次序分类排序。

        2.按区的大小增加或减少的次序排列。

无论哪种策略都应遵循:

        1.当分配一个空闲区的时候,按分配块的算法进行分配,而放置策略只是描述空闲区队列的排序原则。
        2.当回收一个空闲区时,必须按照队列的排序原则,把空闲区插入到队列适当的位置中以保证队列排序规则不变你。

3.放置策略(算法)比较

关于首次适应算法、最佳适应算法和最差适应算法,先看一下百度百科的解释,已经说出了三者的最大区别。
首次适应算法(first-fit):
从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法的目的在于减少查找时间。
最佳适应算法(best-fit):
从全部空闲区中找出能满足作业要求的,且大小最小的空闲分区,这种方法能使碎片尽量小
最差适应算法(worst-fit):
它从全部空闲区中找出能满足作业要求的、且大小最大的空闲分区,从而使链表中的节点大小趋于均匀。

4.案例分析与实现

主存大小为 maxsize (512) 字节
申请过程:
        J1申请162J2申请64J3申请120J4申请86J1完成,J3完成,J5申请72J6申请100J2完成,J7申请36
     J8申请60J4完成,J9申请110J10申请42
规则:
(a)所有大小其单位为节(1节=rd的大小)
(b)作业申请n节,实际分配的分区大小应为n+1节。其中一节作为分区描述器,其他n节提供给作业。
(c)已分配区放在高地址处。

分区描述器rd如下:

flag

size

next

要求自由主存队列按链表组织。 主存大小假设为maxsize(单位为节=rd的大小)。 


5.代码

#include<iostream>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
using namespace std;
int maxsize;
int k[50];
typedef struct memory
{
	bool flage;
	string name;
	int start;
	int size;
	memory *front;
	memory *next;
}rd;
rd *line = new rd;

/*
struct node
{
string name;
string operate;
int size;
}node1,node2;
*/

void init()
{
	line->flage = 0;
	line->name = "空";
	line->start = 0;
	line->size = maxsize;
	line->front = NULL;
	line->next = NULL;
}

void display()
{
	rd *di = new rd;
	di = line;
	while (di != NULL)
	{
		cout << di->flage << "  " << di->name << "  " << di->start << "  " << di->size << endl;
		di = di->next;
	}

	/*
	while (q->front != NULL)
	{
	cout << q->front->flage << "  " << q->front->name << "  " << q->front->start << "  " << q->front->size << endl;
	q = q->front;
	}
	*/
}

void firstmethod()
{
	cout << "请输入申请的主存大小:  " << endl;
	cin >> maxsize;
	init();
	display();
	while (true)
	{
		string operate;
		rd *temp = new rd;
		temp->front = NULL;
		temp->next = NULL;
		temp->flage = 1;
		cout << "请求名称( shutdown 为结束标识符 )" << endl;
		cin >> temp->name;
		cout << "请求类型( 申请  完成 )" << endl;
		cin >> operate;
		if (operate == "shutdown")
		{
			cout << "此次首次适应算法分配结束!" << endl;
			return;
		}
		else if (operate == "申请")
		{
			temp->start = 0;
			cout << "请求大小" << endl;
			cin >> temp->size;
			rd *p = new rd;
			p = line;
			while (p != NULL)
			{
				if (!p->flage && p->size >= temp->size)
				{
					temp->start = p->start + (p->size - temp->size);
					p->size -= temp->size;
					if (p->next != NULL)
					{
						temp->next = p->next;
						p->next->front = temp;
					}
					temp->front = p;
					p->next = temp;
				}
				p = p->next;
			}
			display();
		}
		else if (operate == "完成")
		{
			rd *p = new rd;
			p = line;
			while (p != NULL)
			{
				if (p->name == temp->name)
				{
 					rd *q = new rd;
					q->flage = 0;
					q->name = "空";
					q->start = 0;
					q->size = maxsize;
					q->front = NULL;
					q->next = NULL;
		
					if (p->front != NULL)
					{	
						q = p->front;
						if (p->front->front != NULL) q->front = p->front->front;
						else q->front = NULL;
					}
					if (!q->flage)
					{
						q->size += p->size;

						if (p->next != NULL && !p->next->flage)
						{
							q->size += p->next->size;
							if (q->next->next->next != NULL)
							{
								q->next->next->next->front = q;
								q->next = q->next->next->next;
							}
							else
							{
								q->next = NULL;
							}
						}
						else if (p->next != NULL)
						{
							q->next = p->next;
						}
						p = q->next;
					}
					else if (p->next != NULL && !p->next->flage)
					{
						p->size += p->next->size;
						if (p->next->next != NULL)
						{
							p->next->next->front = p;
							p->next = p->next->next;
						}
					}
				
					else if (((p->front != NULL && p->front->flage) || (p->front == NULL) && ((p->next != NULL && p->next->flage) || (p->next == NULL))))
					{
						p->flage = 0;
						p->name = "空";
						if (p->next != NULL)
						{
							p->next->front = p->front;
							p->front->next = p->next;
						}
					}
				}
				else p = p->next;
			}
			display();
		}
	}
}

void bestmethod()
{
	cout << "请输入申请的主存大小:  " << endl;
	cin >> maxsize;
	init();
	display();
	while (true)
	{
		string operate;
		rd *temp = new rd;
		temp->front = NULL;
		temp->next = NULL;
		temp->flage = 1;
		cout << "请求名称( shutdown 为结束标识符 )" << endl;
		cin >> temp->name;
		cout << "请求类型( 申请  完成 )" << endl;
		cin >> operate;
		if (operate == "shutdown")
		{
			cout << "此次首次适应算法分配结束!" << endl;
			return;
		}
		else if (operate == "申请")
		{
			temp->start = 0;
			cout << "请求大小" << endl;
			cin >> temp->size;
			memset(k, 0, sizeof(k));
			rd *order = new rd;
			order = line;
			int i = 0;
			int ok;
			while (order != NULL)
			{
				if(!order->flage) k[i++] = order->size;
			}
			sort(k, k + i);
			for (int j = 0; j < i; j++)
			{
				if (k[j] >= temp->size)
				{
					ok = k[j];
				}
			}

			rd *q = new rd;
			q->front = NULL;
			q->next = NULL;
			q->size = 0;
			q->flage = 0;
			q->start = 0;
			q->name = temp->name;

			rd *p = new rd;
			p = line;
			i = 0;
			while (p != NULL)
			{
				if (p->size==ok)
				{
					q = p;
					break;
				}
				p = p->next;
			}

			if (q->size >= temp->size)
			{
				temp->start = q->start + (q->size - temp->size);
				q->size -= temp->size;
				cout << temp->start << "  " << q->size << "  " << line->size << endl;
				if (q->next != NULL)
				{
					temp->next = q->next;
					q->next->front = temp;
				}
				else
				{
					temp->next = NULL;
				}
				temp->front = q;
				q->next = temp;
			}
			else
			{
				cout << "申请失败!!!" << endl;
			}
			display();
		}
		else if (operate == "完成")
		{
			rd *p = new rd;
			p = line;
			while (p != NULL)
			{
				if (p->name == temp->name)
				{
					rd *q = new rd;
					q->flage = 0;
					q->name = "空";
					q->start = 0;
					q->size = maxsize;
					q->front = NULL;
					q->next = NULL;

					if (p->front != NULL)
					{
						q = p->front;
						if (p->front->front != NULL) q->front = p->front->front;
						else q->front = NULL;
					}
					if (!q->flage)
					{
						q->size += p->size;

						if (p->next != NULL && !p->next->flage)
						{
							q->size += p->next->size;
							if (q->next->next->next != NULL)
							{
								q->next->next->next->front = q;
								q->next = q->next->next->next;
							}
							else
							{
								q->next = NULL;
							}
						}
						else if (p->next != NULL)
						{
							q->next = p->next;
						}
						p = q->next;
					}
					else if (p->next != NULL && !p->next->flage)
					{
						p->size += p->next->size;
						if (p->next->next != NULL)
						{
							p->next->next->front = p;
							p->next = p->next->next;
						}
					}
					else if (((p->front != NULL && p->front->flage) || (p->front == NULL) && ((p->next != NULL && p->next->flage) || (p->next == NULL))))
					{
						p->flage = 0;
						p->name = "空";
						if (p->next != NULL)
						{
							p->next->front = p->front;
							p->front->next = p->next;
						}
					}
				}
				else p = p->next;
			}
			display();
		}
	}




}

void badmethod()
{
	cout << "请输入申请的主存大小:  " << endl;
	cin >> maxsize;
	init();
	display();
	while (true)
	{
		string operate;
		rd *temp = new rd;
		temp->front = NULL;
		temp->next = NULL;
		temp->flage = 1;
		cout << "请求名称( shutdown 为结束标识符 )" << endl;
		cin >> temp->name;
		cout << "请求类型( 申请  完成 )" << endl;
		cin >> operate;
		if (operate == "shutdown")
		{
			cout << "此次首次适应算法分配结束!" << endl;
			return;
		}
		else if (operate == "申请")
		{
			temp->start = 0;
			cout << "请求大小" << endl;
			cin >> temp->size;
			

			rd *q = new rd;
			q->front = NULL;
			q->next = NULL;
			q->size = 0;
			q->flage = 0;
			q->start = 0;
			q->name = temp->name;

			rd *p = new rd;
			p = line;
			while (p != NULL)
			{
				if (!p->flage&&p->size > q->size)
				{
					q = p;
				}
				p = p->next;
			}

			if (q->size >= temp->size)
			{
				temp->start = q->start + (q->size - temp->size);
				q->size -= temp->size;
				cout << temp->start << "  " << q->size <<"  "<<line->size<< endl;
				if (q->next != NULL)
				{
					temp->next = q->next;		
					q->next->front = temp;
				}
				else
				{
					temp->next = NULL;
				}
				temp->front = q;
				q->next = temp;
			}
			else
			{
				cout << "申请失败!!!" << endl;
			}
			display();
		}
		else if (operate == "完成")
		{
			rd *p = new rd;
			p = line;
			while (p != NULL)
			{
				if (p->name == temp->name)
				{
					rd *q = new rd;
					q->flage = 0;
					q->name = "空";
					q->start = 0;
					q->size = maxsize;
					q->front = NULL;
					q->next = NULL;
				
					if (p->front != NULL)
					{
						q = p->front;
						if (p->front->front != NULL) q->front = p->front->front;
						else q->front = NULL;
					}
					if (!q->flage)
					{
						q->size += p->size;

						if (p->next != NULL && !p->next->flage)
						{
							q->size += p->next->size;
							if (q->next->next->next != NULL)
							{
								q->next->next->next->front = q;
								q->next = q->next->next->next;
							}
							else
							{
								q->next = NULL;
							}
						}
						else if (p->next != NULL)
						{
							q->next = p->next;
						}
						p = q->next;
					}
					else if (p->next != NULL && !p->next->flage)
					{
						p->size += p->next->size;
						if (p->next->next != NULL)
						{
							p->next->next->front = p;
							p->next = p->next->next;
						}
					}
					else if(((p->front != NULL && p->front->flage) || (p->front == NULL) &&((p->next != NULL && p->next->flage)||(p->next==NULL))))
					{
						p->flage = 0;
						p->name = "空";
						if (p->next != NULL)
						{
							p->next->front = p->front;
							p->front->next = p->next;
						}
					}
				}
				else p = p->next;
			}
			display();
		}
	}
}

int  main()
{
	cout << "      动态分区式存贮区管理 -- 王爱民      " << endl << endl;
	cout << "请输入放置策略序号 ①:首次 ②:最佳 ③:最坏" << endl;
	int n;
	cin >> n;
	switch (n)
	{
	case 1: firstmethod(); break;
	case 2: bestmethod(); break;
	case 3: badmethod(); break;
	default:cout << "请正确输入放置策略序号!!!" << endl; break;
	}
	return 0;
}

6.结论分析

初始界面:


首次适应算法申请过程:                                                 首次适应算法释放过程:
        

最佳适应算法申请过程:                            最佳适应算法释放过程:

最坏适应算法申请过程:                            最坏适应应算法释放过程:
          

End

展开阅读全文

没有更多推荐了,返回首页