2011. 12. 20. 21:42

semaphore란 ?

기본카테고리 2011. 12. 20. 21:42
SUBJECT:   semaphore란 ? Description :o 세마포어 (semaphore)란 (1) ?  - 동기화의 일반적인 방법인 세마포어 방법은 세마포어라는 정수 변수    (integer variable), 프로세스 대기열(process waiting queue),     P와 V의 두 명령으로 구성된다. 초기 상태의 변수값은 자원의 수와 같으며    대기열은 비어 있다. P명령은 변수의 값을 하나 줄인 후,     변수의 값이 0보다 작으면 프로세스를 대기열로 집어 넣는다.     반대로 0보다 크면 그 프로세스는 계속 진행된다.     V명령은 변수의 값을 하나 증가시킨다.  그 결과가 0보다 크면 프로세스는     계속되며 0보다 작으면 대기열의 프로세스 하나를 준비 상태로 만들고,     프로세스의 수행은 계속된다.  결국 변수의 값은 음수일 경우는 대기 중인     프로세스의 수를 나타내며, 양수이면 사용 가능한 자원의 수를 가리킨다.      위에서 동기화란 프로세스의 실행을 시간에 따라 순서적으로 처리하는 것을     동기화라 한다.o 세마포어 (semaphore)란 (2) ?  - 다익스트라(E.J.Dijkstra)가 제안한 동시에 정보를 공유하여 수행되는     두 개 이상의 프로그램이나 프로세스에서 활동(activity)의 위치(coordination)를    설정해 주는 데 사용되는 동기화를 위한 기본 조작. 이는 두개 이상의     프로세스에 의해 공유되는 고유변수로 정의되는데, 보통의 방법으로는     다룰 수 없고 항상 P와 V라는 연산을 통해서만 액세스할 수 있다.      세마포어 sem이란 다음과 같은 연산이 허용된 정수형 변수를 말한다.    (P와 V란 이름은 wait와 signal이란 말의 네덜란드어에서 나온것으로     이때 signal이란 물론 UNIX의 signal호출과는 다르다.)     두 연산은 모두 원자화되어야 한다. 즉 sem을 변경할수 있는 프로세스는     한 순간에 오직 하나 뿐이다.     ------------------------------------------------------------------------------------------------    | 컴퓨터가 여러 프로그램을 동시에 수행하는 다중 프로그래밍 시스템에서는 프로세스들간의 상호    |    | 배제와 동기화를 위한 기본적인 연산이 필요하다. 세마포어는 다익스트라가 제안한 프로세스       |    | 동기화를 위한 구조로, 이는 여러 프로세스들에 의해 공유되는 변수로 정의된다.                  |    | 그런데 이 변수는 보통의 방법으로는 액세스할 수 없고 오직 P와 V라는 연산으로만 다룰 수 있다.  |    | P와 V연산의 정의는 다음과 같다.                                                              |    |                                                                                              |    |              procedure P(S)   --> 최초 S값은 1임                                             |    |                  while S=0 do wait  --> S가 0면 1이 될때까지 기다려야 함                     |    |                  S := S-1   --> S를 0로 만들어 다른 프로세스가 들어 오지 못하도록 함         |    |              end P                                                                           |    |                                                                                              |    |              procedure V(S) --> 현재상태는 S가 0임                                           |    |                  S := S+1   --> S를 1로 원위치시켜 해제하는 과정. 이제는 다른 프로세스가     |    |              end V              들어 올수 있음                                               |    |                                                                                              |    | P와 V는 쪼갤수 없는 단일 연산이다.                                                           |    | 즉 한 프로세스가 P나 V를 수행하고 있는 동안에는 프로세스가 인터럽트를 당하지 않는다.         |    | 이제 P와 V를 사용하면 다음과 같이 위험지역(cirtical section)에 대한 상호배제를 구현할수 있다.|      |                                                                                              |    |              P(S);                                                                           |    |              -----------------                                                               |    |              | 위 험 지 역   |                                                               |    |              -----------------                                                               |    |              V(S);                                                                           |    |                                                                                              |    | 최초에 S의 값은 1이다. 위와 같은 위험지역을 포함하는 두개의 프로세스 A와 B가 있다고 하자.    |    | A와 B는 서로 독립적으로 수행되지만, 두 프로세스가 동시에 위험 지역으로 들어가서는 안된다.    |    | 위와 같이 세마포어를 사용하면 P(S)를 먼저 수행하는 프로세스가 S를 0으로 해놓고 위험지역에    |    | 들어가므로 나중에 도착하는 프로세스는 P에서 더이상 진행되지 못하고 기다리게 된다.            |    | 먼저 들어갔던 프로세스가 V(S)를 해주어야 비로서 P(S)에서 기다리던 프로세스가 위험지역에      |    | 들어갈 수 있고 따라서 상호배제가  실현된다.                                                  |    | 위의 예는 이진 세마포어 (binary semaphore)로, 단지 하나의 프로세스만이 위험지역에 들어갈 수  |    | 있도록 한다. 한편 S의 초기값을 N으로 하면 최대 N개의 프로세스가 P(S)를 통과할 수 있게        |    | 되는데 이러한 경우에는 계수 세마포어 (counting semaphore)라 하며 자원 할당에 사용한다.       |    ------------------------------------------------------------------------------------------------     UNIX 시스템 V에서 구현된 세마포어는 이러한 개념에 기초했지만 보다     일반적인(그리고 아마도 보다 복잡한)기능을 제공한다.     우선 semget과 semctl을 살펴보자.    <사용법>         #include          #include          #include              key_t key;         int sem_id, nsems, permflags, command;         int retval, sem_num;         union semun {               int val;               struct semid_ds *stat;               ushort *array;               } ctl_arg;                .                .                .         sem_id = semget(key, nsems, perflags);         retval = semctl(sem_id, sem_num, command, ctl_arg);     semget 호출은 msgget(get message queue)과 유사하다. 인수 nsems는      세마포어 집합에 필요한 세마포어의 갯수를 나타낸다.      따라서 UNIX 세마포어 연산은 세마포어 하나만이 아니라 한 집합 전체를     다루게 된다. 이로 인해서 나머지 세마포어 루틴에 대한 인터페이스가      복잡해진다.     semget호출이 성공하면 세마포어 집합 식별자라는 메시지 큐 식별자와 유사한      역할을 하는 것이 돌아온다. C 언어의 관습을 따라서 세마포어 집합에 대한      첨자는 0부터 nsems-1까지 있을 수 있다.     집합 내의 각 세마포어는 다음과 같은 값들을 갖게 된다.       . semval : 세마포어의 값으로서 항상 양수가 지정된다.                   여기에 값을 새로 지정하려면 반드시 세마포어 시스템 호출을                   통해야하며 프로그램에서 일반 자료형의 변수와 같이 직접                  접근 할 수는 없다.       . sempid : 세마포어에 접근했던 최근의 프로세스의 프로세스 식별번호이다.       . semncnt : 세마포어의 값이 현재보다 증가하기를 기다리는 프로세스의 갯수       . semzcnt : 세마포어의 값이 0으로 되기까지 기다리는 프로세스의 갯수     정의에서 알 수 있듯이 함수 semctl은 msgctl보다 훨씬 복잡하다.      sem_id는 유효한 세마포어 식별자라야 한다.      command는 msgctl에서와 같이 수행해야 할 정확한 기능을 명시한다.      이 기능에는 세가지 유형이 있다. IPC_STAT와 같은 표준 IPC기능,     단일 세마포어만을 다루는 기능, 세마포어의 전체를 다루는 기능이 그것이다.      가능한 모든 기능을 다음과 같이 정리하였다.                                       semctl(semaphore control operations) 기능 코드   -----------------------------------------------------------------------------         표준 IPC기능 (semid_ds구조는 sem.h에 정의되어 있다.)   -----------------------------------------------------------------------------          IPC_STAT  상태정보를 ctl_arg.stat에 저장한다.         IPC_SET   ctl_arg.stat에 저장된 형태로 소유권과 사용 허가권을 지정한다.         IPC_RMID  시스템에서 해당 세마포어의 집합을 삭제한다.   -----------------------------------------------------------------------------          단일 세마포어 연산 (이들은 retval에게 넘어온 값 sem_unm을 사용한다.)   -----------------------------------------------------------------------------          GETVAL    세마포어의 값 semval을 돌려준다.         SETVAL    세마포어 값을 ctl_arg.val로 지정한다.         GETPID    sempid의 값을 돌려준다.         GETNCNT   semncnt를 돌려준다.         GETZCNT   semzcnt를 돌려준다.   -----------------------------------------------------------------------------          전체 세마포어 연산    -----------------------------------------------------------------------------          GETALL    모든 senvals의 값을 ctl_arg.array에 저장한다.         SETALL    ctl_arg.array의 값을 사용하여 모든 semvals값을 지정한다.   -----------------------------------------------------------------------------           sem_num 인수는 semctl의 단일 세마포어 기능에서 특정 세마포어를 지정해준다.      마지막 인수인 ctl_arg는 세가지 구성 요소의 결합이다.       이들 구성 요소들은 각각 semctl의 세가지 기능에 대응한다.      semctl은 세마포어의 초기값을 지정할 때 요긴하게 사용된다.       이 기능은 semget에는 없음에 주의하라.      따라서 semget과 semctl은 두개 모두 있어야 한다.      다음에 예로서 제시하는 함수는 프로그램이 단일 세마포어를 생성할때나       이에 대한 세마포어 집합 식별자를 얻고자 할 때 사용될 수 있다.       세마포어가 생성되는 경우에는 semctl을 사용하여 초기값을 부여하게 된다.   /* initsem  -- semaphore initialization */   #include "pv.h"    initsem(semkey)    key_t semkey;    {          int status = 0, semid ;          if ((semid = semget(semkey, 1, SEMPERM|IPC_CREAT|IPC_EXCL)) == -1) {               if (errno == EEXIST)                   semid = semget(semkey, 1, 0);          }else   /* if created... */               status = semctl(semid, 0, SETVAL, 1);        if ((semid == -1 || status == -1) {             perror("initsem failed");             return (-1);        }else             return semid;    /* all okay  */     }    include 화일 pv.h는 다음과 같다.     /* semaphore example header file */    #include     #include     #include     #include     extern int errno;    #define SEMPERM 0600    #define TRUE 1    #define FALSE 0    세마포어 연산 : semop 호출 - semop 호출 semop은 기본적인 세마포어 연산을 실제로 수행하는 시스템호출이다.   이때 semop은 메뉴얼의 항목이 아니라 실제 함수 이름이다.   사용법       #include       #include       #include       int retval, sem_id;      struct sembuf op_array[SOMEVALUE];               .               .      retval = semop(sem_id, op_array, SOMEVALUE);   sem_id는 세마포어 집합 식별자로서 이전에 semget호출을 통해 값이 지정되어야    한다. op_array는 sembuf구조의 배열로서 sembuf구조는 sem.h에 정의되어 있다.   SOMEVALUE는 임의의 정수형 상수이다.    각각의 sembuf구조 변수는 세마포어에 대해 수행할 연산을 지정한다.   다시 강조하거니와 semop함수가 세마포어 집합에 대해 수행하는 일련의 연산들은    모두 원자화 되어야 한다. 즉, 그중의 한 연산이라도 수행할 수 없다면 전체 연산   이 모두 수행되지 말아야 한다. 이 경우에는 특별히 명시되지 않는한,    모든 연산이 한번에 수행될수 있을때까지 프로세스의 수행이 중지된다.   sembuf구조를 좀더 자세히 보면 다음과 같이 구성되어 있다.        --------------------------------------------------------------------      |     struct sembuf {                                              |      |     short   sem_num;        /* semaphore # */                    |      |     short   sem_op;         /* semaphore operation */            |      |     short   sem_flg;        /* operation flags */                |      --------------------------------------------------------------------    sem_num는 집합 내의 세마포어에 대한 첨자를 저장한다. 만약 집합의 원소가    하나뿐이라면 sem_num의 값은 0이어야 한다.  sem_op는 함수 semop이 수행해야    하는 기능을 정수로서 나타낸다.   여기에는 세가지 경우가 있다.   경우 1 : sem_op가 음수일때   이 경우에는 앞서 소개했듯이 일반적인 세마포어 명령 P()와 같이 수행된다.    이를 의사 코드(pseudo-code)로 나타내면 다음과 같다   (ABS는 변수의 절대값을 나타낸다)         if (semval >= ABS(sem_op)){             set semval to semval-ABS(sem_op)        } else {             if ((sem_flg&IPC_NOWAIT))                     return-1 immediately             else{                    wait until semval reaches or exceeds                    ABS(sem_op), then subtract                    ABS(sem_op) as above                  }           }   기본 개념은 함수 semop에서 sem_num이 가리키는 세마포어의 값 semval을    조사하는 것이다.   semval의 값이 충분히 크다면 즉시 하나 감소시킨다. 아니면 semval이 충분히    커질 때까지 프로세스의 수행을 중단시킨다. 그러나 sem_flg의 IPC_NOWAIT   플래그의 값이 1로 되어 있으면 sem_op은 즉시 -1을 되돌려주고 errono값을    EAGAIN으로 한다.   경우 2 : sem_op이 양수일 때   이때는 보통의 V()연산과 유사하다. 즉 sem_op의 값을 해당 semval에 더해준다.   이때 해당 세마포어의 값이 증가하기를 기다리는 프로세스들이 깨어나게 된다.       경우 3 : sem_op이 0일때   이 경우는 semval을 변환시키는 것이 아니라 값이 0이 될때까지 기다린다.   semval이 0이 아니고 sem_flg의 IPC_NOWAIT가 1인 경우에 semop는 즉시 오류    값을 돌려주게 된다.            SEM_UNDO 플래그   - 이것은 sembuf구조의 구성요소 sem_flg에 있는 플래그의 하나이다.      이는 프로세스의 수행이 끝났을 때 시스템이 수행된 연산을 자동적으로      취소하도록 지시한다. 수행된 일련의 연산을 추적하기 위하여 시스템은      세마포어에 semadj라는 정수를 대응시킨다.      이때 semadj변수는 프로세스마다 할당되어야 함에 주의해라.       따라서 서로 다른 프로세서는 동일한 세마포어에 대해 독립적인 semadj값을      유지하게 된다. SEM_UNDO의 값을 1로 하고서 semop연산을 수행하면      semadj값에서 sem_num값을 뺀다.     이때 sem_num의 부호가 중요한데 이는 sem_num의 값이 양수인가 음수인가에      따라 semadj의 값이 감소하거나 증가하기 때문이다. 프로세스의 수행이 끝나면      시스템은 semadj값을 해당 세마포어에 더해줌으로써 지금까지의 모든      semop호출 효과를 상쇄시킨다. 일반적으로 볼때 프로세스가 지정한 값이      해당 프로세스의 종료 후에도 효력을 갖지 않는다면 SEM_UNDO가 사용되어야만      한다.   세마포어의 예   - 이제 initsem루틴으로 시작한 예를 완성해 보자. 여기서는 전통적인 세마포어      연산을 P()와 V()로 구현하여 이를 중심으로 삼았다. 우선 P()를 보자.       /* pc -- semaphore p operation */       #include "pv.h"       p(semid)       int semid;       {           struct sembuf p_buf;           p_buf.sem_num = 0;           p_buf.sem_op = -1;           p_buf.sem_flg = SEM_UNDO;                     if (semop(semid, &p_buf, 1) == -1) {               perror("p(semid) failed");               exit(1);           } else               return(0);        }      이때 SEM_UNDO를 사용했음에 주의하라. V()는 다음과 같다.              /* v.c -- semaphore v operation */        #include "pv.h"        v(semid)        int semid;        {            struct sembuf v_buf;            v_buf.sem_num = 0;             v_buf.sem_op = 1;             v_buf.sem_flg = SEM_UNDO;               if(semop(semid, &v_buf, 1) == -1) {                perror("v(semid) failed");                exit(1);            } else                return(0);         }     이제 비교적 간단한 이들 루틴으로 상호 배제를 구현해보자.     다음의 프로그램을 살펴보자.          /* testsem -- test semaphore routines */         #include "pv.h"                  main()         {              key_t semkey = 0x200;                            if(fork() == 0)                 handlesem(semkey);              if(fork() == 0)                 handlesem(semkey);              if(fork() == 0)                 handlesem(semkey);          }                       handlesem(skey)          key_t skey;          {              int semid, pid = getpid();               if((semid = initsem(skey)) < 0)                  exit(1);              printf("\nprocess %d before critical section\n", pid);                      p(semid);              printf("process %d in critical section\n", pid);                           /* in real life do something interesting */              sleep(10);              printf("process %d leaving critical section\n", pid);              v(semid);              printf("process %d exiting\n", pid);              exit(0);           }     testsem은 세개의 자식프로세스를 생성하고 , 이들은 p()와 v()를 사용하여      임계 영역에는 한 순간에 둘 이상이 들어있지 못하도록 한다.      한 컴퓨터에서 testsem을 수행시킨 결과는 다음과 같다.              process 799 before critical section               process 800 before critical section               process 801 before critical section                process 799 in critical section               process 799 leaving critical section               process 799 exiting               process 801 in critical section               process 801 leaving critical section               process 801 exiting              process 800 in critical section               process 800 leaving critical section               process 800 exiting                o Critical secion 란 ?  - 다중 프로그래밍 운영체제에서 여러 프로세스가 데이타를 공유하면서 수행될 때     각 프로세스에서 공유 데이타를 액세스하는 프로그램 코드 부분을 가리키는 말.    공유데이타를 여러 프로세스가 동시에 액세스하면 시간적인 차이 때문에 잘못된     결과를 만들어 낼 수 있기 때문에 한 프로세스가 위험 부분을 수행하고 있을 때,    즉 공유 데이타를 액세스하고 있을 때는 다른 프로세스들은 절대로 그 데이타를    액세스하지 못하도록 하여야 한다.o Mutual exclusion (상호 배제)란(1) ?  - 프로세스의 상호 교신에 대한 기본적인 조치는 공용 부분을 여러 프로세스가     동시에 사용하는 것을 배제하는 것이었다. 시스템의 어떠한 자원을 한 시점에서    한개의 프로세스만이 사용할 수 있도록 하는 것을 상호배제라 한다. 또한,     프로그램에서 이러한 자원을 사용하거나 혹은 그 내용을 변경하는 부분을     위험부분 (critical section)이라 하며, 둘 이상의 프로그램에서 이 위험     부분이 동시에 수행되지 않도록 하는 것이 상호 배제의 기능이다.  o Mutual exclusion (상호 배제)란(2) ?  - 다중 프로그래밍 시스템에서 여러 프로세스가 하나의 공유 데이타를 액세스하면서    작업을 할 때, 한 프로세스가 그 데이타를 액세스할 때는 다른 프로세스들은     그것을 사용하지 못하도록 하는 운영체제의 기능.    예를 들어 한 프로세스가 어떤 화일에 데이타를 쓰고 있을 때 다른 프로세스가     그 화일을 지원버린다면 많은 문제가 발생할 것이다. 상호 배제는 한번에     한 프로세스만이 공유 데이타를 액세스할 수 있도록 해 주는 것으로,     다중프로그래밍 시스템의 운영체제가 꼭 갖추어야 할 기능이다.         Revision History작성일자 : 96.10.10작성자 : 이진수수정일자 :수정자 :
2011. 12. 20. 21:37
HA(High Availability)란 무엇인가?

