Открыть сервис

Библиотека zlib

Zlib — это свободная библиотека сжатия данных общего назначения, реализующая алгоритм DEFLATE. Она предоставляет программный интерфейс (API) для сжатия и распаковки данных в форматах, совместимых с утилитами gzip и PKZIP. Zlib является одной из наиболее широко используемых библиотек сжатия в мире, входя в состав множества операционных систем, программных продуктов и встраиваемых систем.

История

Разработка zlib была начата в 1995 году Жаном-Лу Гайи (Jean-loup Gailly) и Марком Адлером (Mark Adler) как свободная альтернатива проприетарной библиотеке сжатия, используемой в программе Info-ZIP. Первая версия (0.5) была выпущена 1 мая 1995 года. Основной целью было создание переносимой, эффективной и свободной от лицензионных отчислений реализации алгоритма DEFLATE, который был разработан Филом Кацем (Phil Katz) для PKZIP.

В 1995 году библиотека была включена в состав операционной системы Linux, а затем и в другие Unix-подобные системы. В 1996 году вышла версия 1.0.0, которая стала стабильной. С тех пор zlib поддерживается и развивается сообществом, с периодическими выпусками исправлений ошибок и оптимизаций. Последняя стабильная версия на момент написания статьи — 1.3.1 (выпущена в 2024 году).

Архитектура и принцип работы

Zlib реализует алгоритм сжатия DEFLATE, который представляет собой комбинацию двух методов: кодирования длин серий (LZ77) и кодирования Хаффмана.

Алгоритм DEFLATE

  1. LZ77 (словарное сжатие): Алгоритм ищет повторяющиеся последовательности байтов во входном потоке. Если такая последовательность найдена, она заменяется ссылкой на предыдущее вхождение (длина и расстояние до него). Это позволяет эффективно сжимать данные с повторяющимися структурами.
  2. Кодирование Хаффмана: После LZ77 оставшиеся литералы (неповторяющиеся байты) и ссылки (длина и расстояние) кодируются с использованием префиксного кода Хаффмана. Более часто встречающиеся символы получают более короткие коды, что дополнительно уменьшает размер данных.

Zlib не выполняет сжатие сама по себе, а предоставляет функции для вызова этих алгоритмов. Она также включает в себя проверку целостности данных с помощью контрольной суммы (CRC-32 или Adler-32).

Формат данных

Zlib определяет собственный контейнерный формат для сжатых данных, который отличается от форматов gzip и PKZIP. Формат zlib состоит из:

  • Заголовок (2 байта): Содержит информацию о методе сжатия и уровне сжатия.
  • Сжатые данные: Поток данных, сжатых с помощью DEFLATE.
  • Контрольная сумма (4 байта): Adler-32 (по умолчанию) или CRC-32.

Библиотека также может работать с сырым потоком DEFLATE (без заголовка и контрольной суммы) и с форматом gzip (с заголовком gzip).

Основные функции

Zlib предоставляет простой и понятный API, состоящий из нескольких ключевых функций:

  • deflateInit() / deflate() / deflateEnd(): Функции для сжатия данных. deflateInit() инициализирует структуру потока, deflate() выполняет сжатие (может вызываться многократно), deflateEnd() завершает сжатие и освобождает ресурсы.
  • inflateInit() / inflate() / inflateEnd(): Функции для распаковки данных. Аналогичны функциям сжатия.
  • compress() / uncompress(): Упрощённые функции для однократного сжатия/распаковки всего блока данных в памяти.
  • gzopen() / gzread() / gzwrite() / gzclose(): Функции для работы с файлами в формате gzip.

Библиотека также поддерживает различные уровни сжатия (от 0 — без сжатия, до 9 — максимальное сжатие), что позволяет балансировать между скоростью и степенью сжатия.

Применение

