전체 글: 429개의 글

합병정렬 - 알고리즘

Posted by ironmask84
2008. 9. 21. 22:43 컴퓨터공학


 
 Merge Sort


합병정렬은 mergesort(머지소트)라고도 불리우며 O(nlogn)의 복잡도를 가지는 정렬알고리즘이다. 합병정렬 또한 앞서 살펴본 분할정복법을 사용한다. 정렬은 해당 아이템의 수가 많은 수록 비교 및 삽입 연산이 많이 발생하게 된다. 따라서 그 연산을 최소화하기 위하여 정렬하고자 하는 해당 배열을 충분히 분할한 후 거꾸로 합병하면서 정렬을 하여 최종적으로 전체 배열의 정렬을 하는 방식이다.

합병정렬은 다음과 같은 절차로 진행된다.

1. 분할 : 배열을 n/2개 아이템으로 가진 2개의 부분배열로 분할한다.
2. 정복 : 정렬함으로써 각 부분배열을 정복한다(푼다). 배열이 충분히 작지 않으면 재귀 호출을 한다.
3. 통합 : 부분 배열에 대한 답들을 합병하여 하나의 정렬된 배열로 만든다.

배열을 2개 이상의 배열로 분할 할 수 있는데 n개의 배열로 분할하게 되면 n-원 합병정렬이 된다.

다음은 재귀적 방법을 이용하여 합병정렬을 구현한 것이다. 재귀적 함수에는 반드시 종료조건이 존재해야 한다. 종료조건은 배열의 크기가 1에 도달하는 경우가 되고, 바로 그 시점부터 합병이 시작된다.

사용자 삽입 이미지

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define KEY_SIZE   50    // 정렬할 배열의 크기
// 배열의 내용을 다른 배열로 복사하는 함수
void arrayCopy(const int src[], int dest[], int size)
{
      int i;
      for (i=0; i<size; i++) {
            dest[i] = src[i];
      }
}
// 분할된 부분배열을 합병하는 함수
void merge(int h, int m, int Ldiv[], int Rdiv[], int key[])
{
      int i, j, k;
      i = j = k = 0;
 
      while (i < h && j < m) {
            if (Ldiv[i] < Rdiv[j]) {
                  key[k] = Ldiv[i++];
            } else {
                  key[k] = Rdiv[j++];
            }
            k++;
      }
 
      /* 나눠진 두개의 배열에서 어느 한쪽이 더 큰경우
       * 나머지 배열의 요소를 복사한다.
       */

      if (i == h)
            arrayCopy(Rdiv+j, key+k, m-j);
      else
            arrayCopy(Ldiv+i, key+k, h-i);
}
// 합병정렬을 수행하는 함수
void mergeSort(int n, int key[])
{
      const int h = n/2;
      const int m = n -h;
      int L_index, R_index, key_index;
      int *Ldiv, *Rdiv;
      if (n>1) {
            Ldiv = (int *)malloc(h * sizeof(int));
            Rdiv = (int *)malloc(m * sizeof(int));
            arrayCopy(key, Ldiv, h);
            arrayCopy(key+h, Rdiv, m);
 
            mergeSort(h, Ldiv);
            mergeSort(m, Rdiv);
            merge(h, m, Ldiv, Rdiv, key);
 
            free(Ldiv);
            free(Rdiv);
      }
}
int main(void)
{
      int i;
      int key[KEY_SIZE];
 
      srand((unsigned int)time(NULL));
      printf("====== Before Merge sort");
      for (i=0; i<KEY_SIZE; i++) {
            if (i%20 == 0)
                  puts("\n");
            key[i] = rand() % 100;  // KEY_SIZE 만큼의 무작위 수 생성
            printf("%d ", key[i]);
      }
      mergeSort(KEY_SIZE, key);   // 합병정렬
      printf("\n\n====== After Merge sort");
      for (i=0; i<KEY_SIZE; i++) {
            if (i%20 == 0)
                  puts("\n");
            printf("%d ", key[i]);
      }
      return 0;
}

위 구현된 합병정렬을 살펴보면 알겠지만 합병정렬을 수행하기 위해 입력된 배열 이외의 추가적인 배열(Ldiv, Rdiv)가 사용되는 것을 알 수 있다. 따라서 mergeSort 함수가 수행될 때 마다 배열들이 추가적으로 할당된다.

최상위의 두 배열의 아이템 개수는 n개이다. 처음 재귀호출을 하게 되면 이는 n/2개가 되고, 다음에는 n/4개가 된다. 평균적으로 재귀 호출시 두 배열의 아이템 개수는 바로 전 아이템 개수 합의 반이 된다. 따라서 추가적으로 만들어지는 배열아이템의 총 수는 n(1 + 1/2 + 1/4 + ... ) = 2n 이 된다.

위의 예제가 분할정복법(Divide-and-Conquer)를 설명하기에는 적합할지 모르지만 메모리 사용에서는 상당히 비 효율적이다. 따라서 제자리정렬(in-place sort)로 다시 구현해 보자. 제자리정렬은 입력을 저장하는 데 필요한 장소 이외의 추가적인 저장장소를 사용하지 않는 정렬 알고리즘이다.

다음은 제자리 정렬로 구현한 합병정렬이다.

void merge(int low, int mid, int high)
{
      int i, j, k;
      for (i=low; i<=high; i++) {
            temp[i] = key[i];       // 임시배열로 해당 키 값을 복사한다.
      }
      i = low; j = mid+1; k = low;
      while (i <= mid && j <= high)
            if (temp[i] < temp[j])
                  key[k++] = temp[i++];   // 다시 원래 배열로 키 값을 크기에 맞게 복사한다.
            else
                  key[k++] = temp[j++];
      while (i <= mid)              // 키값에 따라 복사되고 난 나머지 키들을 복사한다.
            key[k++] = temp[i++];
}
void mergeSort(int low, int high)
{
      int mid;
      if (low < high) {
            mid = (low + high)/2;
            mergeSort(low, mid);
            mergeSort(mid+1, high);
            merge(low, mid, high);
      }
}

출처: http://proneer.tistory.com/entry/Sort-합병-정렬Merge-Sort

'컴퓨터공학' 카테고리의 다른 글

국제 프로그래밍 대회 Codeforce  (0) 2016.04.28
Software Process Model  (0) 2008.09.28
퀵소트 - 알고리즘  (4) 2008.09.21
삽입정렬 - 알고리즘  (0) 2008.09.21
임베디드 시스템과 임베디드  (0) 2008.09.15
Embedded에서 ARM의 의미  (0) 2008.09.15
운영체제의 종류  (0) 2008.09.15
프로그래밍언어론 - 용어  (0) 2008.09.03
cache 적중률  (1) 2008.08.31
cache memory - 2  (0) 2008.08.31
 

퀵소트 - 알고리즘

Posted by ironmask84
2008. 9. 21. 22:38 컴퓨터공학



 
Quick Sort


퀵 정렬(Quick Sort)는 호아(Hoare, 1962)가 정의한 알고리즘으로 이름에서도 알 수 있듯이 매우 빠른 수행속도를 가진다. 퀵 정렬은 합병정렬과 비슷하게 분할정복법(Divide-and-Conquer) 방법에 근거한다. 전체 데이터를 두 부분으로 분할한 다음, 분할된 각 부분은 재귀적으로 다시 퀵 정렬을 수행한다.

퀵 정렬은 합병정렬과 비슷하게 보이지만 합병정렬과는 다르게 전체 데이터를 균등하게 분할하는 것이 아니라 기준(pivot)을 선택하여 기준보다 작은 데이터를 왼쪽에 위치시키고, 큰 데이터는 오른쪽에 위치시킨다. 일반적으로 기준은 첫번째 데이터로 선택한다. 결과적으로 기준의 왼쪽에는 기준보다 작은 데이터가, 오른쪽에는 큰 데이터가 위치하게 된다.

기준에 따라 데이터의 이동을 살펴보면 다음과 같다.

15 22  13  27  12  10  20  25

1. 기준 아이템(15) 보다 작으면 왼쪽, 크면 오른쪽에 위치시켜 분할한다.

