★★★ C语言的首次匹配(first fit),改"最佳适配"和"最差适配", up有分 ★★★

lamplight007 2006-12-03 05:48:28
/////////////////////////////////////////////////////////////////

下面这个程序是C语言的首次匹配(first fit)写的。

想改为最佳适配(best fit)和最差适配(worst fit)

已经很多天了,还是不成功。请高人指点。

/////////////////////////////////////////////////////////////////


首次匹配(first fit),按分区的先后次序,从头查找,找到符合要求的第一个分区
最佳适配(best fit),找到其大小与要求相差最小的空闲分区
最差适配(worst fit),找到最大的空闲分区

/////////////////////////////////////////////////////////////////


void *mm_request( UINT sz )
{
void *pRet = NULL;
struct VListHead *pTmpList = listHead.next;

sz = (sz+3)/4+2;//转换为DWORD数,再加上2个DWORD的附加信息
if (sz < 4 )//最小块是4个DWORD
{
sz = 4;
}
while ( pTmpList != &listHead )//遍历空闲表(首次匹配)
{
UINT *pBlockHead = (UINT*)pTmpList - 1;
UINT objSz = GetBlockHeadSize(pBlockHead);
if ( objSz >= sz )//找到满足要求的空闲块
{
pRet = pTmpList;
UseBlock( pBlockHead );//设置使用标记
delList(pTmpList);
break;
}

pTmpList = pTmpList->next;
}
return pRet;
}
...全文
652 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lamplight007 2006-12-03
  • 打赏
  • 举报
回复
如何增加完全遍历啊。小弟新手,调试这个程序好多天了。
搞不定啊,抓狂了

谢谢帮忙啊
jixingzhong 2006-12-03
  • 打赏
  • 举报
回复
程序果然够长的啊 ~~~
jixingzhong 2006-12-03
  • 打赏
  • 举报
回复
增加一次完全遍历....
lamplight007 2006-12-03
  • 打赏
  • 举报
回复

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

程序有点长,CSDN放不上去,我传到这里了 http://cprogramm.xinwen365.net/
请大家帮忙看看啊~~~~~~~~~~~~~~~~~~~~

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
lamplight007 2006-12-03
  • 打赏
  • 举报
回复
还是不对啊,程序编译没有问题。
首次匹配运行良好。
最佳适配和最差适配还是运行不正确

大家帮忙看看啊~~~~~~~~~~

程序有点长,CSDN放不上去,我传到这里了 http://cprogramm.xinwen365.net/

我的email地址 leijun8088@yahoo.com.cn ,请大家指点啊~~~~~~~~~~
AI风 2006-12-03
  • 打赏
  • 举报
回复
最佳适配(best fit):
void *mm_request( UINT sz )
{
void *pRet = NULL;
struct VListHead *pTmpList = listHead.next;

sz = (sz+3)/4+2;//转换为DWORD数,再加上2个DWORD的附加信息
if (sz < 4 )//最小块是4个DWORD
{
sz = 4;
}

UINT nMinOff = 0xffffffff;
while ( pTmpList != &listHead )//遍历空闲表(首次匹配)
{
UINT *pBlockHead = (UINT*)pTmpList - 1;
UINT objSz = GetBlockHeadSize(pBlockHead);
if((objSz - sz) < nMinOff)
{
nMinOff = objSz - sz;
if(nMinOff == 0)
{
pRet = pTmpList;
UseBlock( pBlockHead );//设置使用标记
delList(pTmpList);
break;
}
pRet = pTmpList;
}

pTmpList = pTmpList->next;
}
return pRet;
}

最差适配(worst fit):
void *mm_request( UINT sz )
{
void *pRet = NULL;
struct VListHead *pTmpList = listHead.next;

sz = (sz+3)/4+2;//转换为DWORD数,再加上2个DWORD的附加信息
if (sz < 4 )//最小块是4个DWORD
{
sz = 4;
}

UINT nMinOff = 0;
while ( pTmpList != &listHead )//遍历空闲表(首次匹配)
{
UINT *pBlockHead = (UINT*)pTmpList - 1;
UINT objSz = GetBlockHeadSize(pBlockHead);
if((objSz - sz) > nMinOff)
{
nMinOff = objSz - sz;
pRet = pTmpList;
}

pTmpList = pTmpList->next;
}
return pRet;
}
lamplight007 2006-12-03
  • 打赏
  • 举报
