아이태니엄 리눅스 100% 활용하기

새로운 시스템 아키텍쳐의 출현의 그에 상응하는 제반 환경의 구

축이 반드시 필요하다. 이러한 환경 중에서 운영체제와 애플리케이션 개발을 위한 개발 툴의 지원은 최우선에 있다고 볼 수 있다. IA64 기술도 역시 리눅스에 빠르게 채용되어 개발되었으며 운영체제가 준비되어 있는 상태에서 다양한 개발환경의 출현은 당연한 사항이 되었다. 그러나 아직까지 IA64 환경에 익숙하지 못한 일반적인 개발자들이 개발환경에 대한 정확한 정보를 가지지 못하고 있어서 새로운 기술에 대한 접근이 쉽지 않게 되었다. 현재까지의 개발환경을 알게됨으로써 IA64의 새로운 기능을 활용한 제품의 개발에 효율적으로 이용이 가능할 것이다.

IA64 개발환경의 장점

Ÿ 64bit 시스템에 대한 손쉬운 접근이 가능하며

Ÿ 제품의 성능을 높일 수 있는 새로운 신규 플랫폼이 될 수 있으며

Ÿ 개발자의 입장에서 시스템 한계에 대한 고려없이 애플리케이션을 제작할 수 있는 환경이며

Ÿ 기존이 IA32 환경에서 제한적인 개발분야 – 예를들어 FP 부분 – 에 대한 효과적인 극복이 가능하며

Ÿ 엔터프라이즈 환경에서 많이 사용하는 유닉스 시스템 환경에 대한 접근을 쉽게 할 수 있다.

IA64 리눅스 환경에서의 개발

리눅스코리아 eSolution 컨설팅 팀장

이성주

[ 목차 ]

1. IA64의 특징

2. IA64 리눅스

3. IA64 리눅스 개발 환경

4. IA64 리눅스로의 애플리케이션 포팅

5. 자바 개발 데모

6. 결론

1. IA64의 특징

현재 출시된 IA64 프로세서의 특징을 간단히 정리한다.

n IA64 프로세서는 새로운 칩이다.

IA64 프로세스는 기존의 프로세서 – 인텔제품으로 펜티엄 시리즈 – 의 기능확장 프로세서가 아닌 구조에 대한 디자인이 다시 만들어진 완전히 새로운 프로세서이다. 물론 이 프로세서는 이전의 인텔 제품과의 호환성을 유지하기 위한 배려가 되어 있지만 이것은 이전 프로세서의 연장선상에 있는 제품은 아니라는 것을 반드시 기억해야 한다.

n 실수연산을 위한 강력한 성능을 가진다.

IA32 계열의 프로세서의 특징중 하나는 실수연산이 유난히 느리다는 점이 었다. 이점은 일반 애플리케이션이 실수연산을 그다지 많이 사용하지 않는다는 점에서 큰 문제가 안되었지만 IA32 장비를 수학계산용으로 사용하려고 하는 곳에서는 선택의 폭이 좁아지게 되는 것이다. 즉 상용 유닉스 시스템의 도입이 필수적이 된것이다.

그러나 이 새로운 프로세서는 이 부분에서 기존의 유닉스 시스템에 사용된 프로세서들을 능가하는 실수연산 성능을 가지고 응용을 기다리게 되었다. 즉 IA64 계열 프로세서를 사용한 시스템을 과학계산용이나 또는 실수연산을 많이 하는 인터넷 서비스 프로그램을 위해서도 충분히 사용할 가치를 가지게 된 것이다.

n EPIC 지원

프로세서의 성능을 높이는 방법은 두가지가 있다. 한가지는 프로세서의 클럭을 빠르게 하는 것이고 또 한가지는 병렬처리를 들 수 있다. 병렬처리는 순차적인 실행명령어들에 대한 프로세서의 해석을 순차적으로 하는 것이 아니라 가능한 방법안에서 병렬로 수행하는 것이다. 즉 어떠한 명령을 수행하다보면 그 명령이 끝날때까지 프로세서가 놀고 있는 경우가 생길 수 있다. 이러한 시점에서 앞서 수행한 명령과는 관련이 없는 다른 명령을 동시에 실행시켜줌으로써 순차적 실행보단 훨씬 빠른 성능을 낼 수 있는 방법이다. 이것은 단일 프로세서에서도 필요하지만 다중 프로세서상에서는 더욱더 필요한 기능이 될 수 있다.

이러한 프로세서의 병렬처리를 위한 기법이 여러가지 있는데 그중 IA64 프로세서가 택한 방법이 EPIC(Explicit Parallel Instruction Computing) 이다. EPIC을 IA32 시스템에서 구현하기가 다양한 문제로 인해서 어려움이 있었다.

EPIC에는 3가지 특징이 있는데 다음과 같은 내용을 들 수 있다.

Ÿ Speculation : 값에 대한 사전결정을 의미한다. 즉 메모리 참조를 통해서 값을 가지올 것을 실제 수행명령중에 하는 것이 아니라 이전에 이미 fetching 을 해놓아서 메모리 접근 지연을 줄일 수 있는 것이다. 주로 계산을 많이 하는 애플리케이션에서 많은 효과가 있다.

Ÿ Predication : 순차적인 명령의 분기를 줄일 수 있는 방법으로 분기하여야할 내용에 대한 것을 predicate register 에 해놓음으로써 성능을 높일 수 있다.

Ÿ RRF(Rotating Register File) : 시스템 콜의 속도를 높여주는 방법이다.

이러한 병렬처리기능을 프로세서, 운영체제, 컴파일러등이 원활하게 지원을 해주어야 할 사항이다.

n 64bit 주소공간

사용자 프로세스에게 18,446,744,073,709,551,616 바이트의 주소공간을 사용할 수 있도록 해준다.

메모리의존성 애플리케이션들에는 많은 성능향상의 기회가 될 수 있다.

2. IA64 리눅스

IA64 환경으로 가장 빠르게 포팅된 운영체제이다. 포팅이 빨리되었다고 좋은 것은 아니지만 애플리케이션을 개발할 수 있는 환경이 마련된것으로는 큰 의미를 가질 수 있다. 그런 의미에서 몇가지 특징을 살펴보고 간략하게 설치과정상 중요한 점을 레드햇 배포판을 기준으로 설명한다.

n IA64 버전의 리눅스 커널은 64bit 이다. 즉 프로세서의 특징을 잘 사용할 수 있도록 개발된 것이다. 리눅스가 IA32 환경에서 개발이 시작되고 발전하여 왔기 때문에 약간은 의존성이 있지만 IA64 리눅스 커널을 완전히 새롭게 재 작성한 것이다. 기존의 64bit 프로세서(Alpha, Sparc64, PA-RISC등)로 리눅스를 포팅했던 많은 커널 개발자가 있었기 때문에 빠르게 개발이 되었으며 현재로 리눅스 커널의 특성상 발전을 계속하고 있다.

n Linux/x86 즉 IA32 환경의 애플리케이션과도 호환성을 유지하도록 작성하고 있다. 그러나 이 부분은 문제가 될 수 있다. 호환성이 정확한 실행을 보장해주진 않기 때문에 즉 최소한의 재컴파일 과정은 거치는 것이 안전하다는 것이다. 즉 호환성이라 함을 IA32 리눅스와의 프로그램 소스차원의 호환을 최대한 유지한다는 것이지 바이너리 차원에서는 아니라는 것다. 다음의 예제를 보면 알 수 있다. 다음은 32bit 환경에서 Data Type 의 크기를 확인하는 프로그램이다. 이것을 32bit 환경에서 실행해 본다.

실행 소스는 다음과 같다.

#include

void main()

{

struct node

{

char *text;

struct node *left;

struct node *right;

};

printf(“sizeof 123456 = %dn”, sizeof(123456));

printf(“sizeof 123456L = %dn”, sizeof(123456L));

printf(“sizeof 123456UL = %dnn”, sizeof(123456UL));

printf(“0xFFFFFFFF = 0x%Xn”, 0xFFFFFFFF);

printf(“4294967296 = %dn”, 4294967296UL);

printf(“0x100000000 = 0x%Xn”, 0x100000000UL);

printf(“0xFFFFFFFFFFFFFFFF = %dnn”, 0xFFFFFFFFFFFFFFFFUL);

printf(“struct noden”);

printf(“{n”);

printf(” char *textn”);

printf(” struct node *leftn”);

printf(” struct node *rightn”);

printf(“}n”);

printf(“n”);

printf(“sizeof struct node = %d bytesn”, sizeof(struct node));

}