복사 http://blog.naver.com/orayoon/50000230534

HA, 중단 없는 서비스를 위한 필수 전략

인터넷의 급속한 발전으로 세계 어느 곳에 있든지 웹브라우저만 있으면 다양한 업무들을 처리할 수 있게 됐다. 전 세계가 인터넷이라는 거대한 하나의 고리로 연결됐을 뿐 아니라 인터넷 뱅킹, 전자결제, 전자상거래, 홈쇼핑, 증권 거래, 민원 업무 등 우리의 일상도 인터넷을 이용해 처리할 수 있게 된 것이다. 이처럼 인터넷이 생활 속으로 깊숙이 침투하고 이러한 서비스를 이용하는 사용자들이 빠르게 증가함에 따라 중단 없는 서비스에 대한 요구도 점점 높아지고 있다. 따라서 24×7×365일 항상 서비스를 제공할 수 있는 시스템이 절실하게 필요해졌다. ‘해가 져도 비즈니스는 계속된다’는 광고 카피처럼, HA(High Availability)는 이제 비즈니스의 연속성과 가용성을 극대화해주는 필수 전략이 되고 있다.

서현교
맨텍 솔루션 사업부 과장

HA 구성(클러스터 구성)

단일 시스템

시스템 가용성

언제나 보장(서비스 레벨의 HA 구성은 99.999%의 가용성 보장).

