通用日志文件系统(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 来保留空间以供将来使用,而无需实际将任何记录追加到流中。