Сжатие данных с помощью библиотеки zlibNX
Библиотека zlibNX представляет собой расширенную версию
библиотеки сжатия данных zlib, которая поддерживает сжатие и
распаковку данных с применением сопроцессоров, называемых встроенными ускорителями (NX), на серверах с процессорами IBM® POWER9™. Библиотека zlibNX доступна в IBM AIX® 7.2 с пакетом расширения Technology Level 4 и выше.
Библиотека
zlibNX соответствует следующим стандартам RFC:
- RFC 1950 (спецификация формата сжатых данных zlib)
- RFC 1951 (спецификация формата сжатых данных DEFLATE)
- RFC 1952 (спецификация формата файла gzip)
Стандарты RFC обеспечивают совместимость между разными реализациями библиотеки zlib. Данные, сжатые с помощью библиотеки zlibNX, могут быть распакованы
стандартной библиотекой zlib. Данные, сжатые с помощью
стандартной библиотеки zlib, могут быть распакованы библиотекой
zlibNX.
Настройка приложений для использования интерфейса zlibNX
zlibNX в
приложении зависит от того, как приложение компонуется с библиотеками
libz.so.1 или libz.a: - Если приложение не компонуется с библиотекой
libz.aилиlibz.so.1, его необходимо перекомпилировать или перекомпоновать с архивным файломzlibNXи заголовочными файламиzlibNXиз каталога /usr/opt/zlibNX/include/. - В случае статической компоновки приложения с библиотекой
libz.aдля доступа к интерфейсуzlibNXможно использовать путь/usr/opt/zlibNX/static/lib/libz.a. -
В случае динамической компоновки приложения с библиотекой
libz.aможно использовать путь /usr/opt/zlibNX/lib/libz.a. Динамически компонуемые приложения могут обеспечить компоновку с библиотекойzlib, поддерживающей аппаратный ускоритель, одним из следующих способов:- Настроив переменную LDR_PRELOAD или
LDR_PRELOAD64 для загрузки библиотеки
zlibс поддержкой аппаратного ускорителя перед загрузкой стандартной библиотекиzlibодним из следующих способов:# LDR_PRELOAD="/usr/opt/zlibNX/lib/libz.a(libz.so.1)" <32-разрядное приложение> # LDR_PRELOAD64="/usr/opt/zlibNX/lib/libz.a(libz.so.1)" <64-разрядное приложение> - Настроив переменную LD_LIBRARY_PATH, как показано в следующем примере:
# LD_LIBRARY_PATH=/usr/opt/zlibNX/lib:$LD_LIBRARY_PATH <приложение> - Настроив переменную LIBPATH, как показано в следующем примере:
Недостаток настройки переменной LD_LIBRARY_PATH заключается в том, что загрузчик сначала пытается найти все требуемые библиотеки в указанном каталоге.# LIBPATH=/usr/opt/zlibNX/lib:$LIBPATH <приложение>
dlopen, то необходимо обновить приложение, указав в нем путь к библиотекеzlibс поддержкой аппаратного ускорителя. - Настроив переменную LDR_PRELOAD или
LDR_PRELOAD64 для загрузки библиотеки
Оптимизация библиотеки zlibNX
В большинстве случаев существующие приложения zlib не
используют большой буфер ввода-вывода для оптимизации производительности
zlibNX. Ниже приведены рекомендации по увеличению размера буфера ввода-вывода, применяемого приложениями:
- В случае распаковки данных с использованием аппаратного ускорителя буфер
вывода может быть в N раз больше буфера ввода, где N - ожидаемый коэффициент
сжатия. Значение N зависит от степени произвольности данных. Для того чтобы
добиться максимальной скорости сжатия, необходимо предоставлять достаточный
объем сжатых входных данных функции
inflate. - Для сжатия данных с использованием аппаратного ускорителя можно использовать буферы ввода-вывода одинакового размера.
Переменные среды для библиотеки zlibNX
zlibNX использует указанные ниже переменные
среды для сбора информации об ошибках и отладочной информации. Значения по умолчанию следующих переменных среды можно переопределить.- ZLIB_VERBOSE
- Позволяет сохранять в файле протокола низкоуровневую отладочную информацию с разными уровнями подробности. Значение 0 запрещает запись отладочной информации в файл протокола. Значение 3 позволяет записывать в файл протокола подробную отладочную информацию. Значение по умолчанию равно 0.
- ZLIB_LOGFILE
- Выводит отладочную информацию в указанный файл протокола. Если переменная
среды ZLIB_LOGFILE не задана, отладочная информация записывается в поток
stderr. - ZLIB_COMPRESS_ACCEL
- Позволяет включить или выключить распаковку данных с аппаратным
ускорением с помощью функции
deflateв библиотекеzlibNX. Значение 0 выключает сжатие данных с аппаратным ускорением. Значение 1 включает сжатие данных с аппаратным ускорением. Значение по умолчанию равно 1. - ZLIB_DECOMPRESS_ACCEL
- Позволяет включить или выключить распаковку данных с аппаратным
ускорением с помощью функции
inflateв библиотекеzlibNX. Значение 0 выключает распаковку данных с аппаратным ускорением. Значение 1 включает распаковку данных с аппаратным ускорением. Значение по умолчанию равно 1.
Поддерживаемые функции zlib
zlib, применяемых ускорителем GZIP NX. Некоторые функции zlib нельзя выполнять с помощью ускорителя NX.
В таких случаях сжатие и распаковка данных выполняются программным образом.- zlibVersion
- Возвращает версию библиотеки
zlibNX. Например:1.2.11.1-AIX_NX. - deflateInit(z_streamp strm, int level)
- Инициализирует операцию сжатия. Значение, указанное пользователем в
параметре level, игнорируется, и вместо него при
выполнении операции сжатия используется значение
Z_DEFAULT_COMPRESSION. - deflate(z_streamp strm, int flush)
-
Сжимает данные. Сжатие данных останавливается, когда становится пустым буфер ввода или полностью заполняется буфер вывода операции сжатия.
Буферизация входных данных с учетом минимального порогового значения для сжатия данных с помощью ускорителя NX приводит к возникновению задержки вывода. Если буфер ввода имеет недостаточный размер, используется стандартный программный способ сжатия.
Для параметра flush допустимы следующие значения:
- Z_NO_FLUSH
- Определяет объем данных, который должен накопиться в буфере ввода операции сжатия, прежде чем будет сгенерирован сжатый вывод.
- Z_SYNC_FLUSH
- Отправляет весь ожидающий вывод операции сжатия в буфер вывода. Вывод заканчивается на границе байта. Граница байта - это конец байта памяти.
- Z_PARTIAL_FLUSH
-
Сжимает доступные данные ввода и отправляет ожидающий вывод операции сжатия. Вывод не заканчивается на границе байта, то есть к данным вывода добавляется пустой блок памяти.
По своему принципу работы функция
Z_PARTIAL_FLUSHаналогична функцииZ_SYNC_FLUSH. - Z_BLOCK
- Указывает, что выполнено сжатие блока данных. В случае передачи значения
Z_BLOCKAPIzlibNXпереключается обратно на стандартный APIzlib. - Z_FULL_FLUSH
- Отправляет весь ожидающий вывод операции сжатия в буфер вывода. Вывод заканчивается на границе байта. Сбрасывает состояние сжатия.
- Z_FINISH
- Передает ожидающие данные ввода функции deflate и выгружает ожидающий вывод функции deflate. Если для вывода достаточно памяти, функция
deflateвозвращает значениеZ_STREAM_END. Если функцияdeflateвозвращает значениеZ_OKилиZ_BUF_ERROR, то ее нужно вызвать еще раз, указав значениеZ_FINISHв параметре flush и предоставив дополнительную память для вывода, но не передавая других данных ввода, и так до тех пор, пока функция deflate не вернет значение Z_STREAM_END или код ошибки.
- deflateEnd(z_streamp strm)
- Освобождает память, выделенную для информации о состоянии операции сжатия.
- deflateInit2
-
deflateInit2(z_streamp strm,int level, int method, int windowBits, int memLevel, int strategy)Инициализирует операцию сжатия. В этой функции можно задать следующие параметры:- level
- Для параметра level допустимы следующие значения:
- Z_NO_COMPRESSION
- Переключиться на программный способ сжатия.
- Z_BEST_SPEED
- В настоящее время этот уровень является аналогом уровня
Z_DEFAULT_COMPRESSIONи применяется по умолчанию. - Z_BEST_COMPRESSION
- Уровни 1 - 9 рассматриваются как уровень 6, а именно уровень
Z_DEFAULT_COMPRESSION, который применяется по умолчанию.
- method
- Для параметра method допустимы следующие значения:
- Z_DEFLATED
- При любом значении параметра method, кроме
Z_DEFLATED, происходит переключение на программный способ распаковки данных.
- windowBits
- Задает размер внутреннего буфера хронологии. Принимает значения логарифма по основанию 2. Размер буфера хронологии (размер окна) должен находиться в пределах от 256 байт
до 32 КБ. Параметр windowBits влияет на то, какой объем
памяти выделяется для внутреннего буфера ввода. В параметре windowBits можно задать значение из следующих диапазонов:
- 8 - 15
- Задает формат
zlib. - -8 - -15
- Задает формат простой распаковки. Формат простой распаковки - это формат сжатых данных.
- 24 - 31
- Задает формат GZIP.
deflateInit2принимает данные в запрошенном формате, но всегда использует окно (буфер хронологии) размером 32 КБ. - MemLevel
- Задает объем памяти, выделяемый для внутреннего состояния сжатия данных.
Внутреннее состояние сжатия данных - это структура данных, используемая в
библиотеке для отслеживания информации о сжатии. Допустимы значения из диапазона 1 - 9. Значение по умолчанию равно 8. В настоящее время это значение игнорируется. API
zlibNXвсегда выделяет большой объем памяти для внутреннего состояния сжатия (примерно 1 МБ). - strategy
-
Задает алгоритм, используемый для операции сжатия. Для параметра strategy допустимы следующие значения:
- Z_DEFAULT_STRATEGY
- Используется динамический алгоритм Хаффмана с алгоритмом сравнения строк.
- Z_FIXED
- Динамический алгоритм Хаффмана не используется.
- Z_HUFFMANONLY
- Используется только алгоритм Хаффмана без алгоритма сравнения строк. Операция сжатия переключается в режим программного сжатия.
- Z_FILTERED
- Входными данными функции deflate являются данные, полученные в результате фильтрации или применения прогнозирующего параметра. Операция сжатия переключается в режим программного сжатия.
- Z_RLE
- Применяется алгоритм кодировки Хаффмана с ограниченным расстоянием для сравнения строк. Операция сжатия переключается в режим программного сжатия.
- inflateInit(z_streamp strm)
- Инициализирует операцию распаковки.
- inflate(z_streamp, int flush)
- Распаковывает данные, пока не станет пустым буфер ввода или не заполнится
буфер вывода. Аппаратный ускоритель применяется при условии наличия достаточно
большого буфера ввода у операции сжатия. В противном случае сжатие выполняется программным образом.
По умолчанию пороговый размер буфера ввода составляет 4 КБ.Для параметра flush допустимы следующие значения:
- Z_NO_FLUSH
- Выполняет распаковку данных, пока не будет достигнут конец буфера ввода или буфера вывода.
- Z_SYNC_FLUSH
- Отправляет вывод операции распаковки в буфер вывода, пока он не достигнет максимального размера.
- Z_FINISH
- Пытается распаковать все данные за один прогон операции распаковки.
- Z_BLOCK
- Останавливает операцию распаковки при достижении границы следующего блока функции deflate. Под границей понимается то место, где блок заканчивается.
- InflateEnd
- Функция
InflateEndподдерживается APIzlibNX. - deflateSetDictionary
Инициализирует словарь сжатия с помощью значений, указанных в последовательности байт (параметре dictionary). Словарь сжатия должен состоять из строк, которые в дальнейшем могут встречаться в сжимаемых данных.deflateSetDictionary(z_streamp strm, const Bytef *dictionary, uInt dictLength)- deflateGetDictionary
Возвращает скользящий словарь (буфер хронологии), используемый функциейdeflateGetDictionary(z_streamp strm, const Bytef *dictionary, uInt dictLength)deflate. Скользящий словарь - это буфер памяти, содержащий несжатые данные.- deflateCopy
Копирует поток и дублирует внутреннее состояние сжатия. У целевого потока не будет доступа к ускорителю.deflateCopy(z_streamp dest, z_streamp source)- deflateReset
Выполняет сброс состояния потока, не освобождая и не перераспределяя память, выделенную для внутреннего состояния сжатия.deflateReset(z_streamp strm)- deflateParams
Обеспечивает поддержку функции deflate из библиотекиdeflateParams(z_streamp strm, int level, int strategy)zlibNXс указанными входными параметрами. Уровень сжатия не меняется.- deflateTune
Позволяет изменить внутренние параметры сжатия функцииdeflateTune(z_streamp strm, int good_length, int max_lazy,int nice_length, int max_chain)deflate. Операция сжатия переключается в режим программного сжатия.- deflateBound(z_streamp strm, uLong sourceLen)
- Возвращает максимальный размер сжатых данных после выполнения операции
deflateдля sourceLen байт данных, переданных функцииdeflateBound. - deflatePending
-
deflatePending(z_streamp strm, unsigned *pending, int *bits)Возвращает вывод, который сгенерирован, но еще не отражен в выводе операции сжатия.
- deflatePrime
Операция сжатия переключается в режим программного сжатия.deflatePrime(z_streamp strm, int bits, int value)- deflateSetHeader(z_streamp strm, gz_headerp head)
- Возвращает информацию о заголовке GZIP для указанного потока GZIP.
- inflateInit2
Аналогична функцииinflateInit2(z_streamp strm, int windowBits)inflateinit, но принимает дополнительный параметр windowBits.- windowBits
- Принимает значения логарифма по основанию 2. Размер буфера хронологии (размер окна) должен находиться в пределах от 256 байт
до 32 КБ. Функция
deflateInit2принимает данные в запрошенном формате, но всегда использует окно (буфер хронологии) размером 32 КБ. В параметре windowBits можно задать значение из следующих диапазонов:- 8 - 15
- Задает формат
zlib. - 24 - 31
- Задает формат GZIP
- 40 - 47
- Задает автоматическое обнаружение заголовка.
- -8 - -15
- Задает формат простой распаковки.
inflateInit2принимает данные в запрошенном формате, но всегда использует окно (буфер хронологии) размером 32KB КБ.- inflateSetDictionary
Инициализирует словарь распаковки с использованием указанной последовательности распакованных байтов.inflateSetDictionary(z_streamp strm, const Bytef *dictionary, uInt dictLength)- inflateGetDictionary
-
inflateGetDictionary(z_streamp strm, Bytef *dictionary, uInt *dictLength) - inflateSync
Пропускает сжатые данные при выполнении операции распаковки, пока не будет достигнута возможная точка полной выгрузки. Если точки полной выгрузки невозможно достичь, операция распаковки пропускает все доступные данные ввода. Точка полной выгрузки - это точка в сжатых данных, сгенерированная при вызове функцииinflateSync(z_streamp strm)deflate()с параметром flush, имеющим значениеZ_FULL_FLUSH.- inflateCopy
Задает целевой поток как копию исходного потока.inflateCopy(z_streamp dest, z_streamp source)- inflateReset
Сбрасывает состояние сжатия без его освобождения.inflateReset(z_streamp strm)- inflateReset2
ФункцияinflateReset2(z_streamp strm, int windowBits)inflateReset2аналогична функцииinflateReset, но позволяет изменять размерwrapи размер окна. ПараметрwindowBitsиспользуется так же, как в функцииinflateInit2. Размер буфера хронологии (размер окна) фиксирован и составляет 32 КБ, однакоwindowBitsзадает формат, который используется при распаковке.- inflatePrime
Вставляет биты во входной поток распаковки. Эта функция позволяет начать операцию распаковки с определенного бита в байте. Операция сжатия переключается в режим программной распаковки.inflatePrime(z_streamp strm, int bits, int value)- inflateMark
Помечает точку для произвольного доступа к данным в потоке ввода, заданную как смещение в битах внутри потока данных. Возвращает два 16-битных значения - две половины 32-разрядных входных данных.inflateMark(z_streamp strm)- inflateGetHeader
Сохраняет информацию о заголовке GZIP и указанной структуре заголовка.inflateGetHeader(z_streamp strm, gz_headerp head)- inflateBackInit
Инициализирует внутренний поток операции распаковки путем вызова функцииinflateBackInit()inflateBack. Операция распаковки переключается в режим программной распаковки. Эта функция поддерживается только в начале потока.- inflateBack
Выполняет простую распаковку, используя интерфейс обратного вызова для данных ввода и вывода. Операция распаковки переключается в режим программной распаковки. Эту функцию можно вызывать только после функцииinflateBack(z_streamp strm,in_func in, void FAR *in_desc,out_func out,void FAR *out_desc)inflateBackInit.- inflateBackEnd
Освобождает всю память, выделенную функциейinflateBackEnd(z_streamp strm)inflateBackInit. Операция распаковки переключается в режим программной распаковки.