CLFS マーシャリング領域
共通ログファイルシステム (CLFS) クライアントは,ログレコードをマーシャリング領域に揮発性メモリで追加し,CLFSは定期的にそれらのレコードを安定したストレージに書き込む. マーシャリング領域はログ I/O バッファーのコレクションであり、それぞれが複数のログ レコードを保持できます。 ログ I/O バッファーは、最近ストリームに書き込まれたレコード (ただし、安定したストレージにフラッシュされていない可能性があります) と、ストリームから最近読み取られたレコードを保持します。
マーシャリング領域を作成するには、ClfsCreateMarshallingAreaを呼び出して作成し、そのときに、マーシャリング領域が使用するログ I/O バッファーのサイズと、それらのバッファーをページ プールと非ページ プールのどちらに配置するかを指定する必要があります。 マーシャリング領域内のすべてのログ I/O バッファーは同じサイズであり、CLFS は、サイズが基になる安定したストレージ メディアのセクター サイズの倍数であることを保証します。 つまり、CLFS は要求されたサイズを取得し、必要に応じて切り上げて、I/O バッファーを安定したストレージ メディアと互換性を持たせます。
CLFS は必要に応じてログ I/O バッファーを割り当てて解放しますが、一度に割り当てることができる I/O バッファーの最大数を設定するオプションがあります。 また、独自のバッファー割り振りおよび割り振り解除機能を提供するオプションもあります。
ログ レコードを書き込むために一度に割り当てることができるログ I/O バッファーの最大数を指定するには、ClfsCreateMarshallingArea関数のcMaxWriteBuffersパラメーターを設定します。 バッファーの数を制限すると、安定したストレージへのフラッシュの頻度に影響します。バッファーの数が少ないほど、ログ・レコードを安定したストレージに頻繁に書き込む必要があります。 フラッシュ頻度を制御する必要がない場合は、cMaxWriteBuffersを INFINITE (Winbase.h で定義) に設定します。
ログ レコードを読み取るために一度に割り当てることができるログ I/O バッファーの最大数を指定するには、ClfsCreateMarshallingArea関数の cMaxReadBuffersパラメーターを設定します。 割り振られる読取りバッファーの数を制御する必要がない場合は、cMaxReadBuffersを INFINITE に設定します。
ログ I/O バッファーに独自のメモリ割り当てを行う場合は、独自の割り当て関数と割り当て解除関数を指すように、ClfsCreateMarshallingArea 関数の pfnAllocBuffer パラメーターと pfnFreeBuffer パラメーターを設定します。 その後、CLFS は関数を呼び出して、ログ I/O バッファーを作成または解放する必要があるたびに、実際のメモリ割り当てと割り当て解除を実行します。
場合によっては、マーシャリング領域のスペースを前もって予約しておく必要があります。 例えば、10 個のログ・レコードのセットを書き込もうとしていることがわかっていて、そのセット全体に対して十分なスペースがマーシャリング域にあることを確認したいとします。 10 個のレコード用の領域を予約するには、レコードのサイズを保持する 10 要素の配列を作成し、その配列を rgcbReservationパラメーターのClfsReserveAndAppendLog 関数に渡します。 ClfsReserveAndAppendLog は、マーシャリング領域内の領域を予約したり、ログ レコードをストリームに追加したり、それらの両方をアトミックに行ったりする多目的関数です。 パラメーターを適切に設定することで、ClfsReserveAndAppendLogを呼び出して、実際にストリームにレコードを追加せずに、将来使用するために領域を予約できます。