10  13  12  15  22  27  20  25


2. 부분배열을 정렬한다.
10  12  13  15  20  22  25  27

위 내용은 한번의 부분배열을 통해 정렬되는 과정을 보여준 것이다. 실제 퀵 정렬은 재귀적으로 더이상 분할할 수 없을때까지 분할된 후 정렬을 수행한다.

다음을 통해 좀 더 쉽게 퀵 정렬을 살펴볼 수 있다.

[Flash] http://proneer.tistory.com/attachment/dk030000000000.swf



다음은 퀵 정렬에 대한 알고리즘이다.
void quicksort( index list[], index left, index right )
{
          if ( left < right ) {
                    index pivot = partition( list, left, right );
                    quicksort( list, left, pivot-1 );
                    quicksort( list, pivot+1, right);
          }
}

다음은 분할에 대한 알고리즘이다.
index partition( index list[], index left, index right)
{
          index pivot, temp, low, high;
          low = left;
          high = right+1;
          pivot = list[left];
          do {
                    do 
                              low++;
                    while ( list[low] < pivot );
                    do 
                              high--;
                    while ( list[high] > pivot );
                    if ( low < high ) SWAP( list[low], list[high], temp );
          } while ( low < high );
         
          SWAP( list[left], list[high], temp );
          return high;
}

그럼 이제 퀵 정렬의 복잡도를 살펴보자. 퀵 정렬은 최악의 경우 O(n2) 의 복잡도를 갖는다. 최악의 경우는 모든 데이터가 정렬된 경우이다. 이 경우 맨 앞의 데이터를 기준으로 선택했을 경우 데이터가 분할되지 못하므로 한번의 비교 연산이 n 번 이루어 진다고 하면 모든 데이터에 대해서는 O(n2)의 시간이 걸릴 것이다.

복잡도가 O(n2)인데 어떡해 이 알고리즘이 빠른 정렬이라고 불리게 되었을까? 그 이유는 평균의 경우 때문이다. 평균적인 경우 데이터에서 기준으로 선택될 확률은 모두 같다. 따라서, 평균은 모든 가능한 순서를 같은 횟수 정렬할 때의 평균 정렬시간이다. 말이 조금 어려울지 모르나 평균적인 경우에는 O(n log n)이 된다.

특히, O(n log n)의 복잡도를 가지는 다른 정렬알고리즘 보다도 더 빠르게 수행된다는 것이 증명되었다. 이러한 이유는 불필요한 데이터의 이동을 줄이고 먼 거리의 데이터를 교환할 뿐만아니라, 한번 결정된 기준은 추후 연산에서 제외되는 성질을 가지기 때문이다.

퀵 정렬은 추가적인 메모리공간을 가지지 않는 제자리 정렬임에도 불구하고 한가지 단점은 앞서 말한대로 이미 정렬된 데이터에 대해서는 오히려 많은 시간이 걸리게 된다. 이러한 문제를 해결하는 방법은 기준을 선태할 때 왼쪽에서 선택하는 것이 아니라 중간 값을 기준으로 선택하는 것이다.


다음은 하나의 함수에 분할과 정렬을 모두 구현한 예이다.
void quicksort(int a[], int lo, int hi)
{
          //  lo is the lower index, hi is the upper index
          //  of the region of array a that is to be sorted

         int i=lo, j=hi, h;
         int x=a[(lo+hi)/2];
         //  partition
         do {    
             while (a[i]<x) i++;
             while (a[j]>x) j--;
             if (i<=j) {
                 h=a[i]; a[i]=a[j]; a[j]=h;
                 i++; j--;
             }
         } while (i<=j);
         //  recursion
         if (lo<j) quicksort(a, lo, j);
         if (i<hi) quicksort(a, i, hi);
}



퀵 정렬 라이브러리 함수 사용
보통 C언어 라이브러리에는 퀵 정렬 함수가 제공된다. 일반적으로 qsort 라는 이름으로 제공되며 다음과 같은 함수 원형을 가진다.

함수의 원형
void qsort(
          void *base,
          size_t num;
          size_t width,
          int (*compare) (const void *, const void *)
};

base - 배열의 시작주소
num - 배열 요소의 개수
width - 배열 요소 하나의 크기(바이트단위)
compare
- 비교함수, 포인터를 통하여 두개의 요소를 비교하여 비교 결과를 정수로 반환, 사용자가 제공하여야 한다.

함수 사용 예
#include <stido.h>
#include <string.h>
#include <stdlib.h>

int compare( const void *arg1, const void *arg2 )
{
          if ( *(double) arg1  >  *(double *) arg2 ) return 1;
          else if ( *(double) arg1  ==  *(double *) arg2 ) return 0;
          else return -1;
}

int main()
{
          int i;
          double list[5] = { 2.1, 0.8, 2.2, 1.5, 3.3, 1.0 };
          qsort( (void *)list, (size_t)5, sizeof(double), compare );
         
          return 0;
}

Reference : Data Structures in C, 생능출판사
                 FOUNDATIONS of ALGORITHMS using C++ PSEUDOCODE, 사이텍미디어
                 http://ko.wikipedia.org/
                 http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/quick/quicken.htm
출처 : http://proneer.tistory.com/entry/Sort-퀵-정렬Quick-Sort


2015_11_23 추가 (Integer 타입으로 테스트 코드)
(Visual Studio 에서 자동들여쓰기 정렬 기능 - Alt+F8 굿)

#include <stdio.h>
#include <stdlib.h>

void quicksort( int *a, int low, int high )
{
int pivot;
/* Termination condition! */
if ( high > low )
{
pivot = partition( a, low, high );
quicksort( a, low, pivot-1 );
quicksort( a, pivot+1, high );
}
}

void swap(int *a,int left,int right)
{
int temp;
temp = a[left];
a[left] = a[right];
a[right] = temp;
}

// pivot 위치를 left 즉, index의 첫번째 위치의 녀석으로 잡고 돌아간다..
int partition( int *a, int low, int high )
{
int left, right, pivot;
int *pivot_item = (int *)malloc(sizeof(int));

*pivot_item = a[low];

pivot = left = low;

right = high;

while ( left < right ) {
/* Move left while item < pivot */
while( a[left] <= *pivot_item ) left++;
/* Move right while item > pivot */
while( a[right] > *pivot_item ) right--;
if ( left < right ) swap(a,left,right);
}
/* right is final position for the pivot */
a[low] = a[right];
a[right] = *pivot_item;
return right;
}

void main()
{
int val[8] = {67, 90, 57, 25, 84, 32, 73, 54};
int i = 0;

quicksort(val, 0, 7);

printf("val : ");
for(i = 0; i < 8 ; i++)
{
printf("%d\n", val[i]);
}

}


'컴퓨터공학' 카테고리의 다른 글

국제 프로그래밍 대회 Codeforce  (0) 2016.04.28
Software Process Model  (0) 2008.09.28
합병정렬 - 알고리즘  (0) 2008.09.21
삽입정렬 - 알고리즘  (0) 2008.09.21
임베디드 시스템과 임베디드  (0) 2008.09.15
Embedded에서 ARM의 의미  (0) 2008.09.15
운영체제의 종류  (0) 2008.09.15
프로그래밍언어론 - 용어  (0) 2008.09.03
cache 적중률  (1) 2008.08.31
cache memory - 2  (0) 2008.08.31
 

삽입정렬 - 알고리즘

Posted by ironmask84
2008. 9. 21. 22:02 컴퓨터공학


 
Insertion Sort


삽입정렬은 이름에서 알 수 있듯이 삽입을 통해 정렬을 완성하는 알고리즘이다. 삽입정렬은 모든 데이터를 앞에서부터 차례로 비교 하여 자신의 위치에 삽입을 통해 정렬을 수행한다. 배열이 길어질수록 효율이 떨어지지만 구현이 간단하다는 장점이 있다.

삽입정렬의 과정을 살펴보면 다음과 같다.

[Flash] http://proneer.tistory.com/attachment/dl146.swf



다음은 삽입정렬을 구현한 예이다.

