【发布时间】:2017-11-08 16:21:51
【问题描述】:
在数据库系统教程中,像教科书数据库系统概念,有一个模块叫做缓冲池/缓冲管理器/寻呼机/任何东西。我没有看到它的太多细节,所以我很好奇你如何提高它的并发性能?
例如,假设我们有一个 Trie 索引。如果我们在 trie 内部进行分页,没有缓冲池,我们可以很容易地让多个线程同时加载或驱逐叶子节点:你需要做的就是从上到下获取节点的共享锁和独占锁。叶节点的父节点。
但是,如果您改为让缓冲池处理分页的事情,那么我想您可能需要获取缓冲池的排他锁。然后,只有一个线程可以同时加载或驱逐页面。
实际上,我已经在数据库实现中尝试过这个。旧版本没有缓冲池,在 trie 索引中管理分页的东西。并且新版本有一个缓冲池来完成这项工作,而不是 trie 索引本身。有一个大锁保护将 Page ID 映射到缓冲池中相应页面的 hashmap。单线程测试快 40%,但是,使用 10 个并发线程,慢 5 倍!
我猜无锁数据结构可能会有所帮助?但我也猜想这很难直截了当。那么你们是如何设计和实现缓冲池的呢?谢谢!
【问题讨论】:
标签: database multithreading concurrency paging