한 번 시스템에 장애가 발생하면 복구 시간이 오래 걸림(보통 97% 내외의 가용성을 보장).

애플리케이션

시스템이 다운돼도 대기 상태에 있는 서버에서 항상 서비스 가능.

시스템을 재구성한 후 다시 서비스 재개.

비용 및 효율성

초기 설치 비용에 대해서 부담이 있긴 하지만 훨씬 안정적이고 믿을 만한 서비스를 보장받을 수 있음.

설치 비용은 저렴하나 시스템 장애가 일어나게 되면 가용성이 보장 안됨.

평가

긴 안목에서 중단 없는 서비스를 제공해 더 효율적임.

장애는 곧 막대한 매출 손실뿐 아니라 항상 시스템 운영자를 불안하게 함.

HA의 필요성

HA(High Availability)는 고가용성을 의미한다. HA와 클러스터(Cluster)라는 용어는 엄밀히 말하면 다르지만, 고가용성이라는 의미로 혼용해 사용하고 있다. 아마도 몇몇 HA 제품들의 명칭에 클러스터라는 단어가 사용되고 있기 때문일 것이다.
HA의 목적은 서비스의 다운타임을 최소화함으로써 가용성을 극대화하자는 것이다. 운영 서버에 장애가 발생하더라도, 대기 서버가 즉시 서비스를 대신 처리해 준다면 서비스의 다운타임은 최소화될 수 있다. 운영 서버에 언제 장애가 발생할 지는 아무도 예측할 수 없다. 관리자가 아무도 없는 새벽 시간에 장애가 발생할 수도 있다. HA는 관리자가 없을지라도, 운영 서버의 장애를 모니터링해 대기 서버가 처리할 수 있도록 함으로써 중단 없이 서비스를 제공하는 역할을 한다.
HA는 이와 같이 계획되지 않은 다운타임을 위해 구성하는 것이지만, 더불어 계획된 다운타임에 대해서도 이용할 수 있다. 운영 서버 작업 시, HA를 이용해 대기 서버로 쉽고 빠르게 서비스를 이관할 수 있다. 이렇듯 HA는 서비스 이관의 편리함을 제공한다.
과거에는 HA에 투자하는 것을 과잉 투자라고 생각했다. 그러나 HA는 이제 선택 사항이 아니다. e비즈니스 환경에서 기업이 살아남기 위한 필수 사항이 된 것이다.

