linux中的脏页写回

为了减轻内存使用的压力,除了用户手动写回脏页之外,还有一些机制触发脏页写回。算法

比方说设置定时器,按期写回脏了好久的页。函数

具体介绍下面的写回机制,由于这种机制不像写回脏了好久的页的机制那样被动。spa

wakeu_bdflush 复杂唤醒写回的核心函数。线程

能触发此函数条件,可能会是如下几点中的一点会多:索引

1.用户态进程调用sync强制写回进程

2.grow_buffers()分配一个新的缓冲区页失败时 。此时的页中缓冲区块大小与要求的不一样,所以要释放掉。内存

3.页框回收算法调用free_more_memoy()或try_to_free_page()     alloc_pages 分配器中就会调用后面这个函数回调函数

4.在内存池中分配元素失败。 内存池是做为动态分配失败后的最后分配手段,基本上好像驱动这部分使用内存池较多。定时器

若是内存池分配都失败,那就必定要触发脏页写回了链表

 

因为以上缘由,wakeu_bdflush 被唤醒。

只要此函数被唤醒,那么只要存在脏页就写回,或是若是脏页超过了必定的阈值,那么设置被写回脏页数量,而后 唤醒pdflush_operation函数,这个函数负责在pdflush内核线程链表中选择一个空闲的内核线程去执行。并去执行这个线程的回调函数。

回调函数整体的执行状况就是扫描超级块链表,若是超级块所属的索引节点有脏标记就写回。并检查脏页框是否低于阈值,若是不是,继续扫描下一个超级块

相关文章
相关标签/搜索