页面装载(到内存)以及页面(从内存)淘汰
磁盘中Page装载到内存的步骤:先从free list中找到一个空闲页 => 然后记录磁盘到内存该Page的映射关系 => Page链入LRU_old。
新装载的Page肯定是先到冷数据区,接下来该Page要么被淘汰,要么被移动到热数据区。
Page链入冷数据区从head写入,Page从冷数据区淘汰从tail淘汰。
Page从冷数据区移动到热数据区会写入到热数据区的head,Page从热数据区淘汰会从热数据区tail写入冷数据区的head。
装载Page的时会先去找空闲页,如果没有空闲页,就会先淘汰old尾部的Page => 再将磁盘的Page装载到lod尾部 => 再将尾部的Page移动到old的头。
LRU old中尾部的Page如果正在被读,那么Page中有记录被锁着,此时尾部的Page就不能被淘汰。LRU链的是数据页,那么数据页就包含clean page和dirty page,LRU中所有的dirty page组成一个Flush list。如果LRU old尾部的Page不能淘汰,那么就会从LRU Flush list中将第一个dirty page刷盘并释放,此时这块被释放的内存就可以用来加载新的数据了。这个步骤是:先刷盘(将脏页写回磁盘) => 该页移动到LRU old尾部 => 淘汰LRU(将LRU尾部的Page链到Free list头部)=> 从Free list中找空闲页 => …。上面的步骤中,“页面移动到LRU尾部”是多余的,因为放到尾部的目的是淘汰他,所以在mysql5.2之后该步移除,直接淘汰。