バッファプールとは
メモリ管理の主要なコンポーネントの1つであるバッファプールは、そもそもデータベースのテーブルなどをユーザー間で共有するためにI/Oを管理するコンポーネントです。そのため、アプリケーションがデータベースの情報にアクセスすると、ディスクからバッファプールのメモリにデータベースの情報が読み込まれ、キャッシュされます。SQL Serverのデータベースのファイルは複数のページに論理的に分割されていて、1ページのサイズは8KBです。同様にバッファ プールが管理するメモリも 1ページを8KBとしてページ単位で使用されます。
最初にバッファプールはデータベースの情報をユーザー間で共有するためのコンポーネントと記載しましたが、実際にはバッファプールが管理するメモリはデータベースをキャッシュする以外にも使用されています。SQL Serverの内部コンポーネントがメモリを必要とする場合もバッファプールのメモリが使用されるのです(このデータベースの情報以外に使用されているページはStolen pagesと呼ばれています)。内部コンポーネントがメモリマネージャにメモリを要求した場合、メモリマネージャはSingle Page Allocator と呼ばれるコンポーネントを使用してバッファプールにメモリを要求し、バッファプールは空きページ(データベースの情報のキャッシュや他の内部コンポーネントで使用されていない)からページを割り当てます。リソース ガバナーは全てのメモリの制御できないと書きましたが、このSingle Page Allocatorを使用したメモリの割り当てのみを制御します。
データベースの情報をキャッシュする場合や内部コンポーネントに割り当てるメモリは、バッファ プール自身がWindowsのアプリケーションではおなじみのVirtualAlloc APIを使用して獲得しています。VirtualAlloc APIを使用して獲得したメモリは、空きページとして管理され、データベースのページの情報が読み込まれる場合などに使用されます。ページが使用されなくなると再び空きページとして管理され、解放されることはありません(システムの空きメモリが不足した場合は SQL Serverは使用しているメモリを解放します)。
このようにバッファプールは、データベースの情報を共有するためのI/Oとキャッシュのためのメモリ管理の仕組みを持っており、また他の内部コンポーネントのためのメモリの割当の機能を持っています。