データベースシステムのチュートリアルでは、教科書データベースシステムの概念のように、Buffer Pool/Buffer Manager/Pager /というモジュールがあります。私はそれについて多くの詳細を見ていないので、私はあなたがどのようにの同時実行を増やすのですか?データベースシステムでバッファプールの同時パフォーマンスを向上させるにはどうすればよいですか?
たとえば、Trieインデックスがあるとします。バッファプールなしでトライの内部でページングを行うと、複数のスレッドでリーフノードを同時にロードまたはエバリュートすることができます。ノードの共有ロックを上から下に取得し、リーフノードの親。
ただし、バッファプールにページングの処理をさせる場合は、バッファプールの排他ロックを取得する必要があると考えられます。次に、同時に1つのスレッドのみがページを読み込んだり、追い出したりすることができます。
実際、私はこれをデータベース実装で試しました。古いバージョンにはバッファー・プールがなく、trie索引内のページング項目を管理します。そして、新しいバージョンでは、trieインデックスの代わりにバッファプールがあります。ページIDをバッファプール内の対応するページにマップするハッシュマップを保護する大きなロックがあります。シングルスレッドテストは40%高速ですが、同時に10スレッド、5倍遅くなります!
ロックフリーのデータ構造が役立つと思いますか?しかし、私はそれがまっすぐに考えるのは難しいだろうと思う。では、どのようにバッファプールを設計して実装していますか?ありがとう!