#using C
void insertionSort(int list[], int n)
{
          int i, j, key;
          for(i=1; i<n; i++) {
                    key = list[i];  // 두 번째 값부터 선택
                    for(j=i-1; j>=0 && list[j]>key; j--)  // 선택된 값(key)보다 작은 값을 찾는다.
                              list[j+1] = list[j];       // 작은 값을 찾은 경우 그 값뒤의 모든 값을 우측으로 이동
                    list[j+1] = key;       // 해당되는 곳에 값을 삽입한다.
          }
}

삽입정렬 또한 비교연산을 상수로 보고 주어진 데이터가 정렬되어 있지 않다고 보면 O(n2)의 시간복잡도를 가진다. 삽입정렬의 특징은 시간복잡도가 입력 자료의 구성에 따라 달라진다는 사실이다. 입력 자료가 정렬되어 있으면 있을 수록 빨라진다. 따라서, 같은 시간복잡도를 가지는 선택정렬이나 버블정렬보다 효율이 높다.

삽입정렬은 또한 안정한 정렬방법이며 제자리 정렬(in-place sort)이다. 안정한 정렬이라는 것은 같은 값일 경우 상대적 위치가 바뀌지 않는 경우이다. 제자리 정렬은 정렬을 위해서 주어진 자료 공간 이외의 공간을 사용하지 않고 정렬하는 것을 말한다.


Reference : http://ko.wikipedia.org/
                 Data Structures in C, 생능출판사

출처 : http://proneer.tistory.com/entry/Sort-삽입-정렬Insertion-Sort

'컴퓨터공학' 카테고리의 다른 글

국제 프로그래밍 대회 Codeforce  (0) 2016.04.28
Software Process Model  (0) 2008.09.28
합병정렬 - 알고리즘  (0) 2008.09.21
퀵소트 - 알고리즘  (4) 2008.09.21
임베디드 시스템과 임베디드  (0) 2008.09.15
Embedded에서 ARM의 의미  (0) 2008.09.15
운영체제의 종류  (0) 2008.09.15
프로그래밍언어론 - 용어  (0) 2008.09.03
cache 적중률  (1) 2008.08.31
cache memory - 2  (0) 2008.08.31
 

08-09-21 말씀

Posted by ironmask84
2008. 9. 21. 12:13 생각과 일상/성경말씀


가을에 띄운 편지 - 김종성 목사님

사도 바울 -> 자신의 영적 아들인 디모데에게 편지를 보냄.

사도 바울 -> 디모데에게 에베소 교회를 맡김.

빌립보서 2:22 - 디모데가 바울을 아버지처럼 여김.
누가복음 8:21 - 하나님의 말씀을 행하는 사람이 자신의 가족이다.

 

임베디드 시스템과 임베디드

Posted by ironmask84
2008. 9. 15. 18:11 컴퓨터공학


임베디드 시스템과 임베디드 OS

임베디드 리눅스, 윈도우 CE, 팜 OS 등 모빌 디바이스 시장이 꾸준한 성장세를 유지하면서 디벨로퍼들의 관심을 끌고 있다. 모빌 컴퓨팅 장비와 솔루션들이 기업 생산성 향상을 위한 주요 도구로 자리잡아 가면서 21세기 주요 화두로 등장한 임베디드 프로그래밍의 주가 또한 동반 상승하고 있는 추세다. 특집 1부에서는 임베디드 시스템의 정의와 발전, 그리고 임베디드 시스템에서 사용되는 각종 OS에 대해 살펴본다.


 

현재 컴퓨터 프로그래밍에 관련된 일을 하고 있거나 배우고 있는 이들의 일반적인 관심사는 화려한 그래픽 유저 인터페이스 환경에서 기교를 발휘해 프로그래밍을 하는 것이 아닐까 한다. 많은 사람들이 마이크로소프트 윈도우 환경에서 MFC와 같은 라이브러리를 구현하는 것이 사실이다. 하지만 컴퓨터 프로그래밍에는 PC 환경에서 구현하는 프로그래밍 외에 임베디드 시스템에서 구현하는 프로그래밍도 있다. 임베디드 시스템은 PC 환경과 공통적인 부분도 있으나 다른 점이 상당수 존재하므로 임베디드 시스템에서의 프로그래밍도 PC 환경에서의 프로그래밍과 다른 점이 많다. 이 글에서는 임베디드 시스템의 정의와 발전, 그리고 임베디드 시스템에서 사용되는 각종 OS에 대해서 알아본다. 먼저 임베디드 시스템의 정의와 발전되어 온 과정을 살펴보기로 한다.


 

임베디드 시스템의 정의

전기, 전자, 컴퓨터 기술들이 발달하면서 이들 기술을 이용한 다양한 기기들이 우리의 생활 주변에 들어오게 되었다. PC를 제외하더라도 일상 생활에서 사용되고 있는 TV, 냉장고, 세탁기, 전자레인지 같은 전자 가전제품 뿐만 아니라 우리가 가지고 다니는 핸드폰, PDA, 그리고 사이버 아파트의 홈 관리 시스템, 홈 네트워크 게이트웨이 장치, 그 밖의 교통관리 시스템, 주차 관리 시스템, 홈 관리 시스템, 엘리베이터 시스템, 현금 지급기(ATM), 항공 관제 시스템, 우주선 제어장치, 군사용 제어 장치 등 셀 수도 없이 많은 기술들이 우리 생활과 밀접하게 관련되어 도움을 주고 있다.

위에서 열거한 것들의 개발 환경을 생각해 보면 임베디드 시스템의 개념을 잡는데 상당히 도움이 될 것이다. 임베디드 시스템(Embedded System)이란 미리 정해진 특정 기능을 수행하기 위해 컴퓨터의 하드웨어와 소프트웨어가 조합된 전자 제어 시스템을 말하며, 필요에 따라서는 일부 기계(mechanical parts)가 포함될 수 있다

즉 우리 생활에서 쓰이는 각종 전자기기, 가전제품, 제어장치는 단순히 회로로만 구성된 것이 아니라 마이크로프로세서가 내장되어 있고, 그 마이크로프로세서를 구동하여 특정한 기능을 수행하도록 프로그램이 내장되어 있는 시스템을 가리키는 것이다.

세탁기를 예로 들면 예전의 것은 세탁과 탈수의 기능만 갖는 단순한 기기였지만 요즘 나오는 세탁기는 옷감 종류부터 시작해서 세탁할 옷의 양, 물의 온도 등을 고려하여 세탁할 수 있도록 되어 있다. 이와 같이 이전의 시스템으로는 하기 힘든 것을 마이크로프로세서와 그에 따른 제어 프로그램이 내장된 임베디드 시스템이 수행하는 것이다(그림 1 참조).

임베디드 시스템의 발전과 적용

초기의 임베디드 시스템은 그 구성이 매우 단순하다. 8bit/16bit 컨트롤러에 제한된 동작을 하도록 하는 소프트웨어가 탑재된 시스템이 전부였다. 물론 이 시스템은 지금도 사용된다. 하지만 강력한 마이크로프로세서와 Digital Siginal Processing(DSP) 칩이 일반적으로 사용됨에 따라 사용영역이 넓어지고 그에 따른 소프트웨어도 발달하게 되었다. 또한 이러한 대형 시스템을 제어하기 위한 임베디드 OS가 등장하게 되었다.

임베디드 시스템이 적용된 여러 분야를 살펴보기로 한다.


 

공장 자동화

공장 자동화(FA : Factory Automation)는 사무 자동화, 가정 자동화와 더불어 3A로 불린다. 그 중에서 공장 자동화는 가장 급속도로 발전하여 자동화 산업의 선도적 역할과 제조 공정 분야의 중추적인 기능을 수행하고 있다.

공장 자동화는 미리 작성된 소프트웨어를 통해 사람의 개입 없이도 제품의 설계, 제조, 조립, 검사 등의 생산 공정을 거쳐 창고로부터 제품이 출하되는 일체의 생산 과정을 자동적으로 관리하는 시스템인데 중앙 제어 시스템에 의해 제어된다. 이와 같은 공장 자동화의 최종 목표는 무인화(unmanned factory)이기 때문에 생산라인에서 사용되는 기계 장치가 점차 자동화되어 감에 따라 인간의 노동력도 자동화된 기계 장치로 대체되고 있다.

