简单内存分配算法相关内存布局

nfcac 2008-12-18 10:31:39
近日读到一段内存分配算法,但对算法内数据结构的内存布局没有搞明白.
程序如下:
onst int SEG_LEN = 128-4;
struct Mem_seg
{
char mem [SEG_LEN];
Mem_seg * next;
};

struct Mem_list
{
Mem_list(Mem_seg *h, Mem_seg *e)
:head(h),end(e)
{
}
Mem_seg * head;
Mem_seg * end;
};

Mem_list mem_init(char * all_mem, int free_size)
{
int seg_num = free_size / SEG_LEN;
for(int i=0;i<seg_num;++i)
((Mem_seg *)&all_mem[i * SEG_LEN])->next=(Mem_seg *)&all_mem[(i+1)*SEG_LEN];
return Mem_list((Mem_seg *)all_mem,(Mem_seg *)&all_mem[seg_num * SEG_LEN]);
}
...
void test_list(Mem_list test_list)
{
std::ofstream outfile;
outfile.open("test.txt", std::ios::app);
Mem_seg * phead = test_list.head;
Mem_seg * pend = test_list.end;

for(int i=0; phead != pend;phead=phead->next,i++)
outfile<<"head"<<":"<<phead<<",\t"
<<i<<":"<<&(phead->mem)<<",\t"
<<i<<":"<<&(phead->next)<<",\t"
<<i<<":"<<phead->next<<",\t"
<< "sizeof" << ":" << sizeof(*phead) << ",\t";

outfile<<std::endl;
outfile.close();
}
int main()
{

long mem_len = 384;
//long mem_len = 1024*8;
char *all_mem= new char[mem_len];
Mem_list free_list=mem_init(all_mem,mem_len);
test_list(free_list);

结果如下
head:0x8b1120, 0:0x8b1120, 0:0x8b119c, 0:0x8b119c, sizeof:128,
head:0x8b119c, 1:0x8b119c, 1:0x8b1218, 1:0x8b1218, sizeof:128,
head:0x8b1218, 2:0x8b1218, 2:0x8b1294, 2:0x8b1294, sizeof:128,
我的问题是内存里到底如何布局的,一段char数组,是不是包含了next指针(按照结构内存对其,理论上应该char[124]紧邻一个指针),还是没有包含,如果包含了那0-124是char,124-128是指针吗,但是为什么指针的指和指针的地址一样呢,如果一样岂不是下一个struct开头是上一个struct的next指针。如果没有包含那指针放到哪里去了,而且为什么指针地址貌似还在数组中
...全文
114 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyisnail 2008-12-19
  • 打赏
  • 举报
回复
这里有问题,内存布局如下:
Mem_seg:
------------------
| char[124] |
|------------------|
| Mem_seg* next |但是初始化后该指针指向自己
|------------------|
Mem_list mem_init(char * all_mem, int free_size)
{
int seg_num = free_size / SEG_LEN;
for(int i=0;i <seg_num;++i)
((Mem_seg *)&all_mem[i * SEG_LEN])->next=(Mem_seg *)&all_mem[(i+1)*SEG_LEN];
~~~问题出在这里,SEG_LEN=124,而不是128所以初始化后每个Mem_seg的指针都指向了自己
return Mem_list((Mem_seg *)all_mem,(Mem_seg *)&all_mem[seg_num * SEG_LEN]);
}
应该如下修改,就比较正确了

const int SEG_LEN = 128;
struct Mem_seg
{
char mem [SEG_LEN-4];
Mem_seg * next;
};
nfcac 2008-12-19
  • 打赏
  • 举报
回复
多谢Chiyer,xiaoyisnail,确实错了,我也是狐疑了半天
星羽 2008-12-19
  • 打赏
  • 举报
回复
注意数据块的大小是int block_size = SEG_LEN + 4;

而不是SEG_LEN ,否则你的偏移就有错了
  • 打赏
  • 举报
回复
楼主,帮顶,你是不是发错地方了?
星羽 2008-12-19
  • 打赏
  • 举报
回复
init 函数改一下


Mem_list mem_init(char * all_mem, int free_size)
{
int block_size = SEG_LEN + 4;
int seg_num = free_size / block_size;
for(int i=0;i <seg_num;++i)
((Mem_seg *)&all_mem[i * block_size])->next=(Mem_seg *)&all_mem[(i+1)*block_size];
return Mem_list((Mem_seg *)all_mem,(Mem_seg *)&all_mem[seg_num * block_size]);
}


--------

结果

head:009B1208, 0:009B1208, 0:009B1284, 0:009B1288, sizeof:128, head:009B1288, 1:009B1288, 1:009B1304, 1:009B1308, sizeof:128, head:009B1308, 2:009B1308, 2:009B1384, 2:009B1388, sizeof:128,


实验题目 设计和实现关于内存管理的内存布局初始化及内存申请分配、内存回收等基本功能操作函数,尝试对用256MB的内存空间进行动态分区方式模拟管理。内存分配的基本单位为1KB,同时要求支持至少两种分配策略,并进行测试和对不同分配策略的性能展开比较评估。 最佳适应算法(Best Fit):    它从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。该算法保留大的空闲区,但造成许多小的空闲区。因为它要不断地找出能满足作业要求的、且大小最小的空闲分区,所以比较比较频繁。但是,对内存的利用率高 循环首次适应算法(Next Fit):    该算法是首次适应算法的变种。在分配内存空间时,不再每次从表头(链首)开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。比较次数少于最佳适应算法(Best Fit),内存利用率低于最佳适应算法(Best Fit)。

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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