[root@32bitenv 32bit]$ ./sizeof.bin

sizeof 123456 = 4

sizeof 123456L = 4

sizeof 123456UL = 4

0xFFFFFFFF = 0xFFFFFFFF

4294967296 = 0

0x100000000 = 0x0

0xFFFFFFFFFFFFFFFF = -1

struct node

{

char *text

struct node *left

struct node *right

}

sizeof struct node = 12 bytes

위의 결과는 정확하다고 할 수 있다. 그러나 이 실행 프로그램을 64bit 환경에서 실행시키면 다음과 같은 결과가 나온다.

[root@64bitenv 32bit]# ./sizeof.bin

sizeof 123456 = 4

sizeof 123456L = 4

sizeof 123456UL = 4

0xFFFFFFFF = 0x7FFFF868FFFFFFFF

4294967296 = 4294967296

0x100000000 = 0x100000000

0xFFFFFFFFFFFFFFFF = -1

struct node

{

char *text

struct node *left

struct node *right

}

sizeof struct node = 12 bytes

이 프로그램 소스를 printf 부분을 64bit 환경에서 맞게 다음 소스처럼 약간 수정하고 컴파일하여 실행파일을 만들어서 실행시키면 다음과 같은 결과가 나온다.

#include

void main()

{

struct node

{

char *text;

struct node *left;

struct node *right;

};

printf(“sizeof 123456 = %dn”, sizeof(123456));

printf(“sizeof 123456L = %dn”, sizeof(123456L));

printf(“sizeof 123456UL = %dnn”, sizeof(123456UL));

printf(“0xFFFFFFFF = 0x%llXn”, 0xFFFFFFFF);

printf(“4294967296 = %lldn”, 4294967296UL);

printf(“0x100000000 = 0x%llXn”, 0x100000000UL);

printf(“0xFFFFFFFFFFFFFFFF = %lldnn”, 0xFFFFFFFFFFFFFFFFUL);

printf(“struct noden”);

printf(“{n”);

printf(” char *textn”);

printf(” struct node *leftn”);

printf(” struct node *rightn”);

printf(“}n”);

printf(“n”);

printf(“sizeof struct node = %d bytesn”, sizeof(struct node));

}

[root@64bitenv 64bit]# ./sizeof.bin

sizeof 123456 = 4

sizeof 123456L = 8

sizeof 123456UL = 8

0xFFFFFFFF = 0xFFFFFFFF

4294967296 = 4294967296

0x100000000 = 0x100000000

0xFFFFFFFFFFFFFFFF = -1

struct node

{

char *text

struct node *left

struct node *right

}

sizeof struct node = 24 bytes

위의 두가지 결과를 보면 차이가 나는 것을 볼 수 있다. 뒤에서 설명하겠지만 이 두 환경의 Data Type 이 틀리기 때문에 32bit 바이너리를 그냥 실행시키는 경우 원치 않는 결과가 나올 수도 있고 또한 소스를 재컴파일하여 실행파일을 만든다고 하더라도 역시 주의가 필요하다.

n 플랫폼 의존코드의 최소화 : 이 부분은 역시 포팅의 필수적인 사항으로 각 Architecture 별로 의존적인 코드를 커널에 넣는 것은 문제발생의 원인이 되기 때문에 최소한의 의존적인 코드만을 삽입하는 것이 포팅을 쉽게 하는 방법이 된다. 이런 의미에서 리눅스 커널에서는 다양한 플랫폼에 포팅을 시도하고 있어서 IA64 환경도 이러한 노력의 일환이 되고 있고 역시 플랫폼 의존적인 코드는 많지 않다는 것이다.

n 64bit 성능을 내기 위한 코드를 사용 : 64bit 환경에서 사용자들이 자신의 애플리케이션을 활용함에 있어 성능향상을 경험할 필요가 있다. 운영체제의 64bit에 대한 효율적인 성능지원은 컴파일러의 효율적인 64bit 코드 생성만큼이나 중요한 부분이라고 할 수 있다.

n 다양한 표준 준수 : IA64 Software Conversion 이나 EFI(Extensible Fireware Interface), Unix ABI(Application Binary Interfac) 등의 표준을 지켜서 Unix와 그밖의 개발환경에서의 소프트웨어 포팅이 좀더 쉽고 빠르게 이루어질 수 있도록 하였다.

n 설치가능 배포판

현재까지(2002년 1월) 나와있는 IA64 환경의 배포판은 다음과 같다. 4대 주요 리눅스 배포판업체의 제품들이 모두 포함되어 있다. 나름대로 특장점이 있겠지만 새로운 시스템 환경에서 최적으로 사용할 수 있도록 준비가 되고 있다. 아무래도 IA64 시스템이면 간단한 업무에 적용하기 보단 엔터프라이즈급 업무에 적용하려는 노력이 많이 이루어질텐데 이러한 상황에 발맞춰서 개발이 되고 있다고 보여진다. 다음과 같은 제품들이 나와있다.

RedHat 7.2 for Itanium

TurboLinux 7.0 for Itanium

OpenLinux 64

SuSE Linux Enterprise Server 7 for Itanium Processor Family

참고로 SuSE 와 TurboLinux 는 IA64 시스템 개발 초기부터 배포판 작업을 해왔기 때문에 상당히 성능이 우수하다고 볼 수 있으며 RedHat 제품은 다양한 테스트를 통해서 안정성을 높여왔고 기존의 RedHat 사용자들이 쉽게 사용할 수 있도록 이전버전과의 유사성을 계속유지하고 있으며 OpenLinux는 편리한 사용자 환경을 구현해 주고 있다.

간략히 IA64 시스템에 레드햇 배포판을 설치해보면서 주의점을 알아본다. 여기서 사용한 버전은 7.2 Beta 버전으로 현재 나온 버전과는 조금 차이가 있을 수 있다. IA64 시스템은 EFI를 사용하기 때문에 EFI Shell과 MS-DOS 파티션에 대해서 약간 알고 있어야 한다. 다양한 운영체제를 쉽게 지원하기 위해서 도입된 방법으로 운영체제의 부팅을 도와주는 시스템 내부의 프로그램이라고 볼 수 있다. EFI 는 일종의 MS-DOS 환경이고 EFI 환경에서 실행되는 프로그램도 만들 수 있다. 그래서 시스템에 운영체제를 설치할때는 반드시 EFI 를 위한 파티션 영역도 준비를 해야 한다. 이 부분이 일반적인 IA32 환경의 리눅스 설치와 다른 점이다. 즉 MS-DOS(FAT16) 파일시스템 영역이 일정량만큼 준비되어야 하는 것이다. 리눅스를 운영체제로 사용하기 위해서 필요한 EFI 파티션(FAT16파티션)의 용량은 약 30MB 정도면 충분하다. 만약 다양한 운영체제를 같이 설치하고 싶다면 100MB정도 잡아주는 것이 좋다.

시스템에 설치전에 준비해야할 사항은 Itanium 용 RedHat 7.2Beta CD 두장정도이다. 즉 CD로부터 운영체제를 설치하는 것이다. 절대 부팅시디는 아니다. 그리고 이전에 레드햇 설치를 해본적이 있어야 한다. 기본적으로 EFI부분을 제외하고는 모두 이전방법과 동일하기 때문이다.

CD를 넣고 IA64 시스템을 시작하여 정상적인 하드웨어 점검을 하고 나면 EFI 시작화면이 나온다. 기존의 IA32 환경과는 다르게 CD로 부터 바로 부팅이 되지 않고 EFI Shell에서 레드햇 설치 프로그램을 구동해야 한다. 다른 리눅스 배포판도 모두 마찬가지이다.

메뉴에서 EFI Shell 을 선택하면 다음처럼 프롬프트가 나온다.

Shell>

이제 여기서 EFI Shell 명령어를 사용할 수 있다. 먼저 map 이라는 명령을 해보면 다음처럼 나온다.

Device mapping table

fs0 : VenHw(Unknown Device:00)/HD(Part1,Sig00000000)

fs1 : VenHw(Unknown Device:80)/HD(Part1,Sig00000000)

fs2 : VenHw(Unknown Device:FF)/CDROM(Entry1)/HD(Part1,Sig00000000)

blk0 : VenHw(Unknown Device:00)

blk1 : VenHw(Unknown Device:00)/HD(Part1,Sig00000000)

blk2 : VenHw(Unknown Device:80)

blk3 : VenHw(Unknown Device:80)/HD(Part1,Sig00000000)

blk4 : VenHw(Unknown Device:80)/HD(Part2,Sig00000000)

