共通ログ ファイル システム (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 を呼び出して、ストリームにレコードを実際に追加することなく、将来の使用のために領域を予約できます。