다양한 HA 제품들

현재 상용되고 있는 HA 제품들은 크게 하드웨어 업체에서 제공하는 것과 서드파티 제품으로 구분할 수 있다.
각 하드웨어 업체들은 자체 HA를 가지고 있다. 하드웨어 업체의 HA는 해당 하드웨어와 해당 OS에 종속적이다. 반면에, 서드파티 제품은 하드웨어 업체나 OS 플랫폼에 독립적이며 애플리케이션 레벨에서 동작하기 때문에 제품이 가볍다. 또한 이기종 OS 환경 하에서도 단일 콘솔로 관리할 수 있다는 장점이 있다.



HA가 관리하는 장애 포인트

HA는 어떠한 상황을 장애로 판단하고 대기 서버를 구동해 서비스를 하도록 하는 것일까?
HA가 관리하는 포인트는 크게 세 가지로 나누어 볼 수 있다.
- 하드웨어 장애: 전원 공급, CPU, 메모리, HDD 장애
- 네트워크 장애: 네트워크 카드, LAN 케이블 장애
- 프로세스 장애: DB 및 각종 애플리케이션 장애
HA는 계속해서 상대방 시스템의 상태를 모니터링하고 있다가 이와 같은 장애가 발생할 경우 자동으로 조치하게 된다. 이를 통해 서비스를 지속적으로 제공할 수 있도록 해준다.
HA는 양쪽 서버에 각각 설치하게 된다(그림 7).
각 시스템을 보면 맨 하단에 OS가 있고, 그 위에 애플리케이션이 있다. HA는 맨 상단에서 시스템과 애플리케이션을 모니터링한다. Heartbeat는 두 서버 간의 HA 통신 라인이다. 서로의 상태를 모니터링하는 중요한 연결 라인이다.
그림 8에 HA 절체(Failover) 원리에 대해 도시했다.
활 성(Active)-대기(Standby) 상태의 두 시스템이 있다. 활성 서버에 장애가 발생했을 때, 모든 서비스가 대기 서버에서 구동돼 서비스가 이루어진다. 물론 HA가 활성 서버의 장애를 자동으로 감지해 대기 서버로 넘기는 것이다. 이런 현상을 절체, 페일오버(Failover), 스위치오버(Switchover)라고 말한다.
HA는 첫째, 서비스 IP인 10.10.10.3을 넘겨준다. 클라이언트에서는 10.10.10.3 IP만 찾으므로 대기 시스템으로 연결된다.
둘째, 스토리지의 파일 시스템인 /data를 마운트한다. 이 안에 모든 데이터가 들어있다.
셋째, DB 및 각종 애플리케이션을 구동한다. 애플리케이션까지 구동돼야만 온전한 서비스를 할 수 있게 된다.

