c – linux中的内存管理:实现第一个适合
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c – linux中的内存管理:实现第一个适合,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2465字,纯文字阅读大概需要4分钟。
内容图文
![c – linux中的内存管理:实现第一个适合](/upload/InfoBanner/zyjiaocheng/955/a4788ceba0674da8b4a705f4150aeb02.jpg)
我有任务,我尽力而为,但无论我尝试什么,我都无法得到最合适的方案.以下是代码.为了实现最佳拟合,我对slob_page_alloc函数进行了更改.代码如下:
static void *slob_page_alloc(struct page *sp, size_t size, int align)
{
slob_t *prev, *cur, *aligned = NULL, *best_fit=NULL;
/* See SLOB_UNITS defination for meaning of macro. units is required
* number OF units.*/
int delta = 0, units = SLOB_UNITS(size);
unsigned long frag_size = -1UL;
/*Iterate throught the whole page to find best fit*/
//printk("Before the for loop\n");
printk("Starting slob_page_alloc execution\t");
for(prev=NULL, cur=sp->freelist; ; prev=cur, cur=slob_next(cur)) {
slobidx_t avail = slob_units(cur);
if(align) {
aligned = (slob_t *)ALIGN((unsigned long)cur, align);
delta = aligned - cur;
}
if(avail >= delta+units) {
if( frag_size > avail-units ) {
frag_size = avail-units;
best_fit = cur;
}
}
if(slob_last(cur))
break;
}
//printk("after the for loop.\n");
if(best_fit) {
slobidx_t avail = slob_units(best_fit);
//printk("best fit found\n");
if (align) {
aligned = (slob_t *)ALIGN((unsigned long)best_fit, align);
delta = aligned - best_fit;
}
if (avail >= units + delta) { /* room enough? */
slob_t *next;
if (delta) { /* need to fragment head to align? */
next = slob_next(best_fit);
/*Update the newly fragmented slob*/
set_slob(aligned, avail - delta, next);
/* Update the lod slob about reduced size
* and new next slob*/
set_slob(best_fit, delta, aligned);
prev = best_fit;
best_fit = aligned;
avail = slob_units(best_fit);
}
next = slob_next(best_fit);
if (avail == units) { /* exact fit? unlink. */
if (prev)
set_slob(prev, slob_units(prev), next);
else
sp->freelist = next;
} else { /* fragment */
if (prev)
set_slob(prev, slob_units(prev), best_fit + units);
else
sp->freelist = best_fit + units;
set_slob(best_fit + units, avail - units, next);
}
sp->units -= units;
if (!sp->units)
clear_slob_page_free(sp);
printk("Returned from slob_page_alloc\t");
return best_fit;
}
}
printk("Returned from slob_page_alloc\t");
return NULL;
}
当我用这个方案配置内核时,它只是挂在某个地方.
调试:
我已经在这个函数的某个地方和slob_alloc函数中完成了打印.虽然它对我没有任何意义,但我的函数被多次调用并成功返回,然后再次被调用并返回等等.但有一次它被调用打印出这个函数内的语句,但是不打印来自被调用者的语句而只是无限期地挂起.
任何帮助表示赞赏!!
谢谢.
解决方法:
问题是prev指针是错误的,因为你没有
当你找到best_fit但打破了slob_last(cur)时休息.
best_fit指针是最后一个best_fit,但prev是最后一个.
稍后在代码列表-s中进行修改,假设为prev
是best_fit的热门词条.当列表被搞乱时,你会得到一个无限循环.
内容总结
以上是互联网集市为您收集整理的c – linux中的内存管理:实现第一个适合全部内容,希望文章能够帮你解决c – linux中的内存管理:实现第一个适合所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。