📄 partition.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 + -