为了减轻内存使用的压力,除了用户手动写回脏页以外,还有一些机制触发脏页写回。
比方说设置定时器,定期写回脏了很久的页。
具体介绍下面的写回机制,因为这种机制不像写回脏了很久的页的机制那样被动。
wakeu_bdflush 复杂唤醒写回的核心函数。
能触发此函数条件,可能会是以下几点中的一点会多:
1.用户态进程调用sync强制写回
2.grow_buffers()分配一个新的缓冲区页失败时 。此时的页中缓冲区块大小与要求的不同,因此要释放掉。
3.页框回收算法调用free_more_memoy()或try_to_free_page() alloc_pages 分配器中就会调用后面这个函数
4.在内存池中分配元素失败。 内存池是作为动态分配失败后的最后分配手段,基本上好像驱动这部分使用内存池较多。
如果内存池分配都失败,那就一定要触发脏页写回了
由于以上原因,wakeu_bdflush 被唤醒。
只要此函数被唤醒,那么只要存在脏页就写回,或是如果脏页超过了一定的阈值,那么设置被写回脏页数量,然后 唤醒pdflush_operation函数,这个函数负责在pdflush内核线程链表中选择一个空闲的内核线程去执行。并去执行这个线程的回调函数。
回调函数总体的执行情况就是扫描超级块链表,如果超级块所属的索引节点有脏标记就写回。并检查脏页框是否低于阈值,如果不是,继续扫描下一个超级块