blk5 : VenHw(Unknown Device:80)/HD(Part3,Sig00000000)

blk6 : VenHw(Unknown Device:80)/HD(Part3,Sig00000000)/HD(Part1,Sig725F7772)

map 은 현재 디스크장치의 환경이 어떻게 되어 있으며 각 디스크환경에 따른 MS-DOS의 드라이브 명을 보여준다. 위의 화면에서 fs0, fs1, blk0, … 등 이러한 부분이 드라이브 이름이라고 생각하면 된다.

MS-DOS에서 드라이브를 옮길 때 보통 C:, D: 하듯이 이제 레드햇 설치 CD 가 있는 드라이브로 이동해야 한다. 위의 화면에 보면 fs2 번이 CDROM 임을 알 수 있다. 간단히 EFI Shell 상에서 fs2: 라고 입력하면 해당 드라이브로 이동한다. 그러면 프롬프트가 바뀐다.

Shell> fs2:

fs2:>

여기서 dir 해보면 .efi 라는 확장자를 가진 파일이 있다. 보통은 elilo.efi 라고 되어 있다. 이것이 리눅스 설치 이미지를 구동시키는 실행파일이다. 간단히 elilo라고 입력하면 전통적인 레드햇 설치 화면이 나온다.

fs2: > elilo

이제 다른 플랫폼의 레드햇 설치방법에 따라서 설치하면 된다. 한가지 중요한 것은 앞에서 설명한 것 처럼 반드시 일정용량의 FAT16 형식의 파티션이 있어야 하기 때문에 파티션 설정부분에서 설정하는 것을 잊으면 안된다.

간단하게 IA64 시스템에 레드햇을 설치해 봤다.

3. IA64 리눅스 개발환경

현재까지 IA64 리눅스 환경에서 사용할 수 있는 개발 환경을 알아본다. 개발 언어와 개발 환경 그리고 중요한 DBMS 부분으로 나눌 수 있는데 먼저 개발 언어를 보면 다음과 같다.

n 개발언어

Ÿ C : 전통적 개발언어로 GNU 컴파일러 부분에 기본적으로 포함되어 있고 이 GNU 컴파일러는 IA64 리눅스 배포판에 역시 기본적으로 포함되어 있다. C 컴파일러인 gcc 의 버전은 2.9x와 3.0x 버전이 있다. 이외에 인텔의 컴파일러가 있으며 버전은 6.0 이다. http://developer.intel.com/software/products/compilers/c50/linux/ 에서 구할 수 있다.

Ÿ C++ : 역시 전통적 개발언어로 GNU 컴파일러 부분에 포함되며 리눅스 배포판에 포함되어 있다. 인텔컴파일러도 C++ 을 지원한다.

Ÿ Java : 엔터프라이즈 환경에서 개발 언어로 필수적인 자바도 역시 지원된다. IBM에서 만들고 있으며 1.3 SE beta 이다. 최신버전은 http://alphaworks.ibm.com/tech/linuxsdk 에서 구할 수 있다.

Ÿ Python : 생산성 높은 스크립트 언어로서 다양한 환경에서 동작하므로 개발이 편리한 언어이다. 리눅스 배포판에 기본적으로 포함되어 있기 때문에 원활이 사용이 가능하다. http://www.python.org 에서 최신버전을 구할 수 있다.

Ÿ Perl : 리눅스 배포판에 기본적으로 포함되어 있기 때문에 쉽게 사용할 수 있다.

Ÿ PHP : 역시 리눅스 배포판에 포함되어 있으며 웹개발을 위한 스크립팅언어로 생산성이 높다. 같이 포함된 Apache 웹서버와 연결하여 웹 애플리케이션을 쉽게 만들어 낼 수 있다.

Ÿ Fortran : GNU 컴파일러의 일부로 포함되어 있으며 인텔 컴파일러에도 포함되어 있다.

n 개발환경

개발환경은 KDE와 GNOME GUI 환경에 따라 다양한 프로그램이 리눅스 배포판에 기본적으로 포함되어 있다. 다음은 KDE에 포함된 통합개발환경인 Kdevelop 프로그램이다.

그림 1) Kdevelop 실행화면

윈도우에서 개발시 많이 사용하는 프로그램과 유사하여 윈도우 개발자들도 쉽게 리눅스 애플리케이션을 개발할 수 있는 환경이라고 볼 수 있다.

다음은 GNOME에서 주로 UI 부분을 개발하기 위해서 사용하는 glade 프로그램이다.

그림 2) GNOME UI 디자인 프로그램

이 역시 윈도우 환경에서 개발시에 많이 사용하는 RAD 툴들과 비슷하여 쉽게 개발할 수 있도록 도움을 주고 있다.

이외에도 각종 Vi, Emacs 와 같은 전통적인 개발 편집기와 Quanta 와 같은 Web 페이지 개발 툴등이 있으며 CUI 환경에서 개발을 도와주는 각종 GNU 툴들이 리눅스 배포판에 기본적으로 포함되어 있기 때문에 이전에 윈도우 환경이나 UNIX 환경에서 개발했던 개발자라면 쉽게 IA64 리눅스용 애플리케이션을 개발할 수 있을 것이다.

n DBMS

IA64 리눅스 환경이 엔터프라이즈급에서 사용되기 위해서 필수적인 부분이 DBMS 의 지원이라고 볼 수 있다. 현재 IA64 환경에서 사용할 수 있는 DBMS는 다음과 같다.

Ÿ 오라클 : 현재 Oracle 9i Developer’s Release 가 나와 있는 상태이다. http://technet.oracle.com/software/products/oracle9i/content.html 에서 구할 수 있다. 다른 플랫폼 버전에 있는 설치프로그램이 없기 때문에 설치가이드를 읽고 수동으로 DB 생성을 해야 한다. 다음은 IA64 리눅스 버전의 오라클을 동작시키는 화면이다.

[ 오라클 구동 화면 ]

[ Listener 구동화면 ]

[ 샘플 데이터베이스에 접근하여 자료를 가져오는 화면 ]

오라클 서버에는 윈도우용 오라클 9i 클라이언트 프로그램으로 접근하여 작업을 할 수 있다.

Ÿ DB2 : IBM DB2 Universal Database Developers kit for Linux on Itanium Processor Family – V7.2 라는 긴이름을 가지고 현재 나와 있다. 개발자 버전이라서 주변적인 애플리케이션들이 많이 준비되어 있진 않지만 리눅스에서 운용을 충분히 가능하다. 다음은 운용되고 있는 DB2 관련 내용이다.

[ DB2 프로세스가 구동되고 있는 화면 ]

[ db2 라는 이름의 DB2 Front End 프로그램을 사용하여 로컬의 DB2 서버에 접속하기 위한 화면 ]

[ 샘플 데이터베이스에 접근하여 자료를 가져오는 화면 ]

Ÿ MySQL : 리눅스 배포판에 기본적으로 포함되어 있기 때문에 필요할 때 편리하게 사용할 수 있다. 가장 최신버전도 역시 http://www.mysql.com/ 에서 구할 수 있으며 별 문제없이 컴파일하여 IA64 리눅스 환경에서 운용할 수 있다.

Ÿ PostgreSQL : MySQL과 같이 공개 DBMS로서 기본적으로 포함되어 있거나 또는 http://www.postgresql.org/ 에서 소스 또는 바이너리를 구하여 사용할 수 있다.

n 웹 애플리케이션

웹으로 애플리케이션을 개발하려고 하는 부분에 있어서도 역시 지원되는 부분을 확인할 필요가 있다. 현재 IA64 리눅스 환경에서 나와있는 웹 애플리케이션 개발툴은 다음과 같다.

Ÿ Apache + PHP : 전통적인 웹 개발 환경이다. 기본 포함되어 있으므로 쉽게 이용할 수 있다.

Ÿ Zope : Python 기반으로 하여 개발되어 있기 때문에 역시 쉽게 이용이 가능하다.

Ÿ Catalina 4.0.1 : 자바 Web Container 로 이전의 Tomcat 4.0 버전이다. Servlet/JSP 환경으로 개발을 하려고 한다면 WAS 프로그램이 있어야 하는데 상용으로 나와있는 애플리케이션은 현재 없고 이와 같은 공개 엔진을 사용해야 한다.

Ÿ Jboss 2.4.4 : 자바 EJB Container 로서 EJB 표준에 맞는 애플리케이션을 개발하기 위해서 사용할 수 있는 공개용 EJB 서버이다.

