一定大小的chunk被释放时,在进入small bin或者large bin之 前,会先加入unsorted bin。在实践中,一个被释放的chunk常常很 快就会被重新使用,所以将其先加入unsorted bin可以加快分配的速 度。unsorted bin使用双链表结构,并采用FIFO(先进先出)的分 配策略。与fastbinsY不同,unsroted bin中的chunk大小可能是不 同的,并且由于是双链表结构,一个bin会占用bins的两个元素
时间: 2024-04-16 13:25:55 浏览: 76
是的,您描述的情况是正确的。在堆管理中,当一个特定大小的内存块被释放时,它通常会先被放入未排序块(unsorted bin),然后再按照一定的策略被重新分配。
将被释放的内存块放入未排序块有几个原因:
1. 提高分配速度:由于被释放的内存块很可能很快就会被重新分配使用,将其放入未排序块可以加快分配速度,避免在其他列表中搜索可用内存块。
2. 整理内存:将被释放的内存块放入未排序块可以帮助整理堆中的内存空间,减少碎片化。
3. 充分利用:通过将被释放的内存块放入未排序块,可以最大程度地利用已经存在的内存块,而不是立即将其合并到其他块中。
未排序块使用双链表结构,其中每个元素都包含指向前一个和后一个块的指针,形成一个链表。由于是FIFO(先进先出)的分配策略,新释放的内存块会被添加到链表的最前面。
与快速块(fastbins)不同,未排序块中的内存块大小可能是不同的,并且每个未排序块占用堆管理数据结构中两个元素的空间,即前驱指针和后继指针。这是因为未排序块是一个双链表,需要存储前后两个指针来维护链表的连接关系。
相关问题
if (in smallbin range (nb) &&//申请的 chunk在 small bin 范围内bck == unsorted chunks (av) && //victim必须是unsorted bin中唯一的chunkvictim == av->last remainder && // victim必须是last remainder(unsigned long) (size) > (unsigned long) (nb + MINSIZE))// victim 至少要大于 nb+MINSIZE才可以拆分 /* split and reattach remainder */remainder size = size - nb;remainder = chunk at offset (victim,nb);//将remainder 加入unsorted bin中,同时记录为 last remainderunsorted chunks (av)->bk = unsorted chunks (av)->fd = remainder;av->last remainder = remainder;remainder->bk = remainder->fd = unsorted chunks (av);// 如果remainder在large bin 范围内,清空fd nextsize和bk nextsize 指针if (!in smallbin range (remainder size)) [remainder->fd nextsize = NULL;remainder->bk nextsize = NULL; // 切分后得到 remainder // 设置 remainder 的状态位 set head (victim,nb I PREV INUSE I(av != &main arena ? NON MAIN ARENA : 0));set head(remainder, remainder size l PREV INUSE);set foot(remainder, remainder size); check malloced chunk (av,victim,nb); // debug 时用来检查 chunk状态void *p = chunk2mem (victim);// 获得指向user data 的指针,返回给用户//如果设置了perturb_type,将chunk的user data初始化为perturb type ^ Oxff alloc_perturb (p,bytes); return p;}
这段代码片段看起来是一段用于内存分配的代码,它包含了一些条件判断和操作来处理分配的内存块。
根据代码的注释,可以看出以下几个步骤:
1. 首先,代码判断了申请的内存块是否在 small bin 范围内,并且满足一些其他条件,如 `bck == unsorted chunks (av)` 和 `victim == av->last remainder`。这些条件可能是为了确保从 unsorted bin 中选择了合适的 victim。
2. 如果满足条件,代码会将剩余的内存块进行切分,并重新连接到 unsorted bin。具体操作是通过计算剩余的大小和使用偏移来获取剩余的内存块,并将其加入到 unsorted bin 中,并更新 `av->last remainder`。
3. 如果剩余的内存块不在 small bin 范围内,代码会清空 `remainder->fd nextsize` 和 `remainder->bk nextsize` 指针。这可能是为了在 large bin 中处理剩余的内存块。
4. 接下来,代码对 victim 和 remainder 进行了一系列的设置,包括设置状态位和检查分配的 chunk 的状态。
5. 最后,代码将 victim 转换为指向用户数据的指针,并根据需要初始化用户数据。
整个过程最终返回指向用户数据的指针 `p`。
请注意,这段代码片段可能是从某个特定上下文中提取的,我无法提供完整的代码和上下文。所以如果你需要更多信息或者有其他问题,请提供更多细节。
malloc(): invalid size (unsorted)
错误"malloc(): invalid size (unsorted)"是由于在对chunk的size进行检查时发现异常导致的。具体代码位置是在检查unsorted bin中的chunk的size时发生的。\[1\]
这个错误通常出现在使用网络爬虫代码时,其中一个常见的错误是在https://github.com/JamesRead5737/webcrawler/blob/master/crawler.c中出现了"malloc(): invalid size (unsorted)"错误。\[2\]
unsorted bin是一种用于快速找到最近被释放的chunk以加速内存分配效率的数据结构。当small chunk和large chunk被释放时,它们首先会被加入到unsorted bin中。unsorted bin只有一个,并且其中的chunk大小可以各不相同。unsorted bin和small bins以及large bins共用一个数组,其中数组中的元素只是记录了fd和bk两个指针,并不是一个malloc_chunk的结构体指针。\[3\]
综上所述,"malloc(): invalid size (unsorted)"错误是由于对chunk的size进行检查时发现异常导致的,通常出现在使用网络爬虫代码时。unsorted bin是一种用于快速找到最近被释放的chunk以加速内存分配效率的数据结构。
#### 引用[.reference_title]
- *1* *3* [glibc堆内存管理](https://blog.csdn.net/qq_35018427/article/details/125975621)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* [为什么会报错 malloc(): invalid size (unsorted)?](https://blog.csdn.net/zhishifufei/article/details/127944166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文