「一杯茶一包烟,一个BUG调一天」—— 题记
最近在做MIT 6.S081的Lab Locks的Buffer cache,大致要求是实现一个LRU缓存队列,用于文件系统的块缓存(block cache),在保证线程安全的前提下尽可能的实现高吞吐量。
实验给原始代码是基于双向链表的LRU队列,用了一个自旋锁保护链表和其中所有元素的值,可想而知这个自旋锁的竞争非常激烈
实验给了很多提示,比如将缓存改成哈希表,用链地址解决冲突;给每个bucket配一个锁,不同bucket里的元素互不影响,可以并发执行;用时间戳记录访问时间,避免反向遍历;