Ÿ Jboss 2.4.3 + Tomcat 3.2.3 : 현재까지 나와있는 자바 EJB/Servlet/JSP 의 개발환경이다. Servlet/JSP 뿐만이 아니라 EJB 부분도 같이 개발이 되어야 한다면 이버전을 사용해야 한다.

위의 자바 웹 개발 환경은 현재 JDK 버전이 beta 상태로 JIT 도 지원하고 있지 않기 때문에 약간의 성능 저하가 있을 수 있다.

이상으로 현재 IA64 리눅스에서의 개발 환경을 알아보았다.

4. IA64 리눅스로의 애플리케이션 포팅

개발환경이 준비되었다면 개발 또는 포팅에 관한 사항을 미리 알고 있어야 한다. 이부분은 전혀 새로운 플랫폼이기 때문에 나름대로 해당 플랫폼의 장단점 또는 주의 사항을 알고 있어야 개발이 쉽게 이루어질 수 있는 것이다.

신규 개발을 하기 위해서는 아래 IA64의 특징을 알고 있으면 되지만 타 운용체제에서의 애플리케이션 포팅이나 또는 타 시스템에서의 포팅은 원래의 시스템의 특징까지 알고 있어야 어느 부분을 수정해야 하는지 알수 있으므로 상당한 노력이 필요하다. 그래서 포팅을 하는 경우에 다음의 방법론이 유용할 수 있다.

I. 현재 애플리케이션이 리눅스 환경인경우 : 32bit 환경이라면 IA64 시스템이 64bit 환경이라는 것만 주의하면 될것이다.

II. 현재 애플리케이션이 상용 유닉스 환경인 경우 : 해당환경에 GNU 개발툴 설치 -> 해당 환경에서 GNU 툴을 사용하여 컴파일하고 실행바이너리 생성 -> 실행 -> 문제점 확인 -> 수정 -> 완벽실행 -> IA64 환경에서 소스 컴파일 -> IA64 환경에서 실행 -> 문제점 해결

III. 현재 애플리케이션이 윈도우 환경인 경우 : 윈도우 의존적 라이브러리를 제거 또는 변경 후 2번을 수행함

이러한 방법론을 토대로 하여 개발을 진행하며 IA64 리눅스 환경의 특성을 알아보자.

n 커널설정

Ÿ Data Model : LP64

Type Size Alignment

Char 1 1

Short 2 2

Int 4 4

long int 8 8

long long int 8 8

Float 4 4

Double 8 8

long double 10 16

void * 8 8

Data Type 이 위와 같기 때문에 반드시 소스에서 이러한 부분에 대한 적절한 고려가 있어야 한다. 특히 포인터가 8 byte 라는 데에 주의해야 한다.

Ÿ Byte Order : Little-Endian

OS/Processor Byte-Order

Linux/Itanium Little-Endian

Linux/x86 Little-Endian

Solaris/Sparc Big-Endian

HP-UX/PA-RISC Big-Endian

Byte order 이기종간의 네트웍 애플리케이션에서 문제점이 발생할 수 있기 때문에 주의가 필요하다.

n Pointers

Ÿ 64bit 값을 가진다.

Ÿ 32bit 시스템에서는 int 와 long 이 크기가 같지만 64bit 환경에서는 서로 값의 차이기 있기 때문에 주의가 필요하다.

Ÿ 상수 0과 NULL 이 차이가 있다.

n 상수

C 상수 32bit 64bit

0xFFFFFF -1 4,294,967,295

4294967296 0 4,294,967,296

0x100000000 0 4,294,967,296

0xFFFFFFFFFFFFFFFF -1 -1

위의 크기차이는 앞의 실행프로그램의 예에서 32bit 와 64bit에서의 결과에 대한 차이를 확인할 수 있다. 크기는 sizeof() 연산자를 사용하여 각각의 환경에서 Data Type의 크기를 확인할 수 있고 값에 대한 비교는 단순히 printf()를 사용하여 아래와 같이 확인할 수 있다.

Ÿ 32bit

0xFFFFFFFF = 0xFFFFFFFF

4294967296 = 0

0x100000000 = 0x0

0xFFFFFFFFFFFFFFFF = -1

Ÿ 64bit

0xFFFFFFFF = 0xFFFFFFFF

4294967296 = 4294967296

0x100000000 = 0x100000000

0xFFFFFFFFFFFFFFFF = -1

n Structure와 Union

Data Type 의 문제는 역시 이러한 복합 Data Type 에도 영향을 미친다. 주의가 필요하다. 예를들어 다음의 구조체라면

struct node

{

char *text;

struct node *left;

struct node *right;

}

ILP32 환경에서는 12바이트이고 LP64 환경이라면 24바이트이다. Union에서는 더욱 주의가 필요하다. 이부분의 단순히 크기 계산에도 문제가 생기지만 포팅시 Endian 부분도 문제가 생겨서 most significant byte 와 least significant byte를 뒤바꾸어서 생각하는 경우가 생길 수 있으므로 주의가 필요하다.

n Library Call

printf(), scanf(), malloc(), lseek() 등과 같이 특정한 자료의 Data Type 의 크기에 의존할 수 있는 Library Call의 사용도 주의가 필요하고 포팅시 반드시 확인을 해야한다.

n 컴파일러

포팅이나 개발할 때 성능을 높이기 위한 방법으로 다양한 컴파일러의 최적화 옵션을 사용하게 되는데 아직 GNU C 컴파일러에서는 IA64 용으로 최적화 옵션이 그다지 준비되어 있지 않다. 그래서 앞서 설명한 인텔 컴파일러를 사용함으로써 IA64 프로세서에 최적화된 애플리케이션을 개발할 수 있다. 참고로 GNU 컴파일러는 주로 커널과 같은 시스템 의존이 강한 부분을 컴파일할 때 사용하는 것이 좋으며 인텔 컴파일러는 일반 애플리케이션을 컴파일할 때 사용하는 것이 좋을 것이다.

5. 자바 개발 예제

위에서 다양한 환경을 소개하였는데 IA64 리눅스 환경이라면 역시 엔터프라이즈급의 개발이 이루어진다고 보여진다. 이때는 자바개발환경이 필수적인데 이러한 개발에 샘플 방법론이 필요하다고 볼 수 있다. EJB 응용 프로그램을 개발하는 아주 작은 시작으로서 Sun의 Pet Store 데모를 운영해 본다.

이 작업을 위해서 다음과 같은 내용이 준비되어야 한다.

Ÿ Web과 EJB Container : Jboss 2.4.3 + Tomcat 3.2.3

Ÿ DBMS : 오라클 9i IA64 버전

Ÿ Java Develope Kit : IBM JDK 1.3 beta

Ÿ OS : RedHat 7.2 for Itanium

과정은 다음과 같다.

1) 개발툴 및 오라클을 설치한다.

2) 오라클 JDBC 드라이버를 사용할 수 있도록 한다.

3) Pet Store 부분을 매뉴얼에 맞춰 설치 및 설정을 한다.

4) Jboss 에서 오라클에 접근할 수 있도록 설정을 변경한다. Jboss+tomcat 프로그램을 설치한 곳의 tomcat 디렉토리에 보면 jboss.jcml 파일이 있다. 이부분에서 JDBC 부분을 적절히 변경한다.

5) CLASSPATH 설정이 잘되어 있다면 jboss/bin 디렉토리에서 run.sh 프로그램을 실행한다.

6) 적절한 실행로그를 볼 수 있다.

7) 모두 실행([Default] JBoss 2.4.3 Started in 1m:27s 라는 로그가 나옴) 되고 나면 웹브라우저를 통해서 접근을 한다.

다음을 웹 브라우저를 사용하여 Pet Store 데모에 접근한 내용이다.

그림 3) PetStore 데모화면

6. 결론

새로운 시스템에서의 다양한 활동을 준비하는 입장에서 리눅스 환경에 대한 조망을 해보았다. 아직은 시작하는 입장이지만 지속적인 개발과 발전으로 완벽하게 구현되는 엔터프라이즈 환경을 조만간 볼 수 있을 것이며 이러한 새로운 시스템 환경과 리눅스로의 발빠른 진입은 보유 애플리케이션을 좀 더 넓은 시장으로의 발전에 대한 계기가 될 것이며 좀더 범용적인 솔루션을 만들고 구현하며 운용할 수 있는 기술적인 기초를 마련할 수 있을 것이다. 지속적인 IA64 개발관련 애플리케이션이 나와주고 있고 발전하고 있기 때문에 미흡하지만 현재 시점에서의 시작은 적절한 선택이 될 수 있다.

요약

