以下是关于 unsorted bin 的 bin头 的 fd 和 bk 指向的详细解释和结构图,涵盖不同链表情形:
1. 基础规则
在 glibc 的堆管理中:
unsorted bin是双向循环链表,遵循 FIFO(先进先出)规则。bin头的fd:指向链表的第一个 chunk(最靠近头部的 chunk)。bin头的bk:指向链表的最后一个 chunk(最靠近尾部的 chunk)。- 空链表时:
fd和bk均指向bin头自身。
2. 不同链表情形的结构图
(1) 空链表
当 unsorted bin 为空时,fd 和 bk 均指向自身:
1 | +-------------------+ |
(2) 单个 chunk(chunk1)
插入一个 chunk 后,链表形成循环:
1 | +-------------------+ +-------------------+ |
- 逻辑:
bin头的fd和bk均指向chunk1,chunk1的fd和bk回指bin头。
(3) 两个 chunk(chunk1 和 chunk2)
插入第二个 chunk 到链表头部后:
1 | +-------------------+ +-------------------+ +-------------------+ |
关键指针:
bin头.fd指向第一个 chunk(chunk2)。bin头.bk指向最后一个 chunk(chunk1)。chunk2.fd指向chunk1,chunk2.bk指向bin头。chunk1.fd指向bin头,chunk1.bk指向chunk2。
(4) 三个 chunk(chunk1、chunk2、chunk3)
插入第三个 chunk 到链表头部后:
1 | +-------------------+ +-------------------+ +-------------------+ +-------------------+ |
- 逻辑:新 chunk 插入链表头部,
bin头.bk始终指向尾部 chunk(chunk1)。
3. 动态操作示例
(1) 插入新 chunk
向空链表插入 chunk1:
1 | [初始] 空链表: |
(2) 从链表中移除 chunk
从两个 chunk 的链表中移除 chunk1:
1 | [移除前]: |
4. 总结
fd和bk的指向规则:
| 链表情形 | bin头.fd 指向 |
bin头.bk 指向 |
|---|---|---|
| 空链表 | &bin头 |
&bin头 |
| 单个 chunk | 第一个 chunk | 第一个 chunk |
| 多个 chunk | 第一个 chunk | 最后一个 chunk |
链表操作规则:
插入:新 chunk 插入链表头部(
bin头.fd更新为新 chunk)。移除:从头部或尾部移除 chunk,保持双向链表的完整性。