본문 바로가기

OS/vxworks

VxWorks 5.5에서 zlib 사용

     zlib는 데이터 압축에 사용되는 라이브러리로 오픈소스 산출물 중 하나이다. 라이브러리 크기도 작고, 여러 플랫폼을 지원하고 있으며, VxWorks 5.5에서도 사용가능하다. 다음의 과정으로 쉽게 사용할 수 있다.

1. http://www.zlib.net/ 에서 최신 zlib를 다운로드 받는다.

2. Downloadable Project를 생성하여, 모든 파일을 추가한다.

3. 컴파일 옵션에 -DNO_vsnprintf 를 주어 컴파일한다.

     오픈소스 프로젝트 산출물을 사용할 때 항상 유의깊게 봐야하는 부분이 라이센스이다. 하지만, zlib의 라이센스는 zlib license 아래 배포되어, 아래와 같이 상업적인 목적으로 사용하여도 전혀 문제가 없다. 흔히 오픈소스 라이센스들에서 명시하는, 라이센스의 명시조차도 강제하고 있지않다.

/* zlib.h -- interface of the 'zlib' general purpose compression library

  version 1.2.3, July 18th, 2005

  Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler

  This software is provided 'as-is', without any express or implied

  warranty.  In no event will the authors be held liable for any damages

  arising from the use of this software.

  Permission is granted to anyone to use this software for any purpose,

  including commercial applications, and to alter it and redistribute it

  freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not

     claim that you wrote the original software. If you use this software

     in a product, an acknowledgment in the product documentation would be

     appreciated but is not required.

  2. Altered source versions must be plainly marked as such, and must not be

     misrepresented as being the original software.

  3. This notice may not be removed or altered from any source distribution.

  Jean-loup Gailly jloup@gzip.org

  Mark Adler madler@alumni.caltech.edu

*/



     사용되는 API는 다음과 같다. 더 자세한 정보는 홈페이지 Documents를 참고하자.
     int compress2 (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)
     compress와 동일하나 압축레벨을 지정할 수 있다. 0은 압축을 안하며, 9는 최대한 압축을 시도한다. 0 ~ 9 이외의 값을 넣으면, Z_STREAM_ERROR 에러를 반환한다. 모든 압축이 성공적으로 처리되었다면 Z_OK가 반환되며, 충분한 메모리가 확보되지 않았다면 Z_MEM_ERROR, 결과 버퍼의 길이가 충분하지 않을 경우에는 Z_BUF_ERROR를 반환한다.
 Bytef *dest : 압축된 데이터가 저장될 버퍼
 uLongf *destLen : 압축된 데이터가 저장될 버퍼의 크기. 압축 성공후에는 압축된 크기가 저장된다.
 const Bytef *source : 원본 데이터가 저장될 버퍼
 uLong sourceLen : 원본 데이터의 크기
 int level : 0 ~ 9 까지의 정수. 0은 압축을 시도하지 않는다. 다음의 매크로를 사용할 수 있다.
 Z_DEFAULT_COMPRESSION : 기본 압축. 압축 레벨 6과 동일한 압축율과 속도를 갖는다.
 Z_BEST_SPEED : 가장 빠른 압축
 Z_BEST_COMPRESSION : 최대 압축

     int uncompress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)
     source가 가르키는 압축된 데이터를 압축해제한다. 압축해제한 데이터는 dest에 저장된다. 모든 압축 해제가 성공적으로 처리되었다면 Z_OK가 반환되며, 충분한 메모리가 확보되지 않았다면 Z_MEM_ERROR, 결과 버퍼의 길이가 충분하지 않을 경우에는 Z_BUF_ERROR, 입력 데이터가 정상적인 압축 포맷이 아니라면 Z_DATA_ERROR를 반환한다.


     zlib에서 사용되는 에러메시지는 const char * zError(int err) 를 통하여 확인할 수 있다.

#define Z_ERRNO          (-1)

#define Z_STREAM_ERROR (-2)

#define Z_DATA_ERROR    (-3)

#define Z_MEM_ERROR    (-4)

#define Z_BUF_ERROR     (-5)

#define Z_VERSION_ERROR (-6)


     zlib를 사용한 간단한 압축효율 시험이다. 물론 결과는 대상 데이터에 따라 매우 달라질 수 있음을 참고하기 바란다. 테스트에 사용된 파일의 크기는 1.3Mb의 크기를 가지며, CPU는 PPC 500Mhz를 사용하였다.

Level 1 2 3 4 Avg. Compressed
Size (byte)
Compressed
Rate
Compress Rate
Per Sec (byte/sec)
1 117 116 117 116 117 222811 82.89% 1912.54
2 150 150 150 150 150 223883 82.81% 1492.55
3 133 133 133 133 133 222767 82.89% 1674.94
4 200 200 200 200 200 215978 83.41% 1079.89
5 217 217 217 217 217 210306 83.85% 969.15
6 317 317 316 317 317 205129 84.25% 647.61
7 433 433 434 433 433 204910 84.26% 472.96
8 783 783 783 783 783 198123 84.78% 253.03
9 1300 1300 1300 1301 1300 198073 84.79% 152.33


     기존 프로젝트에서 1Mbps의 대역폭을 갖는 MIL-STD-1553B로 대용량 데이터를 전송할때 양 단에서 zlib로 압축을 하여 보내고, 압축을 해제하여 사용하는 용도로 사용하여 전송속도를 획기적으로 줄였던 경험이 있다. 대역폭이 한정되어 있는 Legacy 데이터 버스(1Mbps 이하)를 사용하고 있다면, zlib를 고려하여 전송하는 것을 고려하는 것도 좋은 방안이 될 수 있을 것이다.