새로운 시스템 아키텍쳐의 출현의 그에 상응하는 제반 환경의 구

축이 반드시 필요하다. 이러한 환경 중에서 운영체제와 애플리케이션 개발을 위한 개발 툴의 지원은 최우선에 있다고 볼 수 있다. IA64 기술도 역시 리눅스에 빠르게 채용되어 개발되었으며 운영체제가 준비되어 있는 상태에서 다양한 개발환경의 출현은 당연한 사항이 되었다. 그러나 아직까지 IA64 환경에 익숙하지 못한 일반적인 개발자들이 개발환경에 대한 정확한 정보를 가지지 못하고 있어서 새로운 기술에 대한 접근이 쉽지 않게 되었다. 현재까지의 개발환경을 알게됨으로써 IA64의 새로운 기능을 활용한 제품의 개발에 효율적으로 이용이 가능할 것이다.

IA64 개발환경의 장점

Ÿ 64bit 시스템에 대한 손쉬운 접근이 가능하며

Ÿ 제품의 성능을 높일 수 있는 새로운 신규 플랫폼이 될 수 있으며

Ÿ 개발자의 입장에서 시스템 한계에 대한 고려없이 애플리케이션을 제작할 수 있는 환경이며

Ÿ 기존이 IA32 환경에서 제한적인 개발분야 – 예를들어 FP 부분 – 에 대한 효과적인 극복이 가능하며

Ÿ 엔터프라이즈 환경에서 많이 사용하는 유닉스 시스템 환경에 대한 접근을 쉽게 할 수 있다.

IA64 리눅스 환경에서의 개발

리눅스코리아 eSolution 컨설팅 팀장

이성주

[ 목차 ]

1. IA64의 특징

2. IA64 리눅스

3. IA64 리눅스 개발 환경

4. IA64 리눅스로의 애플리케이션 포팅

5. 자바 개발 데모

6. 결론

1. IA64의 특징

현재 출시된 IA64 프로세서의 특징을 간단히 정리한다.

n IA64 프로세서는 새로운 칩이다.

IA64 프로세스는 기존의 프로세서 – 인텔제품으로 펜티엄 시리즈 – 의 기능확장 프로세서가 아닌 구조에 대한 디자인이 다시 만들어진 완전히 새로운 프로세서이다. 물론 이 프로세서는 이전의 인텔 제품과의 호환성을 유지하기 위한 배려가 되어 있지만 이것은 이전 프로세서의 연장선상에 있는 제품은 아니라는 것을 반드시 기억해야 한다.

n 실수연산을 위한 강력한 성능을 가진다.

IA32 계열의 프로세서의 특징중 하나는 실수연산이 유난히 느리다는 점이 었다. 이점은 일반 애플리케이션이 실수연산을 그다지 많이 사용하지 않는다는 점에서 큰 문제가 안되었지만 IA32 장비를 수학계산용으로 사용하려고 하는 곳에서는 선택의 폭이 좁아지게 되는 것이다. 즉 상용 유닉스 시스템의 도입이 필수적이 된것이다.

그러나 이 새로운 프로세서는 이 부분에서 기존의 유닉스 시스템에 사용된 프로세서들을 능가하는 실수연산 성능을 가지고 응용을 기다리게 되었다. 즉 IA64 계열 프로세서를 사용한 시스템을 과학계산용이나 또는 실수연산을 많이 하는 인터넷 서비스 프로그램을 위해서도 충분히 사용할 가치를 가지게 된 것이다.

n EPIC 지원

프로세서의 성능을 높이는 방법은 두가지가 있다. 한가지는 프로세서의 클럭을 빠르게 하는 것이고 또 한가지는 병렬처리를 들 수 있다. 병렬처리는 순차적인 실행명령어들에 대한 프로세서의 해석을 순차적으로 하는 것이 아니라 가능한 방법안에서 병렬로 수행하는 것이다. 즉 어떠한 명령을 수행하다보면 그 명령이 끝날때까지 프로세서가 놀고 있는 경우가 생길 수 있다. 이러한 시점에서 앞서 수행한 명령과는 관련이 없는 다른 명령을 동시에 실행시켜줌으로써 순차적 실행보단 훨씬 빠른 성능을 낼 수 있는 방법이다. 이것은 단일 프로세서에서도 필요하지만 다중 프로세서상에서는 더욱더 필요한 기능이 될 수 있다.

이러한 프로세서의 병렬처리를 위한 기법이 여러가지 있는데 그중 IA64 프로세서가 택한 방법이 EPIC(Explicit Parallel Instruction Computing) 이다. EPIC을 IA32 시스템에서 구현하기가 다양한 문제로 인해서 어려움이 있었다.

EPIC에는 3가지 특징이 있는데 다음과 같은 내용을 들 수 있다.

Ÿ Speculation : 값에 대한 사전결정을 의미한다. 즉 메모리 참조를 통해서 값을 가지올 것을 실제 수행명령중에 하는 것이 아니라 이전에 이미 fetching 을 해놓아서 메모리 접근 지연을 줄일 수 있는 것이다. 주로 계산을 많이 하는 애플리케이션에서 많은 효과가 있다.

Ÿ Predication : 순차적인 명령의 분기를 줄일 수 있는 방법으로 분기하여야할 내용에 대한 것을 predicate register 에 해놓음으로써 성능을 높일 수 있다.

Ÿ RRF(Rotating Register File) : 시스템 콜의 속도를 높여주는 방법이다.

이러한 병렬처리기능을 프로세서, 운영체제, 컴파일러등이 원활하게 지원을 해주어야 할 사항이다.

n 64bit 주소공간

사용자 프로세스에게 18,446,744,073,709,551,616 바이트의 주소공간을 사용할 수 있도록 해준다.

메모리의존성 애플리케이션들에는 많은 성능향상의 기회가 될 수 있다.

2. IA64 리눅스

IA64 환경으로 가장 빠르게 포팅된 운영체제이다. 포팅이 빨리되었다고 좋은 것은 아니지만 애플리케이션을 개발할 수 있는 환경이 마련된것으로는 큰 의미를 가질 수 있다. 그런 의미에서 몇가지 특징을 살펴보고 간략하게 설치과정상 중요한 점을 레드햇 배포판을 기준으로 설명한다.

n IA64 버전의 리눅스 커널은 64bit 이다. 즉 프로세서의 특징을 잘 사용할 수 있도록 개발된 것이다. 리눅스가 IA32 환경에서 개발이 시작되고 발전하여 왔기 때문에 약간은 의존성이 있지만 IA64 리눅스 커널을 완전히 새롭게 재 작성한 것이다. 기존의 64bit 프로세서(Alpha, Sparc64, PA-RISC등)로 리눅스를 포팅했던 많은 커널 개발자가 있었기 때문에 빠르게 개발이 되었으며 현재로 리눅스 커널의 특성상 발전을 계속하고 있다.

n Linux/x86 즉 IA32 환경의 애플리케이션과도 호환성을 유지하도록 작성하고 있다. 그러나 이 부분은 문제가 될 수 있다. 호환성이 정확한 실행을 보장해주진 않기 때문에 즉 최소한의 재컴파일 과정은 거치는 것이 안전하다는 것이다. 즉 호환성이라 함을 IA32 리눅스와의 프로그램 소스차원의 호환을 최대한 유지한다는 것이지 바이너리 차원에서는 아니라는 것다. 다음의 예제를 보면 알 수 있다. 다음은 32bit 환경에서 Data Type 의 크기를 확인하는 프로그램이다. 이것을 32bit 환경에서 실행해 본다.

실행 소스는 다음과 같다.

#include

void main()

{

struct node

{

char *text;

struct node *left;

struct node *right;

};

printf(“sizeof 123456 = %dn”, sizeof(123456));

printf(“sizeof 123456L = %dn”, sizeof(123456L));

printf(“sizeof 123456UL = %dnn”, sizeof(123456UL));

printf(“0xFFFFFFFF = 0x%Xn”, 0xFFFFFFFF);

printf(“4294967296 = %dn”, 4294967296UL);

printf(“0x100000000 = 0x%Xn”, 0x100000000UL);

printf(“0xFFFFFFFFFFFFFFFF = %dnn”, 0xFFFFFFFFFFFFFFFFUL);

printf(“struct noden”);

printf(“{n”);

printf(” char *textn”);

printf(” struct node *leftn”);

printf(” struct node *rightn”);

printf(“}n”);

printf(“n”);

printf(“sizeof struct node = %d bytesn”, sizeof(struct node));

}

[root@32bitenv 32bit]$ ./sizeof.bin

sizeof 123456 = 4

