除了上一篇提到的根本要求之外,进一步地,为了保障有客户 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
调用中。