缓存池(Buffer Pool)
缓存池是对磁盘的一层包装,主要目的是缓和存储器速度的差异对性能的冲击。缓存池管理器在内存中维护一个缓存池,其拦截的对磁盘的API有:
fetchPage(pageId:Int):Page
取出被pageId
指定的页面,从内存或磁盘中读取。newPage():Page
新建一个页面,供客户写入新的数据,注意要在磁盘上划分出空闲空间。deletePage(pageId):Boolean
删除一个页面,注意要在磁盘上清理出空闲空间。
为了给客户更多的控制,额外提供这两个API:
flushPage(pageId:Int):Boolean
显式要求把内存中的页面写回磁盘unpinPage(pageId:Int, isDirty:Boolean):Boolean
表示调用者不再需要这个页面了,方便缓存池管理器调度内存空;传入isDirty
旗标指示调用是否修改了页面的数据。
在具体实现上,缓存池管理器维护一个散列表和一个装有Page
的列表。Page
记录有元数据并保有对实际数据的引用。这个散列表主要负责将pageId
映射到Page
列表的索引。Page
列表的大小是有限的,所以还必须要维护一个free list
对其中的空闲空间进行管理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。