sizeof 123456L = 4

sizeof 123456UL = 4

0xFFFFFFFF = 0xFFFFFFFF

4294967296 = 0

0x100000000 = 0x0

0xFFFFFFFFFFFFFFFF = -1

struct node

{

char *text

struct node *left

struct node *right

}

sizeof struct node = 12 bytes

위의 결과는 정확하다고 할 수 있다. 그러나 이 실행 프로그램을 64bit 환경에서 실행시키면 다음과 같은 결과가 나온다.

[root@64bitenv 32bit]# ./sizeof.bin

sizeof 123456 = 4

sizeof 123456L = 4

sizeof 123456UL = 4

0xFFFFFFFF = 0x7FFFF868FFFFFFFF

4294967296 = 4294967296

0x100000000 = 0x100000000

0xFFFFFFFFFFFFFFFF = -1

struct node

{

char *text

struct node *left

struct node *right

}

sizeof struct node = 12 bytes

이 프로그램 소스를 printf 부분을 64bit 환경에서 맞게 다음 소스처럼 약간 수정하고 컴파일하여 실행파일을 만들어서 실행시키면 다음과 같은 결과가 나온다.

#include

void main()

{

struct node

{

char *text;

struct node *left;

struct node *right;

};

printf(“sizeof 123456 = %dn”, sizeof(123456));

printf(“sizeof 123456L = %dn”, sizeof(123456L));

printf(“sizeof 123456UL = %dnn”, sizeof(123456UL));

printf(“0xFFFFFFFF = 0x%llXn”, 0xFFFFFFFF);

printf(“4294967296 = %lldn”, 4294967296UL);

printf(“0x100000000 = 0x%llXn”, 0x100000000UL);

printf(“0xFFFFFFFFFFFFFFFF = %lldnn”, 0xFFFFFFFFFFFFFFFFUL);

printf(“struct noden”);

printf(“{n”);

printf(” char *textn”);

printf(” struct node *leftn”);

printf(” struct node *rightn”);

printf(“}n”);

printf(“n”);

printf(“sizeof struct node = %d bytesn”, sizeof(struct node));

}

[root@64bitenv 64bit]# ./sizeof.bin

sizeof 123456 = 4

sizeof 123456L = 8

sizeof 123456UL = 8

0xFFFFFFFF = 0xFFFFFFFF

4294967296 = 4294967296

0x100000000 = 0x100000000

0xFFFFFFFFFFFFFFFF = -1

struct node

{

char *text

struct node *left

struct node *right

}

sizeof struct node = 24 bytes

위의 두가지 결과를 보면 차이가 나는 것을 볼 수 있다. 뒤에서 설명하겠지만 이 두 환경의 Data Type 이 틀리기 때문에 32bit 바이너리를 그냥 실행시키는 경우 원치 않는 결과가 나올 수도 있고 또한 소스를 재컴파일하여 실행파일을 만든다고 하더라도 역시 주의가 필요하다.

n 플랫폼 의존코드의 최소화 : 이 부분은 역시 포팅의 필수적인 사항으로 각 Architecture 별로 의존적인 코드를 커널에 넣는 것은 문제발생의 원인이 되기 때문에 최소한의 의존적인 코드만을 삽입하는 것이 포팅을 쉽게 하는 방법이 된다. 이런 의미에서 리눅스 커널에서는 다양한 플랫폼에 포팅을 시도하고 있어서 IA64 환경도 이러한 노력의 일환이 되고 있고 역시 플랫폼 의존적인 코드는 많지 않다는 것이다.

n 64bit 성능을 내기 위한 코드를 사용 : 64bit 환경에서 사용자들이 자신의 애플리케이션을 활용함에 있어 성능향상을 경험할 필요가 있다. 운영체제의 64bit에 대한 효율적인 성능지원은 컴파일러의 효율적인 64bit 코드 생성만큼이나 중요한 부분이라고 할 수 있다.

n 다양한 표준 준수 : IA64 Software Conversion 이나 EFI(Extensible Fireware Interface), Unix ABI(Application Binary Interfac) 등의 표준을 지켜서 Unix와 그밖의 개발환경에서의 소프트웨어 포팅이 좀더 쉽고 빠르게 이루어질 수 있도록 하였다.

n 설치가능 배포판

현재까지(2002년 1월) 나와있는 IA64 환경의 배포판은 다음과 같다. 4대 주요 리눅스 배포판업체의 제품들이 모두 포함되어 있다. 나름대로 특장점이 있겠지만 새로운 시스템 환경에서 최적으로 사용할 수 있도록 준비가 되고 있다. 아무래도 IA64 시스템이면 간단한 업무에 적용하기 보단 엔터프라이즈급 업무에 적용하려는 노력이 많이 이루어질텐데 이러한 상황에 발맞춰서 개발이 되고 있다고 보여진다. 다음과 같은 제품들이 나와있다.

RedHat 7.2 for Itanium

TurboLinux 7.0 for Itanium

OpenLinux 64

SuSE Linux Enterprise Server 7 for Itanium Processor Family

참고로 SuSE 와 TurboLinux 는 IA64 시스템 개발 초기부터 배포판 작업을 해왔기 때문에 상당히 성능이 우수하다고 볼 수 있으며 RedHat 제품은 다양한 테스트를 통해서 안정성을 높여왔고 기존의 RedHat 사용자들이 쉽게 사용할 수 있도록 이전버전과의 유사성을 계속유지하고 있으며 OpenLinux는 편리한 사용자 환경을 구현해 주고 있다.

간략히 IA64 시스템에 레드햇 배포판을 설치해보면서 주의점을 알아본다. 여기서 사용한 버전은 7.2 Beta 버전으로 현재 나온 버전과는 조금 차이가 있을 수 있다. IA64 시스템은 EFI를 사용하기 때문에 EFI Shell과 MS-DOS 파티션에 대해서 약간 알고 있어야 한다. 다양한 운영체제를 쉽게 지원하기 위해서 도입된 방법으로 운영체제의 부팅을 도와주는 시스템 내부의 프로그램이라고 볼 수 있다. EFI 는 일종의 MS-DOS 환경이고 EFI 환경에서 실행되는 프로그램도 만들 수 있다. 그래서 시스템에 운영체제를 설치할때는 반드시 EFI 를 위한 파티션 영역도 준비를 해야 한다. 이 부분이 일반적인 IA32 환경의 리눅스 설치와 다른 점이다. 즉 MS-DOS(FAT16) 파일시스템 영역이 일정량만큼 준비되어야 하는 것이다. 리눅스를 운영체제로 사용하기 위해서 필요한 EFI 파티션(FAT16파티션)의 용량은 약 30MB 정도면 충분하다. 만약 다양한 운영체제를 같이 설치하고 싶다면 100MB정도 잡아주는 것이 좋다.

시스템에 설치전에 준비해야할 사항은 Itanium 용 RedHat 7.2Beta CD 두장정도이다. 즉 CD로부터 운영체제를 설치하는 것이다. 절대 부팅시디는 아니다. 그리고 이전에 레드햇 설치를 해본적이 있어야 한다. 기본적으로 EFI부분을 제외하고는 모두 이전방법과 동일하기 때문이다.

CD를 넣고 IA64 시스템을 시작하여 정상적인 하드웨어 점검을 하고 나면 EFI 시작화면이 나온다. 기존의 IA32 환경과는 다르게 CD로 부터 바로 부팅이 되지 않고 EFI Shell에서 레드햇 설치 프로그램을 구동해야 한다. 다른 리눅스 배포판도 모두 마찬가지이다.

메뉴에서 EFI Shell 을 선택하면 다음처럼 프롬프트가 나온다.

Shell>

이제 여기서 EFI Shell 명령어를 사용할 수 있다. 먼저 map 이라는 명령을 해보면 다음처럼 나온다.

Device mapping table

fs0 : VenHw(Unknown Device:00)/HD(Part1,Sig00000000)

fs1 : VenHw(Unknown Device:80)/HD(Part1,Sig00000000)

fs2 : VenHw(Unknown Device:FF)/CDROM(Entry1)/HD(Part1,Sig00000000)

blk0 : VenHw(Unknown Device:00)

blk1 : VenHw(Unknown Device:00)/HD(Part1,Sig00000000)

blk2 : VenHw(Unknown Device:80)

blk3 : VenHw(Unknown Device:80)/HD(Part1,Sig00000000)

blk4 : VenHw(Unknown Device:80)/HD(Part2,Sig00000000)

blk5 : VenHw(Unknown Device:80)/HD(Part3,Sig00000000)

