`
xkxjy
  • 浏览: 43702 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

链表法页框的分配和去配

 
阅读更多

采用链表的方法模拟分页式存储空间的分配和去配,

MemManager.h

#pragma once

#define MAX_MEM_LEN 512

class CMemManager
{
private:
	struct MemItem {
		struct MemItem* prior;
		struct MemItem* next;
		bool bFree;
		int nPos;
		int nLen;
		int nOwner;
		MemItem(MemItem* pri, MemItem* nxt, bool bfree, int nPosition, int nLength)
		{
			prior = pri;
			next = nxt;
			bFree = bfree;
			nPos = nPosition;
			nLen = nLength;
			nOwner = -1;
		}
	};	
public:
	CMemManager(void);
	~CMemManager(void);
private:
	const static int m_csnMemBlock = MAX_MEM_LEN;
	int m_MemBlocks[MAX_MEM_LEN];
	MemItem* m_pBase;
public:
	void* GetMem(int nSize, int nOwner);
	void FreeMem(void* p);
	void Show(void);
};

 
MemManager.cpp

#include <iostream>
#include "MemManager.h"

using namespace std;

CMemManager::CMemManager(void)
{
	m_pBase = new MemItem(0, 0, true, 0, m_csnMemBlock);
}

CMemManager::~CMemManager(void)
{
	delete m_pBase;
	m_pBase = 0;
}
void* CMemManager::GetMem(int nSize, int nOwner)
{
	MemItem* p = 0;
	for (MemItem* pTemp = m_pBase; pTemp; pTemp = pTemp->next) 
	{
		if (pTemp->bFree && pTemp->nLen >= nSize)
		{
			int nLeft = pTemp->nLen - nSize;
			if (0 == nLeft) 
			{
				pTemp->bFree = false;
				p = pTemp;
			}
			else 
			{
				p = new MemItem(pTemp, pTemp->next, true, pTemp->nPos+nSize, nLeft);
				if (!p) {
					break;
				}
				if (pTemp->next) {
					pTemp->next->prior = p;
				}
				pTemp->next = p;
				pTemp->bFree = false;
				pTemp->nLen = nSize;
				p = pTemp;
			}
			p->nOwner = nOwner;
			break;
		}
	}
	
	return p; // fail
}
void CMemManager::FreeMem(void* p)
{
	MemItem* pItem = static_cast<MemItem*>(p);
	pItem->bFree = true;
	bool bDelete = false;
	if (pItem->next && pItem->next->bFree) {
		MemItem* pTemp = pItem->next;
		pItem->next = pTemp->next;
		if (pTemp->next) {
			pTemp->next->prior = pItem;
		}
		pItem->nLen += pTemp->nLen;
		delete pTemp;
	}
	if (pItem->prior && pItem->prior->bFree) {
		pItem->prior->next = pItem->next;
		if (pItem->next) {
			pItem->next->prior = pItem->prior;
		}
		pItem->prior->nLen += pItem->nLen;
		delete pItem;
	}
}
void CMemManager::Show(void)
{
	cout << endl << "------------------------------------" << endl;
	for (MemItem* p = m_pBase; p; p = p->next) 
	{
		cout << "Free: " << (p->bFree ? "true          " : "false") << "  ";
		if (!p->bFree) {
			cout << "Owner: " << p->nOwner << " ";
		}
		cout << "Pos: " << p->nPos << "  "
			<< "Length: " << p->nLen << endl;
	}
	
}

 

测试代码

#include <iostream>
#include <ctime>
#include "MemManager.h"

using namespace std;

CMemManager g_mem;

int main()
{	
	int a;
	void* pArray[10] = {0};
	srand((unsigned int)time(0));
	while (cin >> a)
	{
		int i = rand() % 10;
		cout << "i = " << i;
		
		if (pArray[i]) {
			g_mem.FreeMem(pArray[i]);
			pArray[i] = 0;
		} else {
			int nLen = rand() % 128;
			cout << "  nLen = " << nLen;
			pArray[i] = g_mem.GetMem(nLen, i);
		}
		g_mem.Show();
	}

	return 0;
}

 

 

分享到:
评论

相关推荐

    动态内存分配--链表

    在本项目中,我们将关注如何在VC++6.0环境下使用动态内存分配来创建和操作链表。 链表是一种线性数据结构,其元素不连续存储,而是通过指针链接。每个链表节点包含两部分:数据域,用于存储实际的数据;指针域,...

    链表操作注意顺序法和倒叙法

    注意创建链表时,顺序法和倒叙法的不同。注意创建链表时,顺序法和倒叙法的不同。

    josephus(链表法)

    总的来说,Josephus问题的链表法实现既展示了链表数据结构的强大功能,也考验了程序员对链表操作的理解和控制流程的设计能力。通过这样的问题,我们可以深入学习和掌握链表操作、循环逻辑以及复杂算法的实现。

    集合(链表和数组的区别) 数组和链表.pdf

    链表动态分配内存,即链表的大小和内存地址是在运行时确定的。这种差异会影响到数组和链表的使用场景。 2. 内存布局 数组在内存中是连续的,即数组的每个元素在内存中是相邻的。链表在内存中是不连续的,即链表的...

    静态链表和动态链表详细讲解教程

    静态链表和动态链表详细讲解教程 本资源讲解了链表的基本概念和实现方式,着重介绍了静态链表和动态链表的区别和应用场景。链表是一种常见的数据结构,它由多个节点组成,每个节点都包含一个数据域和一个指向下一个...

    操作系统课程设计模拟内存管理 未示图和空闲链表法c#可视化编程

    在空闲链表法中,可以对链表进行排序,按照内存块的大小进行排列,以便更有效地分配和整合内存。 总的来说,这个课程设计涵盖了操作系统核心概念——内存管理,具体到C#编程语言和可视化设计,旨在让学习者深入理解...

    数据结构___头插法和尾插法建立链表(各分有无头结点).doc

    数据结构___头插法和尾插法建立链表(各分有无头结点) 本文将详细介绍头插法和尾插法建立链表的算法思想、实现方法和代码实现。链表是一种常用的数据结构,它可以动态地存储和管理大量数据。链表可以分为带头结点和...

    C语言动态分配内存和链表共11页.pdf.zip

    在C语言中,动态内存分配是一项...总的来说,C语言中的动态内存分配和链表是程序设计中的核心概念,对于开发高效、灵活的程序至关重要。理解并正确使用这些技术可以解决许多复杂问题,同时避免内存管理错误导致的问题。

    双向链表法实现malloc和free

    自己实现的malloc 和 free 用的双向链表 尽量做了注释

    关于链表的创建和对链表的操作

    在本文中,我们将深入探讨线性单链表的创建和操作,包括链表结点的定义、链表指针类型、创建链表结点的函数、创建线性表的函数、向链表末尾追加元素、获取链表元素地址、删除链表元素以及清空链表。 首先,链表结点...

    python算法-数组和链表 数组和链表.pdf

    Python算法-数组和链表 Python算法中,数组和链表是两种常用的数据结构。它们都是用于存储和管理数据的,但是它们在实现和使用上有很大的区别。 数组是具有相同的数据类型且按一定次序排列的集合体。它的元素在...

    链表-头插法,尾插法,中间插入.zip

    本资料包聚焦于链表的三种插入操作:头插法、尾插法以及中间插入。 1. 头插法: 头插法是在链表的开头插入新节点的方法。首先,新节点被创建并设置其值。接着,新节点的`next`指针指向当前链表的头节点。最后,链表...

    大数的四则运算(双向链表法)

    此外,为了保持效率,应尽可能减少不必要的节点创建和销毁,例如在加法和乘法中,可以通过预先分配内存和复用节点来优化。 双向链表法在处理大数运算时,相比传统的数组或字符串方法,具有一定的优势。它可以方便地...

    模拟设计页式存储管理的分配与回收

    3. **分配段和页框**:分配新段时,先分配段在主存的位置,然后为段内的页分配页框。 4. **建立映射**:更新段表和段内页表,建立逻辑地址到物理地址的映射。 5. **回收资源**:释放段时,首先回收段内的页框,...

    操作系统 成组链接法

    通过上述的C++实现,成组链接法能够有效地支持动态的内存分配和释放,同时减少了页框分配和释放的操作复杂性,提高了操作系统的性能。然而,这种方法也存在缺点,如可能导致内存碎片,以及在处理大量小页面请求时...

    如何建立链表及链表的前后插入法,求源代码?

    ### 如何建立链表及链表的前后插入法 #### 链表基础知识 链表是一种常见的线性数据结构,由一系列节点组成,每个节点包含数据域和指向下一个节点的指针域。链表相对于数组而言,具有动态分配内存、方便插入与删除等...

    uC/OS-II学习笔记—空闲链表和就绪链表

    uC/OS-II学习笔记—空闲链表和就绪链表 uC/OS-II是实时操作系统,任务控制块是uC/OS-II中最基本的数据结构,它...uC/OS-II的任务控制块链表管理机制可以确保任务的高效管理和分配,从而提高系统的实时性能和可靠性。

    python的链表与数组对比,优势和劣势 数组和链表.pdf

    链表与数组对比,python链表实现和优缺势分析 python链表是一种常用的数据结构,它可以高效地存储和操作大量数据。与数组相比,链表有其独特的优缺点,本文将对python链表的实现、优缺点进行详细分析。 Python...

Global site tag (gtag.js) - Google Analytics