Поделиться через


Области маршалинга CLFS

Клиент common Log File System (CLFS) добавляет записи журнала в область маршалинга в энергонезависимой памяти, а CLFS периодически записывает эти записи в стабильное хранилище. Область маршалинга — это коллекция буферов ввода-вывода журнала, каждая из которых может содержать несколько записей журнала. Буферы ввода-вывода журнала содержат записи, которые недавно были записаны в поток (но, возможно, не были записаны в стабильное хранилище), а также записи, которые недавно были считаны из потока.

Область маршалинга создается путем вызова Метода ClfsCreateMarshallingArea. В этот момент необходимо указать размер буферов ввода-вывода журнала, которые будут использоваться в области маршалинга, и указать, будут ли эти буферы находиться в выгружаемом или нестраничном пуле. Все буферы ввода-вывода журнала в области маршалинга имеют одинаковый размер, а CLFS гарантирует, что размер кратен размеру сектора на базовом стабильном носителе. То есть CLFS принимает запрошенный размер и округляет его по мере необходимости, чтобы сделать буферы ввода-вывода совместимыми со стабильной средой хранения.

ПРИ необходимости CLFS выделяет и освобождает буферы ввода-вывода журнала, но у вас есть возможность задать максимальное количество буферов ввода-вывода, которые могут быть выделены одновременно. Вы также можете предоставить собственные функции выделения буфера и освобождения.

Чтобы указать максимальное количество буферов ввода-вывода журнала, которые можно выделить одновременно для записи записей журнала, задайте параметр cMaxWriteBuffers функции ClfsCreateMarshallingArea . Ограничение количества буферов влияет на частоту сбросов в стабильное хранилище; При меньшем количестве буферов записи журнала должны записываться в стабильное хранилище чаще. Если вам не нужно управлять частотой очистки, задайте для параметра cMaxWriteBuffers значение INFINITE (определяется в Winbase.h).

Чтобы указать максимальное количество буферов ввода-вывода журнала, которые можно выделить одновременно для чтения записей журнала, задайте параметр cMaxReadBuffers функции ClfsCreateMarshallingArea . Если вам не нужно управлять количеством выделенных буферов чтения, задайте для cMaxReadBuffers значение INFINITE.

Если вы хотите самостоятельно выделить память для буферов ввода-вывода журнала, задайте параметры pfnAllocBuffer и pfnFreeBuffer функции ClfsCreateMarshallingArea , чтобы они указывали на собственные функции выделения и освобождения. Затем CLFS вызовет функции для выполнения фактического выделения памяти и освобождения, когда потребуется создать или освободить буферы ввода-вывода журнала.

В некоторых случаях может потребоваться заранее зарезервировать место в зоне маршалинга. Например, вы можете знать, что собираетесь написать набор из десяти записей журнала и хотите убедиться, что в области маршалинга достаточно места для всего набора. Чтобы зарезервировать место для десяти записей, создайте десятиэлементный массив, содержащий размеры записей, а затем передайте массив в функцию ClfsReserveAndAppendLog в параметре rgcbReservation . ClfsReserveAndAppendLog — это многоцеловая функция, которая резервирует пространство в области маршалинга, добавляет записи журнала в поток или выполняет обе эти функции атомарно. Задав параметры соответствующим образом, можно вызвать ClfsReserveAndAppendLog , чтобы зарезервировать пространство для использования в будущем без фактического добавления записей в поток.