回复
感谢 : studying (95)、 jixingzhong (5)、
AI风 2006-12-03
  • 打赏
  • 举报
回复
我改写了一下这两个函数,经过调试可以通过,这个程序我发到你邮箱去了:

void *mm_request_best( UINT sz )
{
void *pRet = NULL;
struct VListHead *pTmpList = listHead.next;

sz = (sz+3)/4+2;//转换为DWORD数,再加上2个DWORD的附加信息
if (sz < 4 )//最小块是4个DWORD
{
sz = 4;
}

UINT nMinOff = 0xffffffff;
while ( pTmpList != &listHead )
{
UINT *pBlockHead = (UINT*)pTmpList - 1;
UINT objSz = GetBlockHeadSize(pBlockHead);
UINT nTemp = objSz - sz;
if(nTemp < nMinOff && (int)(nTemp) > 0)
{
nMinOff = nTemp;
if(nMinOff == 0)
{
pRet = pTmpList;
UseBlock( pBlockHead );//设置使用标记
delList(pTmpList);
break;
}
pRet = pTmpList;
}

pTmpList = pTmpList->next;
}

//找到了最佳配匹
if(nMinOff < 0xffffffff && nMinOff != 0)
{
UINT *pBlockHead = (UINT*)pRet - 1;
UINT objSz = GetBlockHeadSize(pBlockHead);

UseBlock( pBlockHead );//设置使用标记
delList((struct VListHead*)pRet);

//判断是否要分割
if ( objSz >= sz + 4 )//最小分割块的大小是4个DWORD(用于建立隐式表和空闲表)
{
SetBlockHeadSize( pBlockHead, sz );
setBlockFoot( pBlockHead );

pBlockHead = nextBlock( pBlockHead );//将新的空闲块加入空闲表
UnUseBlock(pBlockHead);
SetBlockHeadSize( pBlockHead, objSz - sz );
setBlockFoot( pBlockHead );

addFreeList( pBlockHead );//加入空闲表
}
else
{
SetBlockHeadSize( pBlockHead, objSz );
setBlockFoot( pBlockHead );
}
}

return pRet;
}


void *mm_request_worst( UINT sz )
{
void *pRet = NULL;
struct VListHead *pTmpList = listHead.next;

sz = (sz+3)/4+2;//转换为DWORD数,再加上2个DWORD的附加信息
if (sz < 4 )//最小块是4个DWORD
{
sz = 4;
}

UINT nMinOff = 0;
while ( pTmpList != &listHead )
{
UINT *pBlockHead = (UINT*)pTmpList - 1;
UINT objSz = GetBlockHeadSize(pBlockHead);
if((objSz - sz) > nMinOff)
{
nMinOff = objSz - sz;
pRet = pTmpList;
}

pTmpList = pTmpList->next;
}

//找到了最差配匹
if(nMinOff > 0)
{
UINT *pBlockHead = (UINT*)pRet - 1;
UINT objSz = GetBlockHeadSize(pBlockHead);

UseBlock( pBlockHead );//设置使用标记
delList((struct VListHead*)pRet);

//判断是否要分割
if ( objSz >= sz + 4 )//最小分割块的大小是4个DWORD(用于建立隐式表和空闲表)
{
SetBlockHeadSize( pBlockHead, sz );
setBlockFoot( pBlockHead );

pBlockHead = nextBlock( pBlockHead );//将新的空闲块加入空闲表
UnUseBlock(pBlockHead);
SetBlockHeadSize( pBlockHead, objSz - sz );
setBlockFoot( pBlockHead );

addFreeList( pBlockHead );//加入空闲表
}
else
{
SetBlockHeadSize( pBlockHead, objSz );
setBlockFoot( pBlockHead );
}
}

return pRet;
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