blk6 : VenHw(Unknown Device:80)/HD(Part3,Sig00000000)/HD(Part1,Sig725F7772)

map 은 현재 디스크장치의 환경이 어떻게 되어 있으며 각 디스크환경에 따른 MS-DOS의 드라이브 명을 보여준다. 위의 화면에서 fs0, fs1, blk0, … 등 이러한 부분이 드라이브 이름이라고 생각하면 된다.

MS-DOS에서 드라이브를 옮길 때 보통 C:, D: 하듯이 이제 레드햇 설치 CD 가 있는 드라이브로 이동해야 한다. 위의 화면에 보면 fs2 번이 CDROM 임을 알 수 있다. 간단히 EFI Shell 상에서 fs2: 라고 입력하면 해당 드라이브로 이동한다. 그러면 프롬프트가 바뀐다.

Shell> fs2:

fs2:>

여기서 dir 해보면 .efi 라는 확장자를 가진 파일이 있다. 보통은 elilo.efi 라고 되어 있다. 이것이 리눅스 설치 이미지를 구동시키는 실행파일이다. 간단히 elilo라고 입력하면 전통적인 레드햇 설치 화면이 나온다.

fs2: > elilo

이제 다른 플랫폼의 레드햇 설치방법에 따라서 설치하면 된다. 한가지 중요한 것은 앞에서 설명한 것 처럼 반드시 일정용량의 FAT16 형식의 파티션이 있어야 하기 때문에 파티션 설정부분에서 설정하는 것을 잊으면 안된다.

간단하게 IA64 시스템에 레드햇을 설치해 봤다.

3. IA64 리눅스 개발환경

현재까지 IA64 리눅스 환경에서 사용할 수 있는 개발 환경을 알아본다. 개발 언어와 개발 환경 그리고 중요한 DBMS 부분으로 나눌 수 있는데 먼저 개발 언어를 보면 다음과 같다.

n 개발언어

Ÿ C : 전통적 개발언어로 GNU 컴파일러 부분에 기본적으로 포함되어 있고 이 GNU 컴파일러는 IA64 리눅스 배포판에 역시 기본적으로 포함되어 있다. C 컴파일러인 gcc 의 버전은 2.9x와 3.0x 버전이 있다. 이외에 인텔의 컴파일러가 있으며 버전은 6.0 이다. http://developer.intel.com/software/products/compilers/c50/linux/ 에서 구할 수 있다.

Ÿ C++ : 역시 전통적 개발언어로 GNU 컴파일러 부분에 포함되며 리눅스 배포판에 포함되어 있다. 인텔컴파일러도 C++ 을 지원한다.

Ÿ Java : 엔터프라이즈 환경에서 개발 언어로 필수적인 자바도 역시 지원된다. IBM에서 만들고 있으며 1.3 SE beta 이다. 최신버전은 http://alphaworks.ibm.com/tech/linuxsdk 에서 구할 수 있다.

Ÿ Python : 생산성 높은 스크립트 언어로서 다양한 환경에서 동작하므로 개발이 편리한 언어이다. 리눅스 배포판에 기본적으로 포함되어 있기 때문에 원활이 사용이 가능하다. http://www.python.org 에서 최신버전을 구할 수 있다.

Ÿ Perl : 리눅스 배포판에 기본적으로 포함되어 있기 때문에 쉽게 사용할 수 있다.

Ÿ PHP : 역시 리눅스 배포판에 포함되어 있으며 웹개발을 위한 스크립팅언어로 생산성이 높다. 같이 포함된 Apache 웹서버와 연결하여 웹 애플리케이션을 쉽게 만들어 낼 수 있다.

Ÿ Fortran : GNU 컴파일러의 일부로 포함되어 있으며 인텔 컴파일러에도 포함되어 있다.

n 개발환경

개발환경은 KDE와 GNOME GUI 환경에 따라 다양한 프로그램이 리눅스 배포판에 기본적으로 포함되어 있다. 다음은 KDE에 포함된 통합개발환경인 Kdevelop 프로그램이다.

그림 1) Kdevelop 실행화면

윈도우에서 개발시 많이 사용하는 프로그램과 유사하여 윈도우 개발자들도 쉽게 리눅스 애플리케이션을 개발할 수 있는 환경이라고 볼 수 있다.

다음은 GNOME에서 주로 UI 부분을 개발하기 위해서 사용하는 glade 프로그램이다.

그림 2) GNOME UI 디자인 프로그램

이 역시 윈도우 환경에서 개발시에 많이 사용하는 RAD 툴들과 비슷하여 쉽게 개발할 수 있도록 도움을 주고 있다.

이외에도 각종 Vi, Emacs 와 같은 전통적인 개발 편집기와 Quanta 와 같은 Web 페이지 개발 툴등이 있으며 CUI 환경에서 개발을 도와주는 각종 GNU 툴들이 리눅스 배포판에 기본적으로 포함되어 있기 때문에 이전에 윈도우 환경이나 UNIX 환경에서 개발했던 개발자라면 쉽게 IA64 리눅스용 애플리케이션을 개발할 수 있을 것이다.

n DBMS

IA64 리눅스 환경이 엔터프라이즈급에서 사용되기 위해서 필수적인 부분이 DBMS 의 지원이라고 볼 수 있다. 현재 IA64 환경에서 사용할 수 있는 DBMS는 다음과 같다.

Ÿ 오라클 : 현재 Oracle 9i Developer’s Release 가 나와 있는 상태이다. http://technet.oracle.com/software/products/oracle9i/content.html 에서 구할 수 있다. 다른 플랫폼 버전에 있는 설치프로그램이 없기 때문에 설치가이드를 읽고 수동으로 DB 생성을 해야 한다. 다음은 IA64 리눅스 버전의 오라클을 동작시키는 화면이다.

[ 오라클 구동 화면 ]

[ Listener 구동화면 ]

[ 샘플 데이터베이스에 접근하여 자료를 가져오는 화면 ]

오라클 서버에는 윈도우용 오라클 9i 클라이언트 프로그램으로 접근하여 작업을 할 수 있다.

Ÿ DB2 : IBM DB2 Universal Database Developers kit for Linux on Itanium Processor Family – V7.2 라는 긴이름을 가지고 현재 나와 있다. 개발자 버전이라서 주변적인 애플리케이션들이 많이 준비되어 있진 않지만 리눅스에서 운용을 충분히 가능하다. 다음은 운용되고 있는 DB2 관련 내용이다.

[ DB2 프로세스가 구동되고 있는 화면 ]

[ db2 라는 이름의 DB2 Front End 프로그램을 사용하여 로컬의 DB2 서버에 접속하기 위한 화면 ]

[ 샘플 데이터베이스에 접근하여 자료를 가져오는 화면 ]

Ÿ MySQL : 리눅스 배포판에 기본적으로 포함되어 있기 때문에 필요할 때 편리하게 사용할 수 있다. 가장 최신버전도 역시 http://www.mysql.com/ 에서 구할 수 있으며 별 문제없이 컴파일하여 IA64 리눅스 환경에서 운용할 수 있다.

Ÿ PostgreSQL : MySQL과 같이 공개 DBMS로서 기본적으로 포함되어 있거나 또는 http://www.postgresql.org/ 에서 소스 또는 바이너리를 구하여 사용할 수 있다.

n 웹 애플리케이션

웹으로 애플리케이션을 개발하려고 하는 부분에 있어서도 역시 지원되는 부분을 확인할 필요가 있다. 현재 IA64 리눅스 환경에서 나와있는 웹 애플리케이션 개발툴은 다음과 같다.

Ÿ Apache + PHP : 전통적인 웹 개발 환경이다. 기본 포함되어 있으므로 쉽게 이용할 수 있다.

Ÿ Zope : Python 기반으로 하여 개발되어 있기 때문에 역시 쉽게 이용이 가능하다.

Ÿ Catalina 4.0.1 : 자바 Web Container 로 이전의 Tomcat 4.0 버전이다. Servlet/JSP 환경으로 개발을 하려고 한다면 WAS 프로그램이 있어야 하는데 상용으로 나와있는 애플리케이션은 현재 없고 이와 같은 공개 엔진을 사용해야 한다.

Ÿ Jboss 2.4.4 : 자바 EJB Container 로서 EJB 표준에 맞는 애플리케이션을 개발하기 위해서 사용할 수 있는 공개용 EJB 서버이다.

Ÿ Jboss 2.4.3 + Tomcat 3.2.3 : 현재까지 나와있는 자바 EJB/Servlet/JSP 의 개발환경이다. Servlet/JSP 뿐만이 아니라 EJB 부분도 같이 개발이 되어야 한다면 이버전을 사용해야 한다.