지금까지 HA의 정의와 필요성, 구축 효과 등에 대해 알아보았다. HA의 도입으로 서비스의 가용성을 극대화할 수 있다. 언제 장애가 발생하더라도 HA가 자동으로 대처해 주기 때문에, 기업들은 업무의 지속성을 유지할 수 있으며, 관리자들은 장애에 대한 공포를 덜 수 있게 된다

출처 : 시사컴퓨터 2004년 1월호

'기본카테고리' 카테고리의 다른 글

26회 기술지도사(정보처리분야) 후기  (0) 2012.05.03
semaphore란 ?  (0) 2011.12.20
결함허용컴퓨터/ FTS / 장애 허용 시스템  (0) 2011.12.18
CPU 스케줄링  (0) 2011.12.15
병렬 컴퓨팅  (0) 2011.12.13
2011. 12. 18. 19:26
결함허용컴퓨터/ FTS / 장애 허용 시스템



장애 허용 시스템

위키백과, 우리 모두의 백과사전.

장애 허용 시스템(Fault tolerant system)은 구성 부품의 일부가 고장나도 정상적으로 처리를 수행하는시스템이다.

장애 허용 개념이 고려되지 않은 시스템에서는 조금의 장애가 발생해도 전체에 영향을 주지만 장애 허용 시스템에서는 완전하게 기능을 유지한 채로 처리를 지속하거나 장애의 정도에 따라 기능을 저하되더라도 처리는 지속한다.