공장 자동화의 이점은 생산량의 증대, 생산비의 절감, 품질의 향상, 생산 기간의 단축, 기능공 부족 해소, 위험한 작업의 대신 수행을 들 수 있다.

공장 자동화에서 임베디드 시스템의 발전 모습을 가장 찾아보기 쉬운데, 공장 자동화의 발전이 임베디드 시스템의 발전과 역사를 함께 한다고 보아도 무관하다. 지금 세워지고 있는 공장들은 노동력 중심의 공장 설비보다 최신 시스템의 자동화 설비 장치를 가지고 제품을 보다 효율적으로 생산해 내고 있다.

공장 자동화에 들어가는 자동화 장비와 설비들이 바로 임베디드 시스템의 한 부분이다. 이 장비와 설비들은 목적에 따라 하드웨어로 구성되어 있다. 확장성, 업그레이드, 기능 수정을 위해 소프트웨어를 조합하여 구축하기도 한다.

이러한 장비는 1960년대 초 1, 2차 세계대전 이후 제어분야 제품의 생산과 연구 개발이 활발하게 진행되면서 발전하였다. 특히 1957년 러시아의 첫 번째 인공위성 발사, 1962년 미국의 첫 번째 통신위성 발사의 성공은 이러한 Digital Control 분야를 발전시키는데 큰 역할을 했다. 이때 가장 인기 있었던 분야가 Direct Digtal Control(DDC)였다. 기존의 아날로그 컨트롤러가 수행하던 것들을 컴퓨터가 하게 된 것이다. 그러나 이러한 발전과 애플리케이션의 증가에도 불구하고 기존의 아날로그 컨트롤러에 비해 월등히 가격이 비쌌기 때문에 컨트롤이 실패했을 경우 백업이 불가능했다.

1970년대 초반(하드웨어 시대)은 컴퓨터 컨트롤 하드웨어, 소프트웨어를 포함한 계측기기의 발전 시대였다. 또한 네트워크 상에 연결된 몇 대의 컴퓨터에 대한 분산 공정 제어가 공장 생산설비의 목적으로 개발되었다. 1974년에 프로그램을 저장하고 재호출할 수 있는 메모리를 탑재한 PLC를 Matsushita Electrical Indust rial에서 제작하였고, 곧이어 마이크로프로세서가 개발되면서 현재의 임베디드 시스템과 같은 모습을 갖추게 되었다.

현재는 각급 공장의 생산라인 시스템을 제어, 감시 및 자동화 할 수 있고, 생산 과정에서 얻어지는 각종 생산 자료 및 정보들을 컴퓨터가 데이터베이스에 저장한다. 특히 단독 구성, 상위 호스트와의 네트워크 구축을 통해 생산과 결과 통보를 용이하게 한다.


 

가정 자동화

가정 자동화(HA : Home Automation)란 주택을 단순한 주거 개념으로 보지 않고 컴퓨터와 통신 및 반도체 기술을 응용하여 일상 생활을 자동화시킨 가정을 의미한다. 컴퓨터 통신망을 이용하여 생활정보, 문화정보, 홈뱅킹, 홈쇼핑, 학습 정보, 진료 등 많은 정보를 얻음으로써 사용자들이 시간과 공간의 제약에서 자유로와 지는데 목적이 있다.

가정 자동화에 대한 기술개발은 이미 70년대부터 시작되었다. 리모트 컨트롤 하나로 집안이나 외부에서 조명, 수도, 가스, 난방, 가전 제품 등을 제어하는 것이 목표였다. 이런 시도에는 주로 유선개념이 적용됐기 때문에 여러 기기를 제어하는 데 전기선 외에 별도의 선과 장치가 필요한 것이 단점이다.

최근에는 무선제어 기술이 발달하면서 가정 자동화 시스템에 대한 연구가 활발하다. 앞으로 가정의 가전 제품 환경이 무선 쪽으로 변할 것이 분명하기 때문에 정보통신 업체들뿐만 아니라 가전 제품 업체들도 많은 연구를 하고 있다. 국내에는 삼성전자와 LG전자 등이 이미 개발에 착수한 것으로 알려져 있다. 무선제어 기술의 가장 큰 걸림돌은 가전 제품에 장착될 무선 모듈의 단가와 표준화 문제이다. 이노버텍은 표준 공용 무선 프로토콜인 스왑(SWAP : Shared Wireless Access Pro tocol)에 맞춰 제품을 개발됐다. 2∼3년 후면 무선을 이용한 가정 자동화 시스템이 활발하게 보급될 것이라는 게 업계의 예상이다.


 

PDA

PDA는 Personal Digital Assistant의 약자로, 번역하면 휴대형 정보 단말기이다. 노트북보다 훨씬 작은 소형 컴퓨터이며 전자수첩보다 강력한 컴퓨팅 파워를 갖고 있다. 전체 크기가 작기 때문에 디스플레이 장치(LCD)의 크기가 제한되며, 펜으로 문자를 써서 인식하게 하는 펜 입력을 기본으로 하고 있다.

일정관리, 주소록, 메모장 같은 개인정보 관리 프로그램을 기본으로 제공하며, PC와 연결하여 자유롭게 데이터를 주고받을 수 있다. 또한 기본으로 제공되는 프로그램 외에 새로운 프로그램을 설치하여 사용할 수 있다. 최근에는 무선통신의 발달로 PDA를 통한 인터넷 접속이 가능하게 되어, PDA는 무선인터넷 분야를 새롭게 개척해 가고 있다.

스케줄과 거래처 관리가 필수적인 비즈니스맨이나 일정관리가 필요한 대학생들은 주로 다이어리, 전자수첩 등 비효율적인 방법으로 개인정보를 기록되고 이용해 왔다. PDA는 기본적으로 제공되는 프로그램과 추가 애플리케이션을 통해 개인정보 관리의 비효율성을 개선해 준다. 또한 PDA의 개인정보 관리 프로그램들과 대응되는 PC용 개인정보 관리 프로그램을 제공해 PDA와 PC를 연결하여 입력된 정보들의 수정, 추가, 백업을 지원함으로써 새로운 차원의 개인정보 관리 방안을 제시한다. PDA를 이용하면 장소에 구애받지 않고 이동 중에도 휴대폰과 연결하여 인터넷에 접속할 수 있다. 웹 페이지 검색, 이메일 송수신, PC 통신, 주식매매 등 PC에서 할 수 있는 인터넷의 주요 기능들을 PDA에서 이용할 수 있다.


 

각종 전자 제품

최근 출시되는 전자 제품 중에는 마이크로프로세서를 넣지 않았거나 프로그램을 탑재하지 않은 제품은 거의 없다. 물론 간단한 장치들은 그런 프로그램이 없어도 직접 회로를 설계하여 해결할 수 있지만, 조금만 덩치가 크거나 지능적인 제품들은 거의 임베디드 시스템을 도입하고 있다. 주위의 밝기에 따라 조도가 바뀌는 스탠드, 주변의 밝기에 따라 자동으로 화질이 명도가 바뀌는 기능을 탑재하거나 적당한 시간에 자동으로 켜지고 꺼지는 텔레비젼도 있다.

텔레비젼에 장착해 인터넷 서비스를 구현하는 셋톱 박스들도 선보이고 있다. 여기에는 반드시 임베디드 시스템이 필요하다. 뿐만 아니라 전자레인지, 전기 밥솥, 진공 청소기, 에어컨, 냉장고 등의 전자 제품들은 임베디드 시스템의 도움 없이는 불가능하다. 이제는 가전제품들도 인터넷과 결합한 인터넷 TV, 인터넷 냉장고, 인터넷 전기밥솥들이 등장하고 있다. 이런 기술들은 단순한 회로 구성이 아닌 진보된 하드웨어 기술과 소프트웨어 기술이 어우러진 고급 임베디드 시스템의 결정체이다.


 

임베디드 시스템에서의 OS

임베디드 시스템이라는 것은 일반적인 시스템과는 달리 특정한 작업만을 하도록 설계되며 초기의 임베디드 시스템은 비교적 단순해서 운영체제가 필요 없이 사람이 순차적인 프로그램을 작성해서 실행되도록 하였고, 중간에 인터럽트가 발생되는 경우에만 그 순차적인 프로그램에서 잠시 벗어나는 정도였다. 이전의 임베디드 시스템들은 주로 간단하고 단순한 순차적인 작업에 관련되었기 때문에 굳이 OS를 사용한다는 것은 낭비가 되었었고 그럴 필요조차 없었다. 하지만 최근의 임베디드 시스템 분야에서는 그 시스템 자체가 커지게 되고, 네트워크나 멀티미디어가 시스템에 기본으로 자리잡으면서 임베디드 시스템이 해야 할 일들도 많아지고 복잡해 졌기 때문에 순차적인 프로그램 작성이 매우 어렵게 되었다.

따라서 임베디드 시스템에서도 운영체제의 개념이 필요하게 되었고 임베디드 시스템의 특정상 실시간이라는 요소를 만족해야 했으므로 실시간 운영체제가 임베디드 시스템에 도입되었던 것이다. 지금도 실시간 OS를 채택하여 개발된 제품들이 점점 늘어나고 있다. 이제는 많은 임베디드 시스템에서 그 목적에 맞게 실시간 운영체제와 함께 적절하게 사용되어 지고 있는 실정이다.

참고적으로 실시간 시스템(Real-Time System)과 실시간 운영체제(Real-Time OS)에 대해서 간략하게 언급하겠다.


 

실시간 시스템

실시간 시스템을 다룬 책이나 논문, 기타 관련자료를 살펴보면 그 정의는 대부분이 일치한다. 그 주된 내용은 실시간 시스템은 정해진 시간 내에 시스템이 결과를 출력하는 시스템을 말하고 있다. 이 말은 주어진 작업을 빨리 처리하는 것이 아니고 정해진 시간을 넘겨서는 안된다는 것이다.

임베디드 시스템이 실시간적인 요소가 있기 때문에 임베디드 시스템 자체를 실시간 시스템이라고 생각해도 큰 무리는 없을 듯하다. 그러나, 좀더 정확히 이야기하자면 실시간 시스템이 임베디드 시스템에 포함된다고 보는 편이 낳을 것이다. 실시간 시스템도 Hard Real-Time System과 Soft Real-Time System으로 두 가지로 나뉜다.

전자의 경우는 정해진 시간 내에 작업의 결과가 절대적으로 출력되어야 하는 시스템이다. 간단한 예를 들면 전투기의 비행 제어 시스템이라든지 핵발전소의 제어 시스템, 인공위성의 제어 시스템 등등 작업의 결과가 정해진 시간 내에 나오지 않게 되면 막대한 손실을 발생할 수 있는 치명적인 결과가 나오게 되는 경우이다.

후자의 경우는 정해진 시간 내에 작업의 결과가 출력되지 않더라도 Hard Real-Time System처럼 치명적인 결과는 나오는 그런 시스템이 아닌 경우이다. 다시 이야기하면 Soft Real-Time System은 정해진 범위를 넘는 시간 지연이 발생하더라도 그것이 시스템 에러가 되지 않는다.


 

RTOS

RTOS는 임베디드 시스템이 가지는 특성 중 실시간적인 요소를 충족하기 위해서 나온 운영체제라고 할 수 있다. 즉 RTOS는 임베디드 시스템의 근간이 되는 운영체계인 셈이다.

실시간 운영체계라고 하면 일반적으로 말하는 운영체계(windows 계열, UNIX, LINUX)와는 무언가 막연하게 조금은 다를 것이라고 생각이 될지도 모르겠다. 하지만 임베디드 운영체제라고 해서 특별하게 다른 것은 없다. 일반 OS들이 수행하는 태스크 스케줄링, 태스크간의 통신, 메모리 관리, I/O, 인터럽터 등 이러한 요소들을 RTOS도 같이 지원한다. 일반 OS와 차이점을 두자면 시간제약에 차이, 신뢰성, 범용성과 특수성 정도이다. 예를 들어 윈도우 환경 하에서 어떤 프로그램을 실행하였는데 어느 때는 빨리 실행되고, 어느 때는 늦게 실행된다고 해서 큰 문제될 것은 없다. 혹, 수행하는 프로그램이 잘못 수행되어 시스템이 다운되는 경우가 발생할 수도 있다. 그러나, RTOS 환경 하에서 실행되는 작업들은 정해진 시간이 큰 문제가 될 수 있다. 더군다나 그 시스템이 응답이 없거나 흔히 이야기하는 다운된다든가 하면 그 피해는 막심할 것이다.

따라서, 임베디드 시스템이 가지는 정해진 시간 내에 수행하는 능력, 신뢰성은 일반 OS보다 가혹하게 지켜져야 하는 규약과도 같은 것이다.

또한, 일반 OS(예를 들어 UNIX, Windows)들은 PC환경에서 여러 가지 작업들을 수행할 수 있으나, RTOS는 작업환경이 Embedded System으로 제한을 받고 있으며, 그 시스템 또한 보통 한가지 목적으로 개발되어 있다. 그러기에 RTOS 역시 그 한가지 목적을 위해 최적화되어 있다고 보면 된다.

부연적으로 이야기를 하면 임베디드 OS와 RTOS와는 어느 정도 구별이 필요하다. 임베디드 시스템이 실시간적인 요소를 가지는 것은 사실이지만 모든 임베디드 OS가 RTOS인 것은 아니다. 가장 적당한 예로 PDA에 들어가는 OS가 적절할 것이다. 다시 이야기하면 임베디드 OS 내에 RTOS가 포함된다고 보는 편이 좋을 것이다.


 

임베디드 OS

현재 나온 임베디드 OS는 그 종류가 무수하게 많다. 그 중 대부분은 RTOS이며 RTOS가 임베디드 OS라고 말해도 손색이 없을 것이다. 하지만 여기에는 Windows CE, 임베디드 Linux, 그리고 임베디드 시스템에서 Java를 쓸 수 있도록 하는 임베디드 Java와 퍼스널 Java 등이 포함된다.

우선 기존의 상용 RTOS를 살펴보고, End-User의 강자 Windows CE, 엄청난 열기의 임베디드 Linux, 임베디드 Java와 퍼스널 자바의 가능성에 대해서 언급해 보겠다.


 

상용 RTOS

RTOS는 그 종류만 해도 수를 헤아리기 힘들다. 그 이유는 데스크탑 시장처럼 특정 OS가 임베디드 OS 시장을 점유하는 것이 아니기 때문이다.

이들 RTOS는 선점형 멀티태스킹을 지원하며 PO SIX를 지원한다. 각 태스크들은 우선순위를 가지고 있어 높은 우선순위를 가지는 태스크들이 먼저 실행되는 구조이다. 그리고, 이들 RTOS는 보통 커널 모드와 사용자 모드가 있어 시스템 콜에 의해서 이 모드에 대한 독립성을 보장한다. 또한 통합개발환경과 디버깅 툴을 개발하여 개발자들이 쉽게 개발할 수 있도록 지원하고 있다. 단점이라면 이들 RTOS들이 대부분이 상용 OS들이라 라이센스 비용이 만만치 않은 것이다.

현재의 RTOS들을 열거하면 지금은 WindRiver와 통합된 ISI의 pSOSystem, WindRiver의 VxWorks, 마이크로텍의 VRTX, 마이크로웨어의 OS-9 등의 상용 RTOS와 교육용으로 나온 uCOS Real-Time Kernel이 있다.


 

① pSOSystem

ISI에서 1980년대에 개발한 pSOSystem은 우리나라의 여러 업체가 채택해서 사용하고 있는 RTOS로 삼성전자가 pSOS+ 개발에 참여해 라이센스를 갖고 있어 비교적 우리나라에 잘 알려져 있다. 컴파일러 전문업체(Diab Data)와 디버깅 전문업체(SDS)를 따로 두고 있기 때문에 이들 분야에 있어 다른 RTOS들 보다 높은 기술력을 가지고 있다. 현재 삼성전자가 개발한 휴대폰의 핵심칩인 Scom3000에 포팅되었으며, 각종 통신장비와 네트워크 장비 등에서 사용되고 있다(그림 2 참조).

