当内核需要紧急释放内存时,JBD2 中的检查点是如何管理的?
How the checkpoint in JBD2 is managed when kernel needs to free memory urgently?
我正在研究 ext4 和 JBD2 源代码,我没有清楚地了解如何在提交事务后立即执行读取操作。
这是我看源码的理解:
- 交易使用buffer_head来存储元数据;
- 一旦事务提交,buffer_head ptr 被添加到检查点列表;
- 检查点可能不会在提交操作后立即启动;
- 执行检查点,buffer_head可以从内存中释放
我想知道在第 3 步和第 4 步之间内核是否出于某种原因需要释放内存,据我所知,释放这些内存是安全的 buffer_head 因为稍后我们可以将事务从磁盘上的日志区读回内存。
Q1) 不知这种情况是否可以解开buffer_head是否可能在检查点之前,或者如果 buffer_head 被锁定在内存中,直到检查点驱逐它们。
Q2) 另外我不确定第 3 步,我找不到检查点是否需要一些时间才能执行。
Q1) buffer_head
在执行检查点之前不会被释放,因为释放缓冲区然后将其从磁盘加载回内存的开销要大得多而不是在短 delta 时间内将内存中的 buffer_head
保存到检查点。
Q2) 由于磁盘journal area没有free block,checkpoint可以延迟或者可以在commit之前执行,所以启动checkpoint释放块以供即将到来的提交。
我正在研究 ext4 和 JBD2 源代码,我没有清楚地了解如何在提交事务后立即执行读取操作。
这是我看源码的理解:
- 交易使用buffer_head来存储元数据;
- 一旦事务提交,buffer_head ptr 被添加到检查点列表;
- 检查点可能不会在提交操作后立即启动;
- 执行检查点,buffer_head可以从内存中释放
我想知道在第 3 步和第 4 步之间内核是否出于某种原因需要释放内存,据我所知,释放这些内存是安全的 buffer_head 因为稍后我们可以将事务从磁盘上的日志区读回内存。
Q1) 不知这种情况是否可以解开buffer_head是否可能在检查点之前,或者如果 buffer_head 被锁定在内存中,直到检查点驱逐它们。
Q2) 另外我不确定第 3 步,我找不到检查点是否需要一些时间才能执行。
Q1) buffer_head
在执行检查点之前不会被释放,因为释放缓冲区然后将其从磁盘加载回内存的开销要大得多而不是在短 delta 时间内将内存中的 buffer_head
保存到检查点。
Q2) 由于磁盘journal area没有free block,checkpoint可以延迟或者可以在commit之前执行,所以启动checkpoint释放块以供即将到来的提交。