목차

[숨기기]

[편집]적용 분야

장애 허용 시스템 성격은 연속적인 동작이 요구되는 시스템이나 인명에 영향을 주는 시스템으로 특별히 나눌 수가 있다.

[편집]특성

장애 허용 시스템의 특성은 개별 구성품의 특성만이 아니고, 머신간의 제휴에 대한 규칙의 특성이기도 하다. 예를 들어TCP에서의패킷 통신네트워크내에서 불완전한 링크나 과부하의 링크가 있어도 신뢰성이 높은 쌍방향 통신을 할 수 있도록 설계되고 있다. 이것은 수신측에서 패킷 상실, 패킷 이중화, 순서 변경 등이 있도록통신 프로토콜이 설계되어 있기 때문에 결과적으로 통신 성능이 저하되도 데이터의 정확성이 손상되지 않게 되어 있는 것이다. 데이터 형식도 동일한 생각을 적용시킬 수 있다. 예를 들어HTML에서상위 호환을 유지하도록 설계되고 있기 때문에 새로운 기능을 사용한 HTML을 오래된브라우저가 읽어들였을 때 그것을 처리할 수 없는 것으로서 버리는 것이 아니라 이해할 수 있는 범위를 표시하도록 할 수 있다.

각 시스템 안에는발산 성질(resilience) 상태 예외적인 경우를 고려하여 대처할 수 있도록 시스템을 구축해야 한다. 또한 일반적으로자기 안정성을 갖게 하는 것에 의해서 시스템이 오류 없는 상태로 수렴시키는 것으로발산 성질(resilience)을 줄인다. 그러나 시스템 장애가 중대하기에, 그에 대처하는 데 매우 큰 비용을 들이는 것보다 더 좋은 방법은 이중화를 하는 것이다.

[편집]장애 복구 방식

장애 허용 시스템에 있어서의 장애 복구는롤포워드 복구(roll-forward)와롤백 복구(roll-back)으로 나눌 수 있다. 시스템 장애로 인해 오류가 일어났을 때 롤 포워드 복구에서는 그 시점의 시스템 상태로 복구를 실시한다.롤백 복구에서는 시스템 상태를 약간 이전으로 되돌려(예를 들어 Checkpointing 사용) 거기에서부터 처리를 재개한다.롤백 복구(rollback)에서는 체크 포인트(되돌리는 지점)와 장애 발생 지점과의 사이의 처리는멱등(몇 번 실행해도 1회 실행한 것과 같은)이 아니면 안 된다. 몇 개의 시스템은 오류의 종류나 오류 발생 수에 의해서롤포워드 복구롤백 복구(rollback)를 구현한다.

[편집]이중화 시스템 (Fault-tolerance by replication)

이중화에 의한 장애 허용 시스템은 특징은 세 가지로 나뉜다.

  • 리플리케이션(Replication):동일한 시스템을 복수로 준비하여 병렬로 실행시켜 다수를 만족한 결과를 올바른 결과적으로 적용한다.
  • 다중화(Redundancy) : 동일한 시스템의 복수로 준비하여 장애가 일어나면 보조 시스템으로 전환한다.
  • 다양화(Diversity):같은 사양에 다른 하드웨어 시스템을 복수로 준비하여 복제화와 같이 그것을 운용한다. 이 경우, 각 시스템이 똑같은 장애를 일으키지 않는다.

레이드(RAID)는다중화를 활용한 장애 허용 시스템을기억 장치에 적용한 예이다. 레이드의 개념이 발전하면서레이드 0과 같은 속도만을 향상시키기 위한 시스템도 레이드에 포함되나 이는 엄밀히 말해 장애 허용 시스템에는 해당하지 않는다.