Zlib является одной из самых распространённых библиотек сжатия и используется в огромном количестве проектов:

  • Операционные системы: Входит в состав ядра Linux, macOS, Windows (через сторонние компоненты) и других Unix-подобных систем. Используется для сжатия страниц памяти, файловых систем (например, Btrfs, ZFS), а также в системных утилитах (например, gzip, zcat).
  • Веб-серверы и протоколы: Протокол HTTP поддерживает сжатие данных с помощью gzip или deflate. Zlib используется в веб-серверах (Apache, Nginx) и клиентах (браузеры) для сжатия веб-страниц, CSS, JavaScript и других ресурсов.
  • Форматы файлов: Многие форматы файлов используют zlib для сжатия, включая PNG (изображения), PDF (документы), ZIP (архивы), GZIP (сжатые файлы), а также многие игровые и мультимедийные форматы.
  • Базы данных: Некоторые системы управления базами данных (например, PostgreSQL, MySQL) используют zlib для сжатия таблиц и индексов.
  • Программное обеспечение: Zlib встроена в множество программ, включая архиваторы (7-Zip, WinRAR), графические редакторы (GIMP), системы управления версиями (Git) и многие другие.
  • Встраиваемые системы: Благодаря своей компактности и эффективности, zlib часто используется во встраиваемых устройствах, таких как маршрутизаторы, принтеры и IoT-устройства.

Производительность и характеристики

Zlib известна своей высокой производительностью и эффективностью. Она оптимизирована для работы с различными типами данных и архитектурами процессоров. Основные характеристики:

  • Скорость сжатия: Зависит от уровня сжатия. Уровень 1 (быстрое сжатие) достигает скорости порядка 100-200 МБ/с на современных процессорах, уровень 9 (максимальное сжатие) — около 10-20 МБ/с.
  • Скорость распаковки: Значительно выше скорости сжатия и может достигать 500-1000 МБ/с.
  • Степень сжатия: Зависит от типа данных. Для текстовых файлов может достигать 3-5 раз, для бинарных — 1.5-2 раза, для уже сжатых данных (например, JPEG, MP3) — практически не сжимает.
  • Потребление памяти: В зависимости от уровня сжатия, zlib использует от 256 КБ до 32 МБ оперативной памяти для сжатия и около 32 КБ для распаковки.

Лицензия и распространение

Zlib распространяется под собственной лицензией zlib License, которая является одной из самых свободных и разрешительных лицензий. Она позволяет использовать, модифицировать и распространять библиотеку как в открытых, так и в проприетарных проектах без каких-либо ограничений. Это способствовало её широкому распространению.

Критика и альтернативы

Несмотря на широкую распространённость, zlib имеет некоторые недостатки:

  • Устаревший алгоритм: Алгоритм DEFLATE, лежащий в основе zlib, был разработан в 1980-х годах и не является самым эффективным по степени сжатия. Современные алгоритмы, такие как LZMA (используется в 7-Zip), Zstandard (Zstd) или Brotli, могут обеспечить более высокую степень сжатия при сопоставимой или даже более высокой скорости.
  • Отсутствие поддержки многопоточности: Zlib не поддерживает многопоточное сжатие, что ограничивает её производительность на многоядерных процессорах.
  • Ограниченные возможности: Zlib не поддерживает такие функции, как словарное сжатие, адаптивное сжатие или сжатие с предсказанием.

В качестве альтернатив zlib часто используются:

  • Zstandard (Zstd): Современный алгоритм сжатия от Facebook (Meta — организация признана экстремистской и запрещена в РФ), обеспечивающий более высокую степень сжатия и скорость, а также поддерживающий многопоточность.
  • Brotli: Алгоритм сжатия от Google, оптимизированный для веб-трафика, обеспечивающий лучшую степень сжатия, чем gzip.
  • LZMA: Алгоритм, используемый в 7-Zip, обеспечивающий очень высокую степень сжатия, но с более низкой скоростью.
  • LZ4: Алгоритм, ориентированный на максимальную скорость сжатия и распаковки, жертвуя степенью сжатия.

Интересные факты

  • Библиотека zlib является одной из самых портируемых: она работает на практически всех известных платформах, от суперкомпьютеров до микроконтроллеров.
  • Исходный код zlib отличается чрезвычайной компактностью (около 10 000 строк кода), что делает её удобной для изучения и встраивания.
  • Контрольная сумма Adler-32, используемая в zlib, была разработана Марком Адлером и является более быстрой, чем CRC-32, хотя и менее надёжной.

Источники

  • Официальная документация zlib (zlib.net)
  • RFC 1950 (ZLIB Compressed Data Format Specification)
  • RFC 1951 (DEFLATE Compressed Data Format Specification)
  • Исходный код библиотеки zlib (версия 1.3.1)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →