最初启动 MySQL 服务器的时候,需要完成对 Buffer Pool 的初始化过程,就是先向操作系统申请 Buffer Pool 的内存空间,然后把它划分成若干对控制块缓存页。但是此时并没有真实的磁盘页被缓存到 Buffer Pool 中(因为还没有用到), 之后随着程序的运行,会不断的有磁盘上的页被缓存到 Buffer Pool 中。
    那么问题来了,从磁盘上读取一个页到 Buffer Pool 中的时候该放到哪个缓存页的位置呢?或者说怎么区分 Buffer Pool 中哪些缓存页是空闲的,哪些已经被使用了呢?最好在某个地方记录一下 Buffer Pool 中哪些缓存页是可用的,这个时候缓存页对应的控制块就派上大用场了,我们可以把所有空闲的缓存页对应的控制**块作为一个节点放到一个链表中,这个链表也可以被称作 free 链表**(或者说空闲链表)。刚刚完成初始化的 Buffer Pool 中所有的缓存页都是空闲的,所以每一个缓存页对应的控制块都会被加入到 free 链表中,假设该 Buffer Pool 中可容纳的缓存页数量为 n,那增加了 free 链表的效果图就是这样的:
    image.png
    有了这个 free 链表之后,每当需要从磁盘中加载一个页到 Buffer Pool 中时, 就从 free 链表中取一个空闲的缓存页,并且把该缓存页对应的控制块的信息填上(就是该页所在的表空间、页号之类的信息),然后把该缓存页对应的 free 链表节点从链表中移除,表示该缓存页已经被使用了。