POJ 1193 内存分配

该博客讨论了如何运用数据结构(双向链表、小根堆、队列)和算法来解决POJ 1193内存分配问题。通过模拟内存分配,使用小根堆表示进程表并按结束时间排序,使用先进先出队列管理等待队列,实现了高效的内存管理和进程调度策略。文章详述了整个算法流程,并提到代码量较大。
摘要由CSDN通过智能技术生成

数据结构:

内存用双向链表模拟,便于内存块的拆分和合并;

进程表用小根堆表示,以进程的结束时间为排序依据;

等待队列就是用先进先出的队列结构了。

算法描述:

设任一时刻当前需要被处理的进程为p1,进程表堆顶进程为p2,等待队列队头进程为p3,进入过等待队列的进程总数为count,所有进程运行完毕的时间为duration。

1、如果所有进程都已经被处理并且进程表也为空,则算法结束,否则执行第2步。

2、如果还有进程未被处理则执行第3步;否则,执行第6步。

3、如果进程表为空则执行第5步,否则执行第4步。

4、检测p1的起始时间是否小于进程表中所有进程的结束时间(由于进程表具有小根堆的性质,只需要和p2的结束时间比较即可),如果小于则执行第5步;否则执行第6步。

5、尝试给p1分配内存, 如果成功则更新p1的结束时间(p1的结束时间 = p1的开始时间 + p1的运行时间),并且将其加入进程表中,同时调整进程表的结构以保持小根堆性质;如果失败,将其加入等待队列,更新count(count = count + 1),转到第1步。

6、更新duration(duration = p2的结束时间),销毁进程表中所有结束时间等于duration的进程,也需要调整进程表的结构以保持小根堆性质,释放它们所占用的内存,执行第7步。

7、尝试给p3分配内存,如果成功则更新p3的结束时间(p3的结束时间 = duration + p3的运行时间),并且将其加入到进程表中,同时从等待队列中删除,此时同样需要调整进程表的结构以保持小根堆性质,继续执行第7步;否则转到第1步。

PS:描述不清楚或者错误还请指正,代码有点多~~~

#include <stdio.h>
#define MAX_COUNT		10010
#define LEFT_CHILD(x)	(2 * x + 1)
#define RIGHT_CHILD(x)	(2 * x + 2)
#define PARENT(x)		((x - 1) / 2)

//MemoryNode
typedef struct _MemoryNode
{
	int size;
	int status;
	struct _MemoryNode *prev;
	struct _MemoryNode *next;
} MemoryNode;

//Memory
typedef struct _Memory
{
	MemoryNode head;
	MemoryNode unused;
	MemoryNode buffer[MAX_COUNT];
} Memory;

//method of Memory
void MemoryInit(Memory *m, int size)
{
	int i;
	MemoryNode *prev = NULL;
	MemoryNode *next = NULL;

	m->head.size = size;
	m->head.status = 0;
	m->head.prev = NULL;
	m->head.next = NULL;

	m->unused.size = 0;
	m->unused.status = 0;
	m->unused.prev = NULL;
	m->unused.next = m->buffer;

	prev = &m->unused;
	next = m->buffer;
	for (i = 0; i < MAX_COUNT - 1; i++)
	{
		next->size = 0
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值