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

📄 partition.cpp

📁 要求首先采用动态分区方案
💻 CPP
字号:
// Partion.cpp: implementation of the CPartion class.
//
//////////////////////////////////////////////////////////////////////

#include "Partition.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CPartition::CPartition()
{
	m_pMem = new CMemory();
	m_pAvail = new CAvail();
	m_pFull = new CFull();
	m_pAvail->Add(SYS_ADDR,MAX_SIZE-SYS_SIZE);
	m_pMem->LoadSystem();
	m_pFull->Add(0,SYS_SIZE);
}

CPartition::~CPartition()
{
	m_pMem->UnloadSystem();
	delete m_pMem;
	delete m_pAvail;
	delete m_pFull;
}

pMem CPartition::Alloc(int size)
{
	pItem p = m_pAvail->GetAvail();
	pMem memBlock = NULL;
	while (p)
	{
		p = p->next;
		if (p == NULL)	//搜索至链尾
		{
			printf("Failed to alloc Partition...\n");
			break;
		}
		if (p->m_nSize < size)	//请求空间不够则重新搜索
		{
			continue;
		}
		int addr = p->m_nAddr;	//获得分区始址
		pMem block = m_pMem->GetBlockFromAddr(addr);	//由始址映射物理块
		if (p->m_nSize == size)	//恰好能分配
		{
			memBlock = m_pMem->GetBlockFromAddr(addr);
			m_pFull->Add(addr,size);	//添加到已分配链
			m_pAvail->Remove(addr);	//从可用分区链中移除
			block->m_bAlloc = true;	//更新状态标记
		}
		else	//搜索到分区大于请求分区
		{
			memBlock = m_pMem->Split(block,size);	//内存分割
			m_pAvail->Update(memBlock->m_nAddr,size,true);	//更新可以分区链
			m_pFull->Add(memBlock->m_nAddr,size);	//添加所得分区至已分配链
			memBlock->m_bAlloc = true;
		}
		break;
	}
	return memBlock;
}


void CPartition::Revoke(int addr)
{
	pItem p = m_pFull->GetFull();
	pMem block = NULL;
	while (p)
	{
		p = p->next;
		if (p == NULL)	//搜索至链尾
		{
			printf("Failed to revoke partition...\n");
			break;
		}
		if (p->m_nAddr > addr)	//地址不合适
		{
			printf("No such partition...\n");
			break;
		}
		if (p->m_nAddr == addr)	//搜索到地址块
		{			
			m_pAvail->Add(addr,p->m_nSize);	//添加至可用链中
			m_pFull->Remove(addr);	//从已用链中移除
			pMem b = m_pMem->GetBlockFromAddr(addr);//获得内存物理块的引用
			block = m_pMem->Compact(b);	//内存整理
			block->m_bAlloc = false;	//更新物理内存块状态
			block->m_nJid = -1;		//内存块不再属于任何作业
			break;
		}
	}
}

void CPartition::Init()
{
}


int CPartition::LoginToPhs(int nPar, int nAddr) const
{
	pMem block = m_pMem->GetBlockFromPat(nPar);
	if (!block)
	{
		printf("No such partition...\n");
		return -1;
	}
	if (block->m_nSize <= nAddr)
	{
		printf("Address overflow...\n");
		return -1;
	}
	return (block->m_nAddr + nAddr);
}

⌨️ 快捷键说明

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