락스텝(lockstep) 방식의 장애 허용 시스템 머신은 각 부분을 다중화해 병렬해 동작시킨다. 다중화된 각 부분은 어느 시점에서 봐도 완전히 같은 상태가 아니면 안 된다. 같은 입력을 주었을 경우에 같은 출력을 얻을 수 있는 것을 기대할 수 있다. 다중화 부분의 출력은 다수결 회로에 모아져 비교된다. 각 부품을 이중화한 머신 (dual modular redundant,DMR)으로 불린다. 이 경우 다수결 회로는 결과가 차이가 나는 것밖에 모르기 때문에 복구는 다른 방법으로 실시할 필요가 있다. 각 부품을 삼중화한 머신 (triple modular redundant,TMR) 으로 불린다. 이 경우의 다수결 회로는 비교 결과가 2대1이 되었을 때에 오류를 판정하므로 올바른 결과를 출력할 수 있어 오류로 판정된 결과를 버릴 수 있다. 그 뒤, 오류를 일으킨 복제 부품은 고장난 것으로 간주하여 다수결 회로는DMR상태로 전환한다. 이 모델은 더 많은 복제에 대해서도 적용시킬 수 있다.락스텝방식의 머신은 간단하게 완전하게 동기시킬 수 있어 각 복제 부품은 같은 클락으로 동기하여 동작한다. 물론 각 복제를 클락에 동기시키지 않는 락스텝 시스템도 구축 가능하다. 다만, 클락 동기 하지 않는 경우, 고장에 의해서 출력을 다수결 회로에 보낼 수 없게 된 부품을 어떻게 취급할지가 문제가 된다.

복제를 동기시키려면 각 내부 상태가 일치해야 한다. 그럼으로써리셋상태 등의 같은 내부 상태로부터 일제히 동작을 개시할 수 있다. 한편, 복제간에 상태를 복사하는 방법도 있다.

DMR변형의 일종인pair-and-spare가 있다. 두 복제 부품이 락스텝에서 같은 처리를 실시해 다수결 회로가 상이값을 검출하면 오류 신호를 출력한다. 또 하나의 이중화 시스템이 완전히 같은 처리를 하고 있고, 두 이중화 시스템의 출력을 비교해 오류가 되지 않은 것을 적용한다. pair-and-spare는 네개 복제가 필요한데TMR이 필요한 세계보다 많지만 상용 시스템으로 채용된 예도 있다.

[편집]동작 지속 (No Single Point of Repair)

시스템이 고장 나더라도 지속적으로 동작해야 하며, 복구 작업을 하는 동안 성능 간섭이 없어야 한다.

[편집]고장 분리 (Fault Isolation to the Failing Component)

고장이 발생할 때 시스템은 고장과 분리되어 정상적인 구성 요소에 영향을 주지 말아야 한다. 이것은 고장 감지 메커니즘이 고장과 분리를 목적으로 존재함을 나타낸다.

[편집]고장 전염 (Fault Containment)

어떤 고장 메커니즘은 시스템을 고장나게 하는 원인이 될 수 있는데 나머지 시스템에게 고장을 전파한다. 예를 들어, "Rogue transmitter"는 정상적인 통신 상태를 문제를 만들어 버리고 모든 시스템을 고장나게 한다. "Rogue transmitter"를 격리하는 메커니즘 또는 구성 요소를 잘못되게 하는 것으로부터 보호하는 시스템이 필요하다.

[편집]부가적으로

오차 허용 시스템의 특징은 계획된 서비스 정지 또는 비계획 서비스 정지 개념을 포함한다. 이것은 보통 측정이 되는데 응용 프로그램 수준에서이지 하드웨어 수준은 아니다. 이것의 이점은가용성(availability)이라고 부르고퍼센트단위로 표현되는데 통계적으로 99.999%(five nines) 가용성을 갖는다.

[편집]관련 항목

[편집]바깥 고리

[편집]서적

[편집]자료

'기본카테고리' 카테고리의 다른 글

semaphore란 ?  (0) 2011.12.20
HA, High Availability  (0) 2011.12.20
CPU 스케줄링  (0) 2011.12.15
병렬 컴퓨팅  (0) 2011.12.13
parallel processing ; 병렬처리  (0) 2011.12.13
2011. 12. 15. 22:34

CPU 스케줄링

기본카테고리 2011. 12. 15. 22:34

[출처] http://park1020.tistory.com/entry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%9D%B4%EB%A1%A0%EC%A4%91%EC%97%90%EC%84%9C-CPU%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81-%EA%B8%B0%EB%B2%95

CPU스케줄링

■ CPU 스케줄링의 개념:

프로세스들의 수행 순서를 정해 주는 것.

- 준비 상태에 있는 프로세스 중에서 어느 프로세스에게 CPU를 할당할 것인지 결정.


■ CPU 스케줄링의 필요성:

여러 프로세스가 한 job을 수행하는데 CPU가 줄 곧 필요하지 않다. 계산을 할 때는 CPU가 필요하지만, I/O를 할 때는 필요 없다. 이때 CPU를 다른 프로세스가 이용하면 전체적인 시스템의 효율은 올라간다.


프로세스 A

처리 I/O 처리 I/O



프로세스 B

처리 I/O 처리 I/O


이렇게 CPU를 여러 프로세스가 번갈아 가면서 사용하면 효율적이다.


■ 스케줄링의 분류:

‧ 단기 스케줄링(short-term scheduling) : 준비 상태 프로세스중에서 한 프로세스를 선택하여 CPU 할당.

‧ 중기 스케줄링(medium-term scheduling) : 메모리에 프로세스가 너무 많은 경우, 메모리에 있는 프로세스를 선정하여 디스크로 보낸다. 나중에 다시 올 수 있다(swapping).