위의 자바 웹 개발 환경은 현재 JDK 버전이 beta 상태로 JIT 도 지원하고 있지 않기 때문에 약간의 성능 저하가 있을 수 있다.

이상으로 현재 IA64 리눅스에서의 개발 환경을 알아보았다.

4. IA64 리눅스로의 애플리케이션 포팅

개발환경이 준비되었다면 개발 또는 포팅에 관한 사항을 미리 알고 있어야 한다. 이부분은 전혀 새로운 플랫폼이기 때문에 나름대로 해당 플랫폼의 장단점 또는 주의 사항을 알고 있어야 개발이 쉽게 이루어질 수 있는 것이다.

신규 개발을 하기 위해서는 아래 IA64의 특징을 알고 있으면 되지만 타 운용체제에서의 애플리케이션 포팅이나 또는 타 시스템에서의 포팅은 원래의 시스템의 특징까지 알고 있어야 어느 부분을 수정해야 하는지 알수 있으므로 상당한 노력이 필요하다. 그래서 포팅을 하는 경우에 다음의 방법론이 유용할 수 있다.

I. 현재 애플리케이션이 리눅스 환경인경우 : 32bit 환경이라면 IA64 시스템이 64bit 환경이라는 것만 주의하면 될것이다.

II. 현재 애플리케이션이 상용 유닉스 환경인 경우 : 해당환경에 GNU 개발툴 설치 -> 해당 환경에서 GNU 툴을 사용하여 컴파일하고 실행바이너리 생성 -> 실행 -> 문제점 확인 -> 수정 -> 완벽실행 -> IA64 환경에서 소스 컴파일 -> IA64 환경에서 실행 -> 문제점 해결

III. 현재 애플리케이션이 윈도우 환경인 경우 : 윈도우 의존적 라이브러리를 제거 또는 변경 후 2번을 수행함

이러한 방법론을 토대로 하여 개발을 진행하며 IA64 리눅스 환경의 특성을 알아보자.

n 커널설정

Ÿ Data Model : LP64

Type Size Alignment

Char 1 1

Short 2 2

Int 4 4

long int 8 8

long long int 8 8

Float 4 4

Double 8 8

long double 10 16

void * 8 8

Data Type 이 위와 같기 때문에 반드시 소스에서 이러한 부분에 대한 적절한 고려가 있어야 한다. 특히 포인터가 8 byte 라는 데에 주의해야 한다.

Ÿ Byte Order : Little-Endian

OS/Processor Byte-Order

Linux/Itanium Little-Endian

Linux/x86 Little-Endian

Solaris/Sparc Big-Endian

HP-UX/PA-RISC Big-Endian

Byte order 이기종간의 네트웍 애플리케이션에서 문제점이 발생할 수 있기 때문에 주의가 필요하다.

n Pointers

Ÿ 64bit 값을 가진다.

Ÿ 32bit 시스템에서는 int 와 long 이 크기가 같지만 64bit 환경에서는 서로 값의 차이기 있기 때문에 주의가 필요하다.

Ÿ 상수 0과 NULL 이 차이가 있다.

n 상수

C 상수 32bit 64bit

0xFFFFFF -1 4,294,967,295

4294967296 0 4,294,967,296

0x100000000 0 4,294,967,296

0xFFFFFFFFFFFFFFFF -1 -1

위의 크기차이는 앞의 실행프로그램의 예에서 32bit 와 64bit에서의 결과에 대한 차이를 확인할 수 있다. 크기는 sizeof() 연산자를 사용하여 각각의 환경에서 Data Type의 크기를 확인할 수 있고 값에 대한 비교는 단순히 printf()를 사용하여 아래와 같이 확인할 수 있다.

Ÿ 32bit

0xFFFFFFFF = 0xFFFFFFFF

4294967296 = 0

0x100000000 = 0x0

0xFFFFFFFFFFFFFFFF = -1

Ÿ 64bit

0xFFFFFFFF = 0xFFFFFFFF

4294967296 = 4294967296

0x100000000 = 0x100000000

0xFFFFFFFFFFFFFFFF = -1

n Structure와 Union

Data Type 의 문제는 역시 이러한 복합 Data Type 에도 영향을 미친다. 주의가 필요하다. 예를들어 다음의 구조체라면

struct node

{

char *text;

struct node *left;

struct node *right;

}

ILP32 환경에서는 12바이트이고 LP64 환경이라면 24바이트이다. Union에서는 더욱 주의가 필요하다. 이부분의 단순히 크기 계산에도 문제가 생기지만 포팅시 Endian 부분도 문제가 생겨서 most significant byte 와 least significant byte를 뒤바꾸어서 생각하는 경우가 생길 수 있으므로 주의가 필요하다.

n Library Call

printf(), scanf(), malloc(), lseek() 등과 같이 특정한 자료의 Data Type 의 크기에 의존할 수 있는 Library Call의 사용도 주의가 필요하고 포팅시 반드시 확인을 해야한다.

n 컴파일러

포팅이나 개발할 때 성능을 높이기 위한 방법으로 다양한 컴파일러의 최적화 옵션을 사용하게 되는데 아직 GNU C 컴파일러에서는 IA64 용으로 최적화 옵션이 그다지 준비되어 있지 않다. 그래서 앞서 설명한 인텔 컴파일러를 사용함으로써 IA64 프로세서에 최적화된 애플리케이션을 개발할 수 있다. 참고로 GNU 컴파일러는 주로 커널과 같은 시스템 의존이 강한 부분을 컴파일할 때 사용하는 것이 좋으며 인텔 컴파일러는 일반 애플리케이션을 컴파일할 때 사용하는 것이 좋을 것이다.

5. 자바 개발 예제

위에서 다양한 환경을 소개하였는데 IA64 리눅스 환경이라면 역시 엔터프라이즈급의 개발이 이루어진다고 보여진다. 이때는 자바개발환경이 필수적인데 이러한 개발에 샘플 방법론이 필요하다고 볼 수 있다. EJB 응용 프로그램을 개발하는 아주 작은 시작으로서 Sun의 Pet Store 데모를 운영해 본다.

이 작업을 위해서 다음과 같은 내용이 준비되어야 한다.

Ÿ Web과 EJB Container : Jboss 2.4.3 + Tomcat 3.2.3

Ÿ DBMS : 오라클 9i IA64 버전

Ÿ Java Develope Kit : IBM JDK 1.3 beta

Ÿ OS : RedHat 7.2 for Itanium

과정은 다음과 같다.

1) 개발툴 및 오라클을 설치한다.

2) 오라클 JDBC 드라이버를 사용할 수 있도록 한다.

3) Pet Store 부분을 매뉴얼에 맞춰 설치 및 설정을 한다.

4) Jboss 에서 오라클에 접근할 수 있도록 설정을 변경한다. Jboss+tomcat 프로그램을 설치한 곳의 tomcat 디렉토리에 보면 jboss.jcml 파일이 있다. 이부분에서 JDBC 부분을 적절히 변경한다.

5) CLASSPATH 설정이 잘되어 있다면 jboss/bin 디렉토리에서 run.sh 프로그램을 실행한다.

6) 적절한 실행로그를 볼 수 있다.

7) 모두 실행([Default] JBoss 2.4.3 Started in 1m:27s 라는 로그가 나옴) 되고 나면 웹브라우저를 통해서 접근을 한다.

다음을 웹 브라우저를 사용하여 Pet Store 데모에 접근한 내용이다.

그림 3) PetStore 데모화면

6. 결론

새로운 시스템에서의 다양한 활동을 준비하는 입장에서 리눅스 환경에 대한 조망을 해보았다. 아직은 시작하는 입장이지만 지속적인 개발과 발전으로 완벽하게 구현되는 엔터프라이즈 환경을 조만간 볼 수 있을 것이며 이러한 새로운 시스템 환경과 리눅스로의 발빠른 진입은 보유 애플리케이션을 좀 더 넓은 시장으로의 발전에 대한 계기가 될 것이며 좀더 범용적인 솔루션을 만들고 구현하며 운용할 수 있는 기술적인 기초를 마련할 수 있을 것이다. 지속적인 IA64 개발관련 애플리케이션이 나와주고 있고 발전하고 있기 때문에 미흡하지만 현재 시점에서의 시작은 적절한 선택이 될 수 있다.

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

1 Response

  1. smooth jazz music 말해보세요:

    smooth jazz music

페이스북/트위트/구글 계정으로 댓글 가능합니다.