除了上一篇提到的基本要求之外,进一步地,为了保证有客户pin住的页面不被evict,还必须给每一个缓存池的slot维护一个atomic reference count。
为了让客户写入每一个Page
的内容,我还额外提供
fun writePage(
source: ByteArray,
destinationOffset: Int,
startIndex: Int,
endIndex: Int
)
此签名跟kotlin标准库的copyInto
是一样的。
接下来,我编写了初步的单元测试来检查缓存池管理器的实现,简单的说主要有:
newPage
调用:- 应该检查缓存池的容量限制
- 应尝试evict unpinned页面来为新页面腾出空间
unpinPage
调用:- 应该及时将脏页面写回磁盘
- 返回值要正确反映是否pin操作和unpin操作数量上是否相同
fetchPage
方法:- 把读取磁盘的操作分派给
diskManager
- 把读取磁盘的操作分派给
注意到本缓存池管理器并不显式提供pinPage
的操作,而是隐含在每一次fetchPage
调用中。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。