‧ 장기 스케줄링(long-term scheduling) : 생성(상태)에 있는 프로그램들 중에서 필요한 프로세스를 생성하여 준비에 넣는다.


■ 스케줄링 기준(용어):

‧ CPU 사용률 : 실제 CPU 사용 시간 / 전체 시간

‧ 처리율(throughput) : 단위 시간당 완료되는 작업 수

‧ 반환시간(turnaround time) : 시스템에 들어가서 마치고 나온 시간 간격

메모리에 들어가기 위해 기다리는 시간, 준비 큐에서 기다리는 시간,

프로세서에서 실행되는 시간, 입출력 시간을 합친 것 (I/O에 영향 多)

‧ 대기시간(waiting time) : 준비 큐에서 기다린 시간

‧ 응답시간(response time) : 제출 --> 첫 번째 응답까지의 시간.
1) 정의


- 작업을 처리하기 위해 프로세스들에게 중앙처리 장치나 각종 처리기들 을 할당하기 위한
정책을 계획하는 것

2) 방법별 분류

① 선점(preemptive) 스케쥴링
- 한 프로세스가 CPU를 차지하고 있을 때 우선순위가 높은 다른 프로세스가 현재 프로세
스를 중지시키고 자신이 CPU를 차지할 수 있는 경우
- 높은 우선순위를 가진 프로세스들이 빠른 처리를 요구하는 시스템에서 유용
- 빠른 응답시간을 요구하는 시분할 시스템에 유용
- 높은 우선순위 프로세스들이 들어오는 경우 오버헤드를 초래

② 비선점(nonpreemptive) 스케쥴링
- 한 프로세스가 CPU를 할당받으면 다른 프로세스는 CPU를 점유못함
- 짧은 작업을 수행하는 프로세스가 긴 작업이 종료될 때까지 기다려야 함
- 모든 프로세스들에게 공정하고 응답시간의 예측이 가능

3) CPU 스케쥴링 알고리즘별 분류

① 우선순위(priority) 스케줄링
- nonpreemptive
- 프로세스에게 우선순위를 부여하여 우선순위가 높은 순서대로 처리

ㄱ) 정적(static) 우선순위 방법
- 주변 환경 변화에 적응하지 못하여 실행중 우선순위를 바꾸지 않음, 구현이 쉽고
오버헤드가 적다
ㄴ) 동적(dynamic) 우선순위 방법
- 상황 변화에 적응하여 우선순위를 변경, 구현이 복잡, 오버헤드 많다,
시스템의 응답속도를 증가시켜 효율적

② 기한부(deadline) 스케줄링 - nonpreemptive
- 작업을 명시된 시간이나 기한내에 완료되도록 계획
- 작업시간이나 상황등 정보를 미리 예측하기가 어렵다

③ FIFO 스케줄링 - nonpreemptive
- 프로세스들은 대기 큐에 도착한 순서대로 CPU를 할당 받는다
- 일괄처리 시스템에서 주로 사용, 작업 완료 시간을 예측하기 용이
- 짧은 작업이 긴 작업을 기다리게 됨
- 중요하지 않은 작업이 중요한 작업을 기다리게하여 불합리

④ 라운드로빈(round robin) 스케줄링
- preemptive
- FCFS에 의해서 프로세스들이 보내지며
- 각 프로세스는 같은 크기의 CPU 시간을 할당 받는다
- 시분할 방식에 효과적, 할당시간의 크기가 매우 중요
- 할당시간이 크면 FCFS와 같게되고, 작으면 문맥교환이 자주 일어난다

⑤ SJF(shortest job first) 스케줄링 - nonpreemptive
- 준비큐내의 작업중 수행시간이 가장 짧다고 판단되는 것을 먼저 수행
- FCFS보다 평균 대기 시간을 감소, 큰 작업은 시간 예측이 어렵다
- 짧은 작업에 유리

⑥ SRT(short remaining time) 스케줄링
- preemptive
- 가장 짧은 시간이 소요된다고 판단되는 프로세스를 먼저 수행
- 남은 처리 시간이 더 짧다고 판단는 프로세스가 준비큐에 생기면 언제라도 실행중인
프로세스가 선점됨
- 긴 작업은 SJF보다 대기 시간이 길다

⑦ HRN(highest response ratio next) 스케줄링
- nonpreemptive
- 긴 작업과 짧은 작업간의 지나친 불평등을 어느 정도 보완한 기법
- 짧은 작업이나 대기시간이 긴 작업은 우선순위가 높아진다

⑧ 다단계 큐(multilevel queue) 스케줄링
- preemptive
- 작업들을 여러 종류의 그룹으로 나누어 여러개의 큐를 이용하는 기법

⑨ 다단계 피드백 큐(multilevel feedback queue) 스케줄링
- preemptive
- 입출력 위주와 CPU 위주인 프로세스의 특성에 따라 서로 다른 CPU의 타임 슬라이스를
부여
- 짧은 작업에 유리, 입출력 위주의 작업에 우선권을 줌
- 하위단계 큐일수록 할당시간은 커진다

'기본카테고리' 카테고리의 다른 글

HA, High Availability  (0) 2011.12.20
결함허용컴퓨터/ FTS / 장애 허용 시스템  (0) 2011.12.18
병렬 컴퓨팅  (0) 2011.12.13
parallel processing ; 병렬처리  (0) 2011.12.13
병렬 처리의 법칙  (0) 2011.12.13