이 RTOS는 커널을 중심으로 해서 여러 개의 soft ware components들로 구성되어 있다. 이들 soft ware components들은 각각의 독립적인 모듈로 되어 있으며 통합개발환경 툴로 pRISM+를 제공하고 있다.

pSOSystem은 선점형 멀티태스킹 RTOS로 각 태스크들은 우선순위를 가지고 있어 우선순위가 높은 태스크들의 작업수행이 먼저 이루어진다. 따라서, 선점형 스케줄링 방식을 따른다고 볼 수 있다. 만일 각 태스크들이 같은 우선순위를 가진다면 스케줄링 방식은 Time slicing에 의한 라운드로빈 방식으로 바뀌게 된다. 태스크의 수는 총 256개이며 태스크 레벨이 255가 가장 높고, 0이 가장 낮다. 특이할 사항은 레벨 240에서 255는 Kernel에 의해 사용되도록 지정되어 있다는 것이다.

그리고 태스크 관리, 세마포어, 메시지 큐, 타임관리 및 타이머, 이벤트 및 비동기 Signal, 에러처리, 동적인 메모리 저장관리, 다른 태스크들로부터의 코드나 데이터 보호 등의 서비스를 지원한다. 여러 개의 다른 실행모드를 가지고 있는 CPU를 위해서 사용자 모드와 슈퍼바이저 모드를 제공하고 있다. 각 components들을 간단하게 설명하면 다음과 같다.


 

·pSOS+: 실시간 멀티태스킹 커널로서 단일 프로세서용 커널이다.

·pSOS+m: 다중프로세서용 멀티태스킹 커널.

·pNA+: TCP/IP 프로토콜 스택

·pRPC+: Remote Procedure Call 라이브러리

·pHILE+: 파일 시스템 관리자 (MS-DOS, NFS, ISO9660 지원)

·pPERC+: ANSI C/C++ 표준 라이브러리

·pROBE+: 타겟용 저수준 디버거

·pMONT+: 타겟용 고수준 디버거/분석기

·pNET+: 디버깅을 위한 ethernet 연결

·pSOS+ Query Library: pSOS+ 객체에 대한 상세 정보 제공

·pERC: 실시간 자바

·pLM+: 라이브러리 관리자

·OpTIC: 그래픽 라이브러리

·pRISM+: 통합개발환경


 

pSOSystem의 전체 구조는 그림 3을 참조하기 바란다.

pSOSystem은 실시간 멀티태스킹 커널을 중심으로 여러 개의 software components와 라이브러리를 두고 있다. 이런 components와 라이브러리는 선택적으로 사용될 수 있다. 하부구조에는 디바이스 드라이버와 칩과 각종 디바이스의 정보를 담고 있는 BSP(Board Support Package)를 담고 있다. 만일 하드웨어가 변경될 경우 이 BSP만 수정하여 시스템 프로그램에 많은 변경없이 쉽게 만들어 낼 수 있으므로 BSP를 따로 구별한다. 따라서, 전체적으로 정리해 보면 BSP와 디바이스 드라이버의 바탕 위에 커널과 기타 필요한 compo nent들을 링크하고, 다시 그 위에 사용할 각종 태스크와 application 프로그램을 제작하여 사용하는 것이다.


 

② pSOSystem의 통합 개발환경 pRISM+

pRISM+는 pSOSystem 개발자가 좀더 용이한 개발을 위해 소스코드 분석을 위한 툴과 컴파일러, 링커, 디버깅할 수 있는 툴을 제공하는 통합 개발환경이다. 그 구성을 살펴보면 pSOSytem, pRISM+ Manager, pRISM+ Wizard, Object Browser, ESp, SNiFF+ 등을 들수 있다(Version 1.2.1을 기준, 그림 4 참조). pSOSystem에서는 컴파일러나 통합개발환경을 CPU별로 제공한다. 따라서 대상이 되는 CPU에 대해서는 최상의 지원을 할 수 있다는 장점이 있다.


 

③ VxWorks

화성 착륙선 패스파인더의 운영체제로 쓰인 Wind River의 RTOS인 VxWorks는 pSOSystem과 유사한 점이 많다. pSOSystem이 통합 개발환경으로 pRI SM+를 제공한다면 VxWorks는 토네이도를 제공한다. VxWorks의 커널인 마이크로 커널은 선점형 멀티태스킹이며 총 태스크의 단계는 256이고 스케줄링 방식도 높은 우선순위를 가지는 태스크가 먼저 실행하는 방식을 지원한다. 만일 같은 우선순위를 가진다면 라운드 로빈방식의 스케줄링을 이용하는 것도 pSOSystem과 유사하다. 또하나 pSOSystem이 여러 개의 Compo nents로 되어 있다고 하면 VxWorks는 200개 가량이 모듈을 지원하는 형식으로 되어 있어 개발자는 이들 필요한 모듈만 사용해서 시스템에 맞는 운영체계를 구성할 수 있다.

VxWorks는 현대의 RTOS들이 지원하는 거의 모든 서비스를 지원하고 있다. 태스크 간의 통신을 위해 세마포어와 메시지 큐, 공유메모리, 소켓, signal 등을 제공하고, 표준 TCP/IP 네트워킹과 ROM이나 로컬 디스크, 네트워크로 부팅이 가능하게 되어있다. 파일시스템은 MS-DOS와 RT-11 파일 시스템을 지원하는 등 여러 가지 서비스를 제공하고 있다. VxWorks의 구조는 크게 하드웨어에 의존하는 BSP와 디바이스 드라이브 영역과 하드웨어에 의존하지 않는 커널과 그에 따른 모듈, 그리고 애플리케이션 프로그램으로 나누어진다. 이것은 pSOSystem과 매우 유사한 부분이다.


 

④ VxWorks의 통합 개발환경 토네이도

토네이도는 교차개발환경을 지원하는 통합 개발환경이다. 이 툴의 구성은 크게 3가지로 나누어지는데 Vx Works, Application 개발 툴(컴파일러와 프로그램들), VxWorks의 Application을 관리하고, 디버깅하고, 모니터링할 수 있는 통합 개발환경들로 이루어져 있다. 여기에는 소스코드 에디터, C와 C++ 컴파일러, 타겟 시스템의 상태를 visual한 환경에서 모니터링할 수 있는 브라우져, C언어 해석기인 WindSh 등의 기능이 들어 있다. 토네이도는 pRISM+와 달리 CPU마다 각각 다른 툴과 컴파일러를 제공하는 것이 아니라, 하나의 컴파일러에 모든 CPU를 지원한다(그림 5 참조).


 

⑤ WindRiver의 새로운 RTOS: Cumulus

ISI가 WindRiver에 합병된 사실은 RTOS에 관심을 가진 이들은 다들 알고 있을 것이다. 또한 Wind River에서 새로운 RTOS가 나올 거라는 것은 쉽게 짐작할 수 있을 것이다. WindRiver는 2000년 2월 29일 시카고에서 열린 “the Embedded System Confe rence East”에서 새로운 RTOS를 개발한다고 발표했다. 코드네임은 Cumulus이며 이 RTOS는 pSO System과 VxWorks의 장점을 뽑아 만든다고 했으며, 아직까지는 작업중이라고 했다. 그리고 pSOSystem 사용자를 위해 올해 3/4분기 쯤에 “Stratus”를 발표한다고 했다.

자세한 내용은 pSOSystem 홈페이지를 참조하기 바란다(http://www.isi.com). 만일 Cumulus가 나온다면 통합 개발환경에 있어 pRISM+를 따라 CPU 별로 따른 컴파일러와 개발툴을 지원할 것인지, 아니면 토네이도처럼 하나의 컴파일러에 모든 CPU를 지원할 것인지 지켜봐야 할 것이다.


 

⑥ VRTX

VRTX는 Mentor Graphics Corporation에서 개발한 RTOS로 상당히 신뢰성이 높은 OS로 정평이 나 있다. FAA의 RTCA/DO-178B LEVEL A의 인증을 받고 있으며 기타 정부의 다른 기관으로부터도 인증을 받아 그 신뢰성을 인정받고 있다. 현재 통신장비, 네트워크 장비, 셀룰러, 경주용 자동차의 엔진 제어 시스템 등 다방면의 분야에서 사용되고 있다. 현재 우리나라에는 다산 인터네트에 공급되고 있으며, 삼성전자의 통신장비, 발전소의 모니터링 시스템, 전동차의 제어시스템 및 모니터링 시스템에서 사용되고 있다(그림 6 참조). VRTX는 기존의 RTOS와 크게 다른 점은 없다. 선점형 멀티태스킹 커널을 가지고 있으며, OS는 모듈 형태로 되어 있어 사용자들은 선택적으로 사용하여 운영체계를 구성할 수 있다. 이런 모듈들에는 멀티태스킹 커널 이외에 메모리가 매우 협소한 임베디드 시스템을 위해 커널의 양을 최적화한 커널도 있고, TCP/IP 프로토콜 스택 이외에 OSI 프로토콜 스택도 지원하고 있다. 파일 시스템은 MS-DOS 6.1을 포함하고 있으며, ANSI-C 라이브러리도 제공된다.

VRTX는 스케줄링에 특이할 만한 사항을 가지고 있는데 시스템 콜의 중간쯤에 인터럽터가 발생하여 생기는 시간적 지연을 막기 위해 선점가능한 시스템 콜을 가지고 있다. 따라서 VRTX는 태스크가 수행할 준비가 되자마자 스케줄링이 가능하다.


 

⑦ VRTX의 통합개발환경 스펙트라

VRTX의 통합개발환경 스펙트라는 총 4개의 모듈로 구성되어 있다. 기본적으로 통합개발환경이 가지는 RTOS와 디버깅 툴, 컴파일러를 제공하고, host와 타겟 시스템과의 연결방식도 이더넷, 시리얼, ICE, JTAG, BDM 등 여러 가지 방식을 제공한다(그림 7 참조). 스펙트라에서 주된 디버깅 툴은 XRAY 디버거인데 이 디버거는 시뮬레이션 기능, 모니터링 기능 등이 있다. 특히 툴이 GUI로 구현되어 빠른 편집, 컴파일, 다운로딩, 디버깅이 가능하다. 소스 수준의 디버깅과 타겟 시스템이 없어도 시뮬레이션이 가능하다. 공통적으로 필요한 소스코드는 따로 제공하고 있어 개발의 시간을 단축가능하다는 것도 장점이다. 이외에 상용 RTOS는 그 수를 헤아리기 힘들 정도로 많이 있으나, 몇가지 공통점을 이야기하면 아래와 같다(표 1 참조).


 

·선점형 멀티태스킹

·모듈화

·스케줄링 방식이 우선순위에 의한 방식 내지 라운드 로빈 방식

·통합개발환경 지원


 

그외의 임베디드 OS

그외의 임베디드 OS는 RTOS와는 달리 임베디드 시스템이 가지는 실시간적인 요소를 그다지 충족하지 못하는 OS들이다. 하지만 이들 OS들은 나름대로의 장점을 가지고, 실시간적인 요소가 그다지 필요없는 임베디드 시스템에 탑재되어 있다. 대표적인 OS가 Win dows CE, 임베디드 리눅스, 임베디드 Java/퍼스널Java 등이다.

① Windows CE

PC 계열의 시장을 제패한 윈도우는 다시 모빌 시장으로 뛰어들었다. 즉 기존의 윈도우 인터페이스에 모빌네트워크 기능을 강화하여, 가전제품, PDA, 자동차 셋톱 박스 등에 탑재될 임베디드 OS를 만드는 일이었다. 버전 1.0에서 2.0 , 2.01, 2.11, 2.12(현재 3.0 Beta)에 이르기까지 커널은 여러 차례 버전업 되었지만, 여전히 윈도우의 모양을 하고 있다. 하지만 이런 요구를 맞추다보니 하드웨어의 사양이 매우 높아서, 가격 경쟁력에서 다른 모빌 제품에 밀리고 있는 실정이다. 네트워크 기능을 보면 적외선 통신, 데스크탑과의 오토싱크, 그리고, PCS나 셀룰러 폰을 이용한 웹 브라우징 능력을 갖고 있다. 특히, 차세대 가전 제품에 Windows CE를 이용하여 하나의 윈도우 호환 환경에서 홈 오토메이션, 카 내비게이션 등을 고려함으로써 한때 하드웨어 업체들의 강력한 지원을 받기도 하였다. 따라서, 개발 환경은 다른 상용 OS에 비해서 훨씬 편리한 것을 알 수 있다. 문제는 완전한 리얼타임 OS가 아니라는 점이고, 이러한 단점으로 인해서, 산업용, 정밀용으로는 신중히 생각해야 한다는 것이다. 물론 윈도우 98이나 NT에 비해서 상당히 안정적인 편이다.

Windows CE는 32bit Windows OS와 호환성이 있는 임베디드 OS이다. 여러 RTOS와 마찬가지로 모듈화 되어 있다. 차이가 있다면 그 모듈이 좀더 세분화가 가능하다. 그 세분화한 것을 컴포넌트라고 한다. 좀더 자세히 말하면 모듈은 완전한 기능을 갖춘 것이고 컴포넌트들은 그렇지 못한 것이다. 이렇게 모듈화 되어 있기 때문에 필요한 부분만 선택하여 사용할 수 있게 되어 있다. 또한, 커널은 선점형 멀티 스레딩을 지원한다. Windows CE는 기본적으로 32개의 프로세서를 가질 수 있고, 하나의 프로세서는 8개의 스레드를 가질 수 있다. 이 스레드는 스케줄링의 기본이 된다.

32bit Windows와 호환성이 있기 때문에 win32 API를 이용하여 쉽게 프로그램을 포팅할 수 있다. 개발 툴은 Platformbuilder 2.11, Windows CE for VC++ 6.0, Windows CE for VB 6.0이며, 섬세한 제어분야가 아니고, 엔드 유저를 지향하는 비쥬얼한 제품에 상당히 유리하다. 또한 TCP/IP, PPP와 IrDA 같은 프로토콜을 가지고 있어 다른 윈도우 시스템에 쉽게 연결할 수 있고, Win32 Serial APIs, TAPI, Winlnet 등을 지원한다. 실제 Windows CE가 가장 많이 쓰이는 시장은 PDA 시장이다. 그러나 현실적으로 대부분의 PDA 시장은 Palm OS가 장악하고 있고, Windows CE가 차지하는 부분은 미미하다. 이런 현실에 마이크로소프트는 새로운 기능을 첨가한 Windows CE를 개발하려는 모습을 보이고 있다. 이를 포켓 PC라고 명하고 있으며, 그 내용을 살펴보면 Color Display를 지원하고, Outlook, Excel, Windows Media Player, Internet Explorer, eBook reader, Word and Money와 같은 애플리케이션 프로그램을 탑재하며 휴대폰과 연계해 wireless 기능까지 구현하겠다는 계획이다.


 

② 임베디드 리눅스

Linux는 초기 PC나 서버급 시스템에 포팅이 되어 사용되다 최근 임베디드 시스템으로 그 관심사가 옮겨진 듯하다. 이미 해외에서는 임베디드 시스템에 리눅스가 포팅이 되어 실제 제품으로 나오고 있는 예도 비일비재하다. DEC에서 만든 DECstation이란 worksta tions은 MIPS 기반의 R2000/3000/4000에 리눅스를 포팅되었고, 모토롤라에서는 콜드파이어에 uclinux를 포팅하여 네트워크 장비를 개발하였다.

http://www.arm.uk.linux.org/에 가보면 ARM core를 CPU로 쓰는 시스템에 linux를 포팅하여 만든 제품들이 있다. 주로 StrongARM 시스템에 포팅한 사례가 많다. Empeg라는 mp3 플레이어도 있으며, Itsy라는 Compag에서 만든 PDA역시 StrongARM에 리눅스를 포팅하여 만든 제품이다. 그중에 눈에 띄는 제품이 있는데 그것은 지메이트에서 만든 PDA인 YOPY이다.

YOPY역시 StrongARM 시스템에 리눅스를 포팅하였으며, MP3 및 MPEG player, 웹 브라우저, 이메일 기능 등이 있다. GUI의 기능을 부가하기 위해 덩치가 큰 Xwindow 대신 W-window을 사용하였다.

임베디드 OS분야에서 임베디드 리눅스의 비중은 점점 커져가고 있다. 기존의 임베디드 OS와 비교를 해보았으때 상용 OS보다는 임베디드 시스템이 가지는 실시간적인 요소를 충족시키지 못하는 것은 사실이다. 또한 Windows CE보다는 개발환경이 좋은 편도 아니다. 그리고 본래 PC 기반으로 만들어 졌기 때문에 메모리가 열악한 임베디드용으로 쓰기에는 커널이 너무 크다. 이런 불리한 점을 가진 임베디드 리눅스가 그 비중이 커지고 사람들이 많이 다루는 이루는 오픈 소스에 라이센스 비용이 없다는 것이 임베디드 리눅스가 가지는 큰 장점이라 하겠다. 그렇지만 분명 Rea-Time 기능이 떨어지기 때문에 Hard-Real Time System에서는 쓰기 힘들고, 커널의 크기를 줄여서 PDA 같은 임베디드 시스템에만 가능할지 모른다. 이러한 임베디드 리눅스에 실시간 제어의 요소를 가미한 것이 RT-Linux이다.


 

③ RT-Linux

기존의 리눅스는 Time-slice에 의한 스케줄링 방식을 가지고 있다. 따라서, 지금 수행하고 있는 프로세서보다 다음에 수행될 프로세서가 우선순위가 높더라도 바로 지금 수행되는 프로세서가 중단되는 것이 아니고 time-out이 되어야만 현재의 프로세서가 CPU를 놓아준다. 또한, 현재 수행되는 프로세서가 다른 프로세서보다 우선순위가 높다고 해서 계속 수행되는 것이 아니라, 역시 time-out이 일어나면 다른 프로세서에게 CPU를 양보해야만 한다. 이런 이유로 인해서 기존의 리눅스가 Real-Time 기능이 떨어지는 것이다.

RT-Linux는 New Mexico Tech의 Victor Yodaiken에 의해서 시작된 것으로 기존이 리눅스에 Real-Time 기능을 부과하였다.

리눅스는 커널자체가 Real-Time 기능이 떨어지기 때문에 이를 대신할 리얼타임 커널을 만들었다. 여기서 기존의 커널을 그대로 두고 새로이 리얼타임 커널을 추가했다고 보는 편이 좋을 것이다. 이렇게 함으로써 최소한의 소스변경으로 리얼타임 기능을 추가할 수 있는 것이다. 기존의 커널은 새로운 리얼타임 커널 아래에서 하나의 태스크로 둔다. 여기서 기존의 커널은 우선순위가 가장 낮은 태스크로 두고, 다른 리얼타임 태스크들이 없으면 비로소 실행된다.

리얼타임 커널은 리얼타임 태스크를 생성, 스케줄링해서 실행하고, 기존의 리눅스 커널은 자신의 태스크를 관리하고 자신의 인터럽터를 처리한다. 리얼타임 커널의 스케줄링은 선점형 스케줄러로써 태스크의 우선순위를 두고 스케줄링을 실시한다. 따라서, 커널이 선점형 커널이 되어야 하므로, 기존의 리눅스 커널이 제공하는 시스템콜을 리얼타임 태스크나 인터럽터가 이용하지 못하게 함으로써 이를 해결하고 있다.

RT-Linux는 기존이 리눅스에 비해 리얼타임 기능이 향상된 것은 사실이지만 기존의 리눅스 커널에다 새로이 리얼타임 커널을 추가한 것으로 열악한 임베디드용으로 OS의 덩치가 큰 것이 단점이다.


 

④ 임베디드 시스템에서의 Java

1990년에 Sun Microsystem에서 Green 프로젝트로 개발된 Oak는 전자제품에서 사용할 소프트웨어로 개발되었다. 이 소프트웨어는 다른 시스템에 대해서 이식성이 매우 높았으나 전자제품과 같은 임베디드 시스템에서는 쓰이지 못하고, 인터넷 프로그래밍에 쓰일 수 있다는 가능성을 발견해 Oak를 인터넷 프로그래밍이 가능하게 개발하여 만든 것이 Java이다. 이제껏 인터넷 프로그램으로만 쓰이다가 Java가 임베디드 시스템에서 사용될 수 있도록 한 것 중 대표적인 것이 SUN의 임베디드 Java와 퍼스널 Java인 것이다.

Java의 가장 큰 장점은 어떠한 시스템에도 Java API와 JVM(Java Visual Machine)만 있으면 자바코드가 이식이 가능하다는 것이다. Java API와 JVM이 내장하고 있는 임베디드 Java와 퍼스널 Java는 기존의 상용 RTOS와 연계되어 사용가능하다는 것이다. 간단히 이야기해서 RTOS가 포팅된 타겟 시스템에 임베디드 Java나 퍼스널 Java에 연계되어 그 위에 Application으로 Java 코드나 Java 에플릿이 실행가능하다는 뜻이다.


 

⑤ 임베디드 Java와 퍼스널 Java의 비교

퍼스널 Java는 JDK와 호환성을 가지고 있는 Java 응용 환경(Java Appication Environment : JAE)를 내장하고 있어 Java 애플릿 수행이 가능하다. 따라서, 어느 정도의 애플릿이 필요한 웹 브라우징 폰이나 셋톱 박스 같은 제품에서 사용한다. 임베디드 Java는 애플릿을 구현하는 부분이 빠진 JAE를 가지고 있어 애플릿 구현이 되지 않는다. 따라서 사용자 인터페이스가 제한적이다. 구현가능한 제품도 모빌 폰, 네트워크 장비, 프린터 등 사용자 인터페이스가 제한적인 제품에 사용된다.


 

⑥ JavaChip

Java 코드를 마이크로 프로세서에서 직접 실행해서 프로그램의 수행속도를 빠르게 하기 위해 만든 프로세서가 JavaChip으로 picoJava, microJava, UltraJava 등이 있다. picoJava는 PDA, 스마트폰, 저전력 가전 디바이스에, microJava는 저가 네트웍 디바이스, PDA, 전기 통신 기기, 게임기에, UltraJava는 웹 PC등의 테스크탑 환경의 시스템에 각각 사용된다.


 

마치며

이상으로 임베디드 시스템의 정의와 특징, 그리고 임베디드 시스템을 제어하기 위한 각종 임베디드 OS에 대해서 간략하게 살펴보았다. 임베디드 시스템을 이해하고 임베디드 OS를 알려고 한다면 시스템 개발환경을 구축하여 실제로 임베디드 OS를 시스템에 포팅하여 애플리케이션 프로그램을 구현해 보는 것이 가장 빠를 것이다.

현재 임베디드 시스템은 데스크탑 환경에서처럼 하나의 OS가 시장의 대부분을 차지하는 것이 아니라, 어떤 OS도 시장을 장악하지 못한 채 여러 개의 OS들이 출시돼 있는 상태다. 이들 OS들을 다 아는 것도 좋겠지만, 자신의 시스템에 맞는 OS를 택해 완벽하게 구현해 보는 것도 좋을 것이라 생각한다.

출처 : http://cafe.naver.com/lovevirus4u/8 

'컴퓨터공학' 카테고리의 다른 글

국제 프로그래밍 대회 Codeforce  (0) 2016.04.28
Software Process Model  (0) 2008.09.28
합병정렬 - 알고리즘  (0) 2008.09.21
퀵소트 - 알고리즘  (4) 2008.09.21
삽입정렬 - 알고리즘  (0) 2008.09.21
Embedded에서 ARM의 의미  (0) 2008.09.15
운영체제의 종류  (0) 2008.09.15
프로그래밍언어론 - 용어  (0) 2008.09.03
cache 적중률  (1) 2008.08.31
cache memory - 2  (0) 2008.08.31