'Algorithm'에 해당되는 글 17건

  1. 2008.12.05 CORBA, EJB, COM/DCOM
  2. 2008.09.16 ACID
  3. 2008.09.09 Sort.. algorithm
  4. 2008.08.26 HDLC 프로토콜
  5. 2008.08.23 셀정렬 1
  6. 2008.08.23 삽입정렬
  7. 2008.08.19 스케쥴링
  8. 2008.08.19 선점,비선점 스케쥴링 1
  9. 2008.08.19 병행프로세스와 상호배제
  10. 2008.08.19 주소지정방식

CORBA, EJB, COM/DCOM

Algorithm 2008. 12. 5. 16:10
CORBA(Common Object Request Broker Architecture)
네 트웍에서 분산 프로그램 객체를 생성, 배포, 관리하기 위한 구조와 규격이며, 네트웍 상의 서로 다른 장소에 있고 여러 벤더들에 의해 개발된 프로그램들이 “인터페이스 브로커”를 통해 통신하도록 해준다. CORBA는 OMG라는 개발자 연합(현재 500여 회원사를 가지고 있다)에서 개발되었다. ISO와 X/Open 양측 모두 CORBA를 분산 객체(컴포넌트로도 알려진)를 위한 표준구조로서 인가하였으며, 현재 CORBA 2.0 이 최신 레벨이다. CORBA의 핵심개념은 ORB이다. 이기종 컴퓨터들의 클라이언트와 서버 네트웍에 대한 ORB 지원이란, 클라이언트 프로그램(객체 자신일 수 있다)이 분산 네트웍에서 서버가 어디 있는지, 또는 서버 프로그램이 어떤 인터페이스를 가질지 인식하지 않고서도, 서버 프로그램이나 객체로부터 서비스를 요구할 수 있다는 것을 의미한다. ORB들간의 요구와 응답을 성립시키기 위해 프로그램들은 GIOP(General Inter-ORB Protocol)를, 인터넷에서는 IIOP를 사용한다. IIOP는 GIOP의 요구와 응답을 각 컴퓨터의 인터넷 TCP 계층으로 대응시킨다. CORBA의 경쟁대상은 독자적인 분산 객체 구조를 가진 마이크로소프트의 DCOM이다. 그러나 CORBA와 마이크로소프트는 게이트웨이를 통해 COM 클라이언트 객체가 CORBA 서버와 통신할 수 있도록 하는데 합의하였다 (그 역방향의 통신도 마찬가지다). 객체지향 프로그래밍과 CORBA를 향한 분산 프로그래밍 구조의 선두주자였던 DCE는 현재 많은 회사에서 사용되고 있다. DCE는 아마 CORBA와 함께 계속 존재할 것이고 둘 사이를 연결시켜 주는 "다리"가 나타날 것이다.

EJB(Enterprise JavaBeans)
클 라이언트/서버 모델의 서버 부분에서 운영되는 자바 프로그램 컴포넌트들을 설정하기 위한 아키텍처이다. EJB는 네트웍 내의 클라이언트들에 분산되어 있는 프로그램 컴포넌트들을 위한 자바빈즈 기술 위에서 구현된다. EJB는 기업들에게, 새로운 프로그램 컴포넌트가 추가되거나 또는 변경될 때마다, 각 개별 컴퓨터를 갱신하지 않고서도 서버에서 변화를 통제할 수 있도록 하는 이점을 제공한다. EJB 컴포넌트들은 다중 응용프로그램들에서 재 사용되는 장점을 가지고 있다. EJB 빈이나 컴포넌트가 배치되기 위해서는 컨테이너라고 불리는 특정 응용프로그램의 일부가 되어야한다. 썬마이크로시스템즈에 의해 비롯된 EJB는, 개략적으로 마이크로소프트의 COM/DCOM 아키텍처에 필적하는 것이다. 그러나, 모든 자바 기반의 아키텍처와 같이, 프로그램들은 윈도우즈뿐만 아니라 모든 주요 운영체계에 걸쳐 배치될 수 있다. EJB의 프로그램 컴포넌트들은 대개 서블릿이라고 알려져 있다. 서블릿을 실행시키는 응용프로그램이나 컨테이너를 때로 애플리케이션 서버라고도 부르는 경우가 있다. 서블릿의 전형적인 용도는 CGI와 Perl 스크립트를 사용하는 웹프로그램을 대체하는 것이다. 또다른 일상적인 용도는 웹사용자와 레거시 메인프레임 응용프로그램과 데이터베이스 사이의 인터페이스를 제공하는 것이다. EJB 내에 두 가지 종류의 빈즈가 있는데, 하나는 세션 빈즈이고 또 하나는 엔터티 빈즈이다. 엔터티 빈즈는 세션 빈즈와 달리, 지속성을 가지고 있으며 원래의 습성이나 상태를 유지할 수 있다.

COM/DCOM(Distributed Component Object Model)
네트웍 상에서 클라이언트 프로그램 객체가 다른 컴퓨터에 있는 서버 프로그램 객체에 서비스를 요청할 수 있도록 해주는 마이크로소프트의 개념이자 프로그램 인터페이스들이다. COM은 같은 컴퓨터(윈도우95나 NT 시스템) 내에서 사용될 수 있도록 클라이언트와 서버에 인터페이스 집합을 제공한다. 예를 들어, 어떤 웹 사이트에 자신의 웹서버가 아닌 다른, 즉 네트웍 상의 보다 특정한 서버에서만 수행되는 스크립트나 프로그램을 가지도록 페이지를 만들 수 있을 것이다. 그 웹사이트의 프로그램(마치 클라이언트 객체처럼 동작하는)은 DCOM 인터페이스를 이용해, 필요한 절차를 수행하고 결과를 웹 서버 사이트에 돌려 주는 특정한 서버 객체에 RPC를 전달할 수 있으며, DCOM은 그 결과를 웹 페이지 뷰어에 넘긴다. DCOM은 또한 대규모 네트웍이나 인터넷과 같은 네트웍 환경에서도 작동할 수 있다. DCOM은 TCP/IP와 HTTP를 사용하며, NT 4.0의 일부가 되었고, 윈도우 95에서 무료로 업그레이드할 수 있다. DCOM은 곧 대부분의 유닉스 플랫폼이나 IBM과 같은 대규모 서버에서도 사용이 가능해질 것이다. DCOM은 OLE Remote Automation을 대체한다. DCOM은 여러가지 분산 서비스들을 제공한다는 차원에서 CORBA와 대등하다. DCOM은 네트웍 환경에서 프로그램과 자료 객체에 대한 마이크로소프트의 접근방식이며, CORBA는 OMG의 후원자들인 그외 나머지 정보통신업계의 지원을 받고있다.

 

'Algorithm' 카테고리의 다른 글

ACID  (0) 2008.09.16
Sort.. algorithm  (0) 2008.09.09
HDLC 프로토콜  (0) 2008.08.26
셀정렬  (1) 2008.08.23
삽입정렬  (0) 2008.08.23
Posted by 으랏차
,

ACID

Algorithm 2008. 9. 16. 17:59
트랜젝션의 기본 ( all or nothing )
각 단계를 거쳐서 영화티켓을 구입하거나 실패하여 롤백하거나..
(출처. Spring In Action 2nd 6장)

트랜젝션의 특성은 크게 4가지 단어로 표현을 하고 각 단어의 첫 단어를 따서 ACID 라고 불린다.
Atomic, Consistent, Isolated, Durable

Atomic (원자성)
트랜젝션은 하나이상의 단위업무를 묶은 작업의 단위이다.
원자성은 모든작업이 이루어지거나 그 반대로 아무것도 이루어지지 않거나 하는것을 이야기 한다.
만약 모든 단위업무가 정상적이라면 트랜젝션은 성공된 것이고, 어떤 단위업무라도 실패가 난다면 전체 트랜젝션이 실패가 난 것이고 롤백이 이루어진다.

Consistent (일관성)
트랜젝션의 성공, 실패여부와 상관없이 일관성있는 상태를 유지해야한다.

Isolated (독립성)
트랜젝션 수행시 다른 트랜젝션이 중간에 끼어들지 못하도록 보장하는것을 말한다.
따라서, 각각의 트랜젝션은 독립적이어야하며 동일한 데이터를 동시에 읽고 쓸 수 없어야한다.

Durable (영속성)
트랜젝션이 완료가 되면 시스템에 어떤 오류가 있던지간에 그 결과는 영구히 반영이 되어야 한다.

'Algorithm' 카테고리의 다른 글

CORBA, EJB, COM/DCOM  (0) 2008.12.05
Sort.. algorithm  (0) 2008.09.09
HDLC 프로토콜  (0) 2008.08.26
셀정렬  (1) 2008.08.23
삽입정렬  (0) 2008.08.23
Posted by 으랏차
,

Sort.. algorithm

Algorithm 2008. 9. 9. 16:12
<5. 정렬 알고리즘(1) >

1) 개요

     * 정렬(sort) : 임의위 순서대로 배열하는 것
     *오름차순(ascending order)
     *내림차순(descending order)

     1] 정렬의 방법론
          * 파일(file) - 정렬대상, 정보의 단위인 레코드의 나열
          * 필드(field) - 각 레코드의 구체적 정보단위
          * 레코드(record)는 C에서 구조체로 표현, 필드는 구조체의 멤버!
          * 키(key) - 필드 중에서 비교의 대상인 것

     2] 정렬 알고리즘의 다양성
          * 간단 : 선택정렬, 삽입정렬, 거품정렬, 셀정렬
          * 복잡 : 퀵정렬, 기수정렬, 힙정렬, 병합정렬

          *내부정렬 (Internal sort) - 속도 빠름, 모든자료를 메인메모리로 옮겨 놓아야 하는 부담
          *외부정렬 (External sort) - 속도 느림, 자료가 메인메모리 차지안하므로 메모리 절약!

          *직접정렬 (Direct sort) - 메모리 절약 but 속도느림
          *간접정렬 (Indirect sort) - 메모리 소요, 실제 레코드 교환안하므로 속도 빠름

          * 삽입(Insertion) : ex) 삽입정렬
          * 교환(Exchange) : ex) 거품정렬, 퀵정렬, 기수교환정렬
          * 병합(Merging) :  ex) 병합정렬
          * 선택(Selection) : ex)선택정렬, 힙정렬
          * 세기(Counting) : ex) 분포수세기, 직접기수정렬

--------------------------------------------------------------------------------

2) 선택정렬 (Selection sort)

          (1) i=0;
          (2) i=n-1면 끝
          (3) i~n-1 중 최소값을 min에 저장
          (4) i항과 min항을 교환
          (5) i하나 증가 -> 2로~

     void select_sort (int a[], int n)
     {
          int min, minindex, i, j;

          for(i=0; i<n-1; i++)
          {
              minindex=i;
              min=a[i];
               for(j=i+1; j<n; j++)
               {
                    if(min>a[j])
                    {
                         min=a[j];
                         minindex=j;
                    }
               }
               a[minindex] = a[i];
               a[i] = min;
          }
     }

     # 배열 앞부분부터 차례로 정렬해 나간다.
     # 아직 정렬하지 않은 부분은 n의 변함이 없다.
     # 비교횟수 N^2/2정도, 교환횟수<=N (최악의 경우-역순일 때, 교환횟수=N)
     # 성능 O(N^2)
     # 안정성이 없다.
     # N<100에서 만족할 만한 속도~

--------------------------------------------------------------------------------

3) 삽입정렬 (Insertion sort)

     (1) i=1;
     (2) j=i;
     (3) a[j-1]>a[i], j>0인 동안
         a[j]=a[j-1]; j--;
     (4) a[j] = a[i];
     (5) i++, 2로~~ ( → i항 이하는 이미 정렬된 상태가 됨!!!)

     void insert_sort(int a[], int n)
     {
          int i, j, t;
          for(i=1; i<n; i++)
          {
               t=a[i];
               j=i;
               while(a[j-1]>t  && j>0)
               {
                    a[j]=a[j-1];
                    j--;
               }
               a[j]=t;
          }
     }

     # 삽입정렬은 입력자료에 민감
     # 이미 정렬된 배열일 경우 매우 빠름
     # 최악의 경우 : 역순!
     # 난수 배열인 경우 - 선택정렬보다 효율이 좋다
     # O(N^2)의 성능

--------------------------------------------------------------------------------

4) 거품정렬 (Bubble Sort)

     (1) i=0;
     (2) i=n-1되면 끝
     (3) j=1;
     (4) j=n-1면 7로
     (5) a[j-1]>a[j] 이면 두 값을 교환
     (6) j하나 증가 -> 4로
     (7) i증가, 2로!

     void bubble_sort(int a[], int n)
     {
          int i, j, t;
          for(i=0; i<n-1; i++)
         {
               for(j=1; j<n-1; j++)
               {
                    if(a[j-1]>a[j])
                    {
                         t=a[j-1];
                         a[j-1]=a[j];
                         a[j]=t;
                    }
               }
          }
     }

     # 최선의 경우 - 이미 정렬된 배열
     # 최악의 경우 - 역순!
    
--------------------------------------------------------------------------------

5) 쉘 정렬 ( Shell sort )
   -  h간격으로 떨어진 레코드를 삽입정렬 함

    (1)  h의 초기값을 구한다.
    (2)  h가 1보다 작으면 끝낸다
    (3) i=0;
    (4) i 가 h보다 크기가 같으면 7로 간다.
    (5) (h 간격+i)요소들에 대해서 삽입 정렬을 한다.
    (6) i를 하나 증가시키고 4로 간다.
    (7) h의 다음값을 구하고 2로 간다!

    void shell_sort (int a[], int n)
    {
        int i, j, k, h, v, j;
        for(h=0; i<h; i++)
        {
            for(j=i+h; j<n; j+=h)
            {
                v=a[j];
                k=j;

               while(k>h-1 && a[k-1]>v)
                {
                   a[k]=a[k-h];
                    k-=h;
                }
            a[k]=v;
        }
        }
    }

    # 안정성이 없다.
    # 입력자료의 형태에 상관없이 속도  good!!!
    # 최선의 경우 - 이미 정렬된것
    # 최악의 경우 - 난수 (하지만 그래도 빠른편!)
    # O(N(log N^2), O(N^1.25) 의 성능

--------------------------------------------------------------------------------

6) 분포수 세기 (Distribution counting)
        - 같은 키가 많이 있는 배열에 한해 적용할 수 있다.
        - 특정 키 값이 출현 하는 빈도를 저장하여 누적분포를 이용하여 간단하게 정렬

     (1) count[]배열을 O으로 초기화
     (2) a[] 배열의 키의 빈도를 계산하여 그 빈도를 count[]에 저장
     (3) count[]배열을 누적 분포로 변환
     (4) a[]배열을 뒤에서부터 읽어서 b[--count[a[i]]]에 저장

    coid dist_count (int a[], int n, int m)
    {
        int i; int *b, *count;
   
        b=(int*)malloc(sizeof(int)*n);
        count=(int*)malloc(sizeof(int)*(m+1));

        for(i=0; i<=m; i++) count[i]=0;
        for(i=0; i<n; i++) count[a[i]]++;
        for(i=2; i<=m; i++) count[i] = count[i-1] + count[i];
        for(i=n-1; i>=0; i--) b[--count[a[i]]] = a[i];
        for(i=0; i<n; i++) a[i]=b[i];
        free(b);
        free(count);
    }

--------------------------------------------------------------------------------


  


'Algorithm' 카테고리의 다른 글

CORBA, EJB, COM/DCOM  (0) 2008.12.05
ACID  (0) 2008.09.16
HDLC 프로토콜  (0) 2008.08.26
셀정렬  (1) 2008.08.23
삽입정렬  (0) 2008.08.23
Posted by 으랏차
,

HDLC 프로토콜

Algorithm 2008. 8. 26. 13:41

1.개요
  - IBM이 개발한 SDLC절차를 1974년 ISO가 채택하여 개발한 데이터링크 제어절차임
  - 임의의 비트열을 전송할수 있으므로 비트지향형 전송 제어절차
  - 신뢰성이 높은 성능 제공, 전송효율의 증대


 

2.기능
  1) 흐름제어 (flow control)
     - 송수신 양단간에 전송 데이터 블럭을 위해 버퍼를 두고 흐름을 제어함
     - 에러체크 없이 보낼수 있는 크기를 규정하여 버퍼크기를 조정


  2) 에러제어 (error control)
     - 데이터 전송간 에러의 검출 및 수정, 주로 순서제어
     - 순환 잉여코드(CRC)방식에 의해 에러를 체크하고
     - 에러 발생시 재전송(ARQ)을 한다


3. HDLC 프레밍구조
   - 프레임은 HDLC의 국 상호간에 주고 받는 정보의 기본전송단위로 데이터 링크 계층의 프로토콜

   - 시작플래그(8비트)+주소(8비트)+제어(8비트)+무제한(정보)+FCS(16비트)+ 종료플래그(8비트)
   - 비트 stuffing :  flag필드 이외에 1이 6개 이상연속되는것을 방지하기 위해 1비트가  5개

     연속될때 여섯번째에 0을 삽입, 수신측에서는 0을 제거하여 데이터의 투과성을 보장한다


   - flag필드 : HDLC 프레임의 시작과 끝을 알리는 start flag와 stop flag가 있음

   - address: 송신 시스템과 수신 시스템의 주소를 기록

   - control: 정보 전송프레임의 I형식, 링크의 감시제어용 S형식, 감시기능 확장용 U형식이 있음

   - information : 송수신 단말장치간 교환되는 사용자정보와 제어정보

   - FCS : 수신된 프레임에 전송오류의 발생 유무를 판단하는 부분으로 CRC방식 사용


4. 장점
   - 전송효율의 향상
   - 신뢰성 향상
   - 비트투과성


5. HDLC와 SDLC 비교
                                       HDLC                                SDLC
데이터 인코딩 방법    NRZ부호 사용                       NRZI부호 사용
망형태                     LOOP형태 접속규정 없음        LOOP형태 규정있음
확장모드                  제어부의 확장기능                 제어부의 확장기능없음
데이터링크 설정       SABM,SNRM사용설정            SNRM사용설정

'Algorithm' 카테고리의 다른 글

ACID  (0) 2008.09.16
Sort.. algorithm  (0) 2008.09.09
셀정렬  (1) 2008.08.23
삽입정렬  (0) 2008.08.23
스케쥴링  (0) 2008.08.19
Posted by 으랏차
,

셀정렬

Algorithm 2008. 8. 23. 00:49

셸 정렬(Shell sort)은 가장 오래된 정렬 알고리즘의 하나이다. 이름은 1959년 이 방법을 발표한 창안자 도널드 셸의 이름을 따서 붙여졌다. 셸 정렬은 개념을 이해하고 구현하기는 쉬우나 시간복잡도 분석은 조금 복잡하다.

셸 정렬은 다음과 같은 삽입 정렬의 성질을 이용, 보완한 삽입정렬의 일반화로 볼 수 있다.

  • 삽입 정렬은 입력되는 초기리스트가 "거의 정렬"되어 있을 경우 효율적이다.
  • 삽입 정렬은 한 번에 한 요소의 위치만 결정되기 때문에 비효율적이다.

셸 정렬은 주어진 자료 리스트를 특정 매개변수 값의 길이를 갖는 부파일(subfile)로 쪼개서, 각 부파일에서 정렬을 수행한다. 즉, 매개변수 값에 따라 부파일(Subfile)이 발생하며, 매개변수값을 줄이며 이 과정을 반복하고 결국 매개변수 값이 1이면 정렬은 완성된다.

셀정렬의 알고리즘은 아래와같다.

  1. 자료리스트를 2차원배열로 나열한다.
  2. 각 배열의 열들을 정렬한다.

[편집] 예제

[2 5 3 4 3 9 3 2 5 4 1 3]로 리스트가 주어졌을 때 이 리스트를 셸 정렬로 정렬해 보자.

1. 먼저 4열로 구성된 행열로 나열하여 열단위로 정렬한다.

2 5 3 4      2 4 1 2
3 9 3 2  ->  3 5 3 3
5 4 1 3      5 9 3 4

2. 정렬된 4열 행열을 2열 행열로 나열하여 마찬가지로 열단위로 정렬한다.

2 1      2 1
3 3      3 2
5 3  ->  4 3
4 2      5 3
5 3      5 3
9 4      9 4

3. 정렬된 2열 행열을 한 열단위로 나열해서 삽입 정렬한다. 여기서 장점은 자료가 멀리 이동될 필요가 없다는 것이다.

2 3 4 5 5 9 1 2 3 3 3 4  ->  1 2 2 3 3 3 3 4 4 5 5 9

[편집] 자바로 짠 원시코드

public static void shellSort(Comparable[] array)
   {
   //각 단계의 시작값
   int[] cols = {1,5,12,23,62,145,367,815,1968,4711,11969,27901,84801,
                 213331,543749,1355339,3501671,8810089,21521774,
                 58548857,157840433,410151271,1131376761,2147483647};
   int c;
   for (c=0; cols[c]<array.length/4; c++);
   //매개변수 값에대한 순환
   for (;c>=0; c--)
      {
      int step = cols[c];
      for (int i=step; i < array.length; i++)
         {
         Comparable m = array[i];
         int j;
         for (j=i; j>=step; j-=step)
            {
            if (isLastBigger(array[j-step],m))
               {
               break;
               }
            array[j] = array[j-step];
            }
         array[j] = m;
         }
      }
   }

'Algorithm' 카테고리의 다른 글

Sort.. algorithm  (0) 2008.09.09
HDLC 프로토콜  (0) 2008.08.26
삽입정렬  (0) 2008.08.23
스케쥴링  (0) 2008.08.19
선점,비선점 스케쥴링  (1) 2008.08.19
Posted by 으랏차
,

삽입정렬

Algorithm 2008. 8. 23. 00:47

삽입 정렬

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

삽입 정렬의 예.
삽입 정렬의 예.

삽입 정렬은 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입하므로써 정렬을 완성하는 알고리즘이다. 배열이 길어질수록 효율이 떨어지지만, 구현이 간단하다는 장점이 있다.

선택 정렬이나 거품 정렬과 같은 같은 O(n2) 알고리즘에 비교하여 빠르며, 안정 정렬이고 in-place 알고리즘이다.

목차

[숨기기]

[편집] 예제

다음의 주어진 리스트의 삽입정렬은 다음과같다.

31 25 12 22 11 // 가장 앞의 값 31부터 비교를 시작한다.
11 25 12 22 31 // 31은 최대값이므로 맨뒤에 위치
11 12 25 22 31 // 다음값 25는 12보다 크므로 교환
11 12 22 25 31 // 값 25는 22크고 31작으므로 값22와 교환


[편집] 소스코드

[편집] C example

void insertion_sort ( int *data, int n )
{
int i, j, remember;
  for ( i = 1; i < n; i++ )
  {
    remember = data[(j=i)];
    while ( --j >= 0 && remember < data[j] ) data[j+1] = data[j];
    data[j+1] = remember;
  }
}
/* 아래는 정렬되는 자료가 단순 데이터일 경우에 memcpy()로 자료를 밀어내는 예제 */
/* memcpy 는 자료를 당겨야하므로 비교를 역순으로 수행한다. */
/* memcpy 를 이용하면 위의 코드보다 25~30% 가량 빠르게 처리된다. */
void insertion_sort ( int *data, int n )
{
int i = n-2, j, remember;
  while ( i-- > 0 )  
  {
    remember = data[(j=i)];
    while ( ++j < n && remember > data[j] );
 
    if ( --j == i ) continue;
    memcpy ( data+i, data+i+1, sizeof(*data) * (j-i) );
    data[j] = remember;
  }
}

[편집] C++ example

void insert(const Element e,Element *list,int i)
{
   while(e.getKey()<list[i].getKey())
   {
      list[i+1]=list[i]
      i--;
   }
   list[i+1]=e;
}

[편집] JAVA example

/*
* insertion Sort의 오름차순 정렬은 배열을 순차적으로(1~n) 까지 검색함.
* arr[] 는 int[]라고 가정함.
*/
 
void insertionSort(int[] arr)
{
 
   for(int index = 1 ; index < arr.length ; i++){
 
      int temp = arr[index];
      int aux = index - 1;
 
      while( (aux >= 0) && ( arr[aux] > temp) ) {
 
         arr[aux+1] = arr[aux];
         aux--;
      }
      index[aux + 1] = temp;
 
}

[편집] Objective Caml example

let rec isort = function
        | [] -> []
        | h::t -> insert h (isort t)
and insert a = function
        | [] -> [a]
        | h::t when a<h -> [a] @ (h::t)
        | h::t -> [h] @ (insert a t);;

[편집] 복잡도

최악의 경우 i+1번의 비교를 하게되고 이때의 시간복잡도는  O(\sum_{n-1}^{i=1}{i+1})=O(n^2) 이 된다.

'Algorithm' 카테고리의 다른 글

HDLC 프로토콜  (0) 2008.08.26
셀정렬  (1) 2008.08.23
스케쥴링  (0) 2008.08.19
선점,비선점 스케쥴링  (1) 2008.08.19
병행프로세스와 상호배제  (0) 2008.08.19
Posted by 으랏차
,

스케쥴링

Algorithm 2008. 8. 19. 09:53

1. 스케줄링의 개요

* 스케줄링(Scheduling)은 프로세스가 생성되어 실행될 때 필요한 시스템의 여러 자원을 해당 프로세스에게 할당하는 작업을 의미한다.

* 프로세스가 생성되어 완료될 때까지 프로세스는 여러 종류의 스케줄링 과정을 거치게 된다.

* 스케줄링의 종류에는 장기 스케줄링, 중기 스케줄링, 단기 스케줄링이 있다.

[표]


>스케줄링과 문맥 교환이 무엇인지 개념을 파악하고, 스케줄링의 종류만 간단히 알자.

>잠깐만!

문맥 교환(Context Switching)

하나의 프로세스에서 다른 프로세스로 CPU가 할당되는 과정에서 발생디는 것으로 새로운 프로세스에 CPU를 할당하기 위해 현재 CPU가 할당된 프로세스의 상태 정보를 저장하고, 새로운 프로세스의 상태 정보를 설정한 후 CPU를 할당하여 실행되도록 하는 작업을 의미한다.


2. 스케줄링의 목적


>스케줄링의 목적과 성능 평가 기준을 묻는 문제가 자주 출제됨. 스케줄링은 CPU나 자원을 효율적으로 사용하기 위한 정책이란 것을 중심으로 알아둔다.


스케줄링은 CPU나 자원을 효율적으로 사용하기 위한 정책으로, 다음과 같은 목적을 가지고 있다.

* 공정성: 모든 프로세스에 공정하게 할당한다.

* 처리율(량) 증가: 단위 시간당 프로세스를 처리하는 비율(양)을 증가시킨다.

* CPU 이용률 증가: 프로세스 실행 과정에서 주기억장치를 액세스한다든지, 입ㆍ출력 명령 실행 등의 원인에 의해 발생할 수 있는 CPU의 낭비 시간을 줄이고, CPU가 순수하게 프로세스를 실행하는 데 사용되는 시간 비율을 증가시킨다.

* 우선순위제도: 우선순위가 높은 프로세스를 먼저 실행한다.

* 오버헤드 최소화: 오버헤드를 최소화한다.

* 응답 시간(Response Time, 반응 시간) 최소화: 작업을 지시하고, 반응하기 시작하는 시간을 최소화한다.

* 반환 시간(Turn Around Time) 최소화: 작업을 지시하고, 반응하기 시작하는 시간을 최소화한다.

* 대기 시간 최소화: 프로세스가 준비상태 큐에서 대기하는 시간을 최소화한다.

* 균형 있는 자원의 사용: 메모리, 입ㆍ출력장치 등의 자원을 균형 있게 사용한다.

* 무한 연기 회피: 자원을 사용하기 위해 무한정 연기되는 상태를 회피한다.


>우선순위

우선순위는 시스템에 의해 자동으로 또는 외부 사항에 의해 결정되기도 한다. 시간 제한, 기억장치 요구, 개방된 파일 수, 평균 입ㆍ출력 실행 시간 등을 이용한 내부적 우선순위와 작업을 지원하는 정책, 부서 등의 외부적 우선순위가 있다.


>잠깐만!

스케줄링의 성능 기준

스케줄링의 목적 중 CPU 이용률, 처리율, 반환 시간, 대기 시간, 응답 시간은 여러 종류의 스케줄링 성능을 비교하는 기준이 된다.


3. 프로세서 스케줄링(프로세스 스케줄링)의 기법

 

>선점, 비선점 스케줄링의 의미 파악하고 각 스케줄링의 종류도 알아두자.

 

비선점(Non-preemptive) 스케줄링

* 이미 할당된 CPU를 다른 프로세스가 강제로 빼앗아 사용할 수 없는 스케줄링 기법이다.

* 프로세스가 CPU를 할당받으면 해당 프로세스가 완료될 때까지 CPU를 사용한다.

* 모든 프로세스에 대한 요구를 공정하게 처리할 수 있다.

* 프로세스 응답 시간의 예측이 용이하며, 일괄 처리 방식에 적합하다.

* 중요한 작업(짧은 작업)이 중요하지 않은 작업(긴 작업)을 기다리는 경우가 발생할 수 있다.

* 비선점 스케줄링의 종류에는 FCFS, SJF, 우선순위, HRN, 기한부 등의 알고리즘이 있다.


선점(Preemptive) 스케줄링

* 하나의 프로세스가 CPU를 할당받아 실행하고 있을 때 우선순위가 높은 다른 프로세스가 CPU를 강제로 빼앗아 사용할 수 있는 스케줄링 기법이다.

* 우선순위가 높은 프로세스를 빠르게 처리할 수 있다.

* 주로 빠른 응답 시가늘 요구하는 대화식 시분할 시스템에 사용된다.

* 많은 오버헤드(Overhead)를 초래한다.

* 선점이 가능하도록 일정 시간 배당에 대한 인터럽트용 타이머 클럭(Clock)이 필요하다.

* 선점 스케줄링의 종류에는 Round Robin(RR), SRT, 선점 우선순위, 다단계 큐, 다단계 피드백 큐 등의 알고리즘이 있다.


>인터럽트용 타이머 클럭

하나의 시스템 내에서 동작하는 장치들을 감시하기 위해 주기적인 신호를 발생하는 것으로, 하나의 프로세스가 자원을 독점하지 못하도록 방지하기 위해 사용.

'Algorithm' 카테고리의 다른 글

셀정렬  (1) 2008.08.23
삽입정렬  (0) 2008.08.23
선점,비선점 스케쥴링  (1) 2008.08.19
병행프로세스와 상호배제  (0) 2008.08.19
주소지정방식  (0) 2008.08.19
Posted by 으랏차
,

선점 스케줄링에 해당하는 선점 우선순위, SRT, RR, 다단계 큐, 다단계 피드백 큐 알고리즘에 대하여 알아보자.


>선점 스케줄링은 대부분 비선점 스케줄링을 보완한 것이다.


1. 선점 우선순위

* 준비상태 큐의 프로세스들 중에서 우선순위가 가장 높은 프로세스에게 먼저 CPU를 할당하는 기법이다.

* 비선점 우선순위 기법을 선점 형태로 변경한 것으로, 준비상태 큐에 새로 들어온 프로세스의 순위가 높을 경우 현재의 프로세스를 보류하고 새로운 프로세스를 실행한다.


2. SRT(Shortest Remaining Time)

* 비선점 스케줄링인 SJF 기법을 선점 형태로 변경한 기법으로, 선점 SJF 기법이라고도 한다.

* 현재 실행중인 프로세스의 남은 시간과 준비상태 큐에 새로 도착한 프로세스의 실행 시간을 비교하여 가장 짧은 실행 시간을 요구하는 프로세스에게 CPU를 할당하는 기법으로, 시분할 시스템에 유용하다.

* 준비상태 큐에 있는 각 프로세스의 실행 시간을 추적하여 보유하고 있어야 하므로 오버헤드가 증가한다.


>SRT는 SJF를 변경한 것으로, 두 개의 알고리즘을 비교하는 문제가 출제됨.

SJF는 실행시간이 가장 짧은 프로세스.

SRT는 현재 실행중인 프로세스의 남아 있는 실행 시간과 새로운 프로세스의 실행 시간을 비교하여 짧은 것.


3. RR(Round Robin)

* 시분할 시스템(Time Sharing System)을 위해 고안된 방식으로, FCFS 알고리즘을 선점 형태로 변형한 기법이다.

* FCFS 기법과 같이 준비상태 큐에 먼저 들어온 프로세스가 먼저 CPU를 할당받지만 각 프로세스는 시간 할당량(Time Slice, Quantum) 동안만 실행한 후 실행이 완료되지 않으면 다음 프로세스에게 CPU를 넘겨주고 준비상태 큐의 가장 뒤로 배치된다.

* 할당되는 시간이 클 경우 FCFS 기법과 같아지고, 할당되는 시간이 작을 경우 문맥교환 및 오버헤드가 자주 발생한다.

* 할당되는 시간의 크기가 작으면 작은 프로세스들에게 유리하다.


>RR은 전반적인 내용을 묻는 문제가 출제됨. RR은 시간 할당량을 사용하는 데 할당된 시간이 클수록 FCFS와 같고, 할당되는 시간이 작을수록 문맥 교환과 오버헤드가 자주 발생된다.


예제]


4. 다단계 큐(MQ, Multi-level Queue)

* 프로세스를 특정 그룹으로 분류할 수 있을 경우 그룹에 따라 각기 다른 준비상태 큐를 사용하는 기법이다.

* 일반적으로 프로세스 우선순위에 따라 시스템 프로세스, 대화형 프로세스, 편집 프로세스, 일괄 처리 프로세스 등으로 나누어 준비상태 큐를 상위, 중위, 하위 단계로 배치한다.

[그림]


>다단계 큐와 다단계 피드백 큐의 차이점을 알아두자.


* 각 준비상태 큐는 독자적인 스케줄링을 가지고 있으므로 각 그룹의 특성에 따라 서로 다른 스케줄링 기법을 사용할 수 있다.

* 프로세스가 특정 그룹의 준비상태 큐에 들어갈 경우 다른 준비상태 큐로 이동할 수 없다.

* 하위 단계 준비상태 큐에 있는 프로세스를 실행하는 도중이라도 상위 단계 준비상태 큐에 프로세스가 들어오면 상위 단계 프로세스에게 CPU를 할당해야 한다.


5. 다단계 피드백 큐(MFQ, Multi-level Feedback Queue)

* 특정 그룹의 준비상태 큐에 들어간 프로세스가 다른 준비상태 큐로 이동할 수 없는 다단계 큐 기법을 준비상태 큐 사이를 이동할 수 있도록 개선한 기법이다.

* 각 준비상태 큐마다 시간 할당량을 부여하여 그 시간 동안 완료하지 못한 프로세스는 다음 단계의 준비상태 큐로 이동된다.

* 상위 단계 준비상태 큐일수록 우선순위가 높고, 시간 할당량이 적다.

* 요구하는 시간이 적은 프로세스, 입ㆍ출력 중심의 프로세스, 낮은 우선순위에서 너무 오래 기다린 프로세스를 기준으로 높은 우선순위를 할당한다.

* 하위 단계 준비상태 큐에 있는 프로세스를 실행하는 도중이라도 상위 단계 준비상태 큐에 프로세스가 들어오면 상위 단계 프로세스에게 CPU를 할당하며, 마지막 단계 큐에서는 작업이 완료될 때까지 RR 스케줄링 기법을 사용한다.



 

비선점 스케줄링에 해당하는 FCFS, SJF, HRN, 우선순위, 기한부 알고리즘에 대하여 알아보자.


>잠깐만!

비선점 스케줄링과 선점 스케줄링

다음과 같이 대응되는 표를 이용하여 각 알고리즘이 선점 기법인지 비선점 기법인지 정리하자.

[표]


1. FCFS(First Come First Service, 선입선출) = FIFO

* FCFS는 준비상태 큐(대기 큐, 준비 완료 리스트, 작업준비 큐, 스케줄링 큐)에 도착한 순서에 따라 차례로 CPU를 할당하는 기법으로, 가장 간단한 알고리즘이다.

* 먼저 도착한 것이 먼저 처리되어 공평성은 유지되지만 짧은 작업이 긴 작업을, 중요한 작업이 중요하지 않은 작업을 기다리게 된다.


예제]


>FCFS(FIFO)는 비선점 기법이며 준비상태 큐에 도착한 순서대로 할당을 받는다.


2. SJF(Shortest Job First, 단기 작업 우선)

* SJF는 준비상태 큐에서 기다리고 있는 프로세스들 중에서 실행 시간이 가장 짧은 프로세스에게 먼저 CPU를 할당하는 기법이다.

* 가장 적은 평균 대기 시간을 제공하는 최적 알고리즘이다.

* 실행 시간이 긴 프로세스는 실행 시간이 짧은 프로세스에게 할당 순위가 밀려 무한 연기 상태가 발생될 수 있다.


>SJF의 전반적인 특징, 평균 반환 시간을 계산하는 문제가 촐제됨.


예제1]

예제2]


3. HRN(Hightest Response-ratio Next)

* 실행 시간이 긴 프로세스에 불리한 SKF 기법을 보완하기 위한 것으로, 대기 시간과 서비스(실행) 시간을 이용하는 기법이다.

* 우선순위 계산 공식을 이용하여 서비스(실행) 시간이 짧은 프로세스나 대기 시간이 긴 프로세스에게 우선순위를 주어 CPU를 할당한다.

* 서비스 실행 시간이 짧거나 대기 시간이 긴 프로세스일 경우 우선순위가 높아진다.

* 우선순위를 계산하여 그 숫자가 가장 높은 것부터 낮은 순으로 우선순위가 부여된다.

* 우선순위 계산식

[수식]


>HRN에서는 의미, 우선순위를 계산하는 공식, 계산문제가 출제됨.


예제]


4. 기한부(Deadline)

* 프로세스에게 일정한 시간을 주어 그 시간 안에 프로세스를 완료하도록 하는 기법이다.

* 프로세스가 제한된 시간 안에 완료되지 않을 경우 제거되거나 처음부터 다시 실행해야 한다.

* 시스템은 프로세스에게 할당할 정확한 시간을 추정해야 하며, 이를 위해서 사용자는 시스템이 요구한 프로세스에 대해 정확한 정보를 제공해야 한다.

* 여러 프로세스들이 동시에 실행되면 스케줄링이 복잡해지며, 프로세스 실행 시 집중적으로 요구되는 자원 관리에 오버헤드가 발생한다.


5. 우선순위(Priority)

* 준비상태 큐에서 기다리는 각 프로세스마다 우선순위를 부여하여 그 중 가장 높은 프로세스에게 먼저 CPU를 할당하는 기법이다.

* 우선순위가 동일할 경우 FCFS 기법으로 CPU를 할당한다.

* 우선순위는 프로세스의 종류나 특성에 따라 다르게 부여될 수 있다.

* 가장 낮은 순위를 부여받은 프로세스는 무한 연기 또는 기아 상태(Starvation)가 발생할 수 있다.


>무한 연기/기아 상태

우선순위가 낮아 CPU 할당이 무한히 연기되는 상태를 무한 연기라 하고, 무한 연기 상태에서 결국 프로세스를 완료하지 못하는 상태를 기아 상태라 한다.


>잠깐만!

에이징(Aging) 기법

ㆍ시스템에서 특정 프로세스의 우선순위가 낮아 무한정 기다리게 되는 경우, 한번 양보하거나 기다린 시간에 비례하여 일정 시간이 지나면 우선순위를 한 단계씩 높여 가까운 시간 안에 자원을 할당받도록하는 기법이다.

ㆍ SJF나 우선순위 기법에서 발생할 수 있는 무한 연기 상태, 기아 상태를 예방할 수 있다.

 

'Algorithm' 카테고리의 다른 글

삽입정렬  (0) 2008.08.23
스케쥴링  (0) 2008.08.19
병행프로세스와 상호배제  (0) 2008.08.19
주소지정방식  (0) 2008.08.19
RISC 기본원리  (0) 2008.08.19
Posted by 으랏차
,

1. 병행 프로세스

병행 프로세스(Concurrent Process)는 두 개 이상의 프로세스들이 동시에 존재하며 실행 상태에 있는 것을 의미한다.

* 여러 프로세스들이 독립적으로 실행되는 것을 독립적 병행 프로세스, 서로 협력하며 동시에 실행되는 것을 협동적 병행 프로세스라고 한다.

* 병행 프로세스는 다중 처리 시스템이나 분산 처리 시스템에서 중요한 개념으로 사용된다.


2. 임계 구역

임계 구역(Critical Section)은 다중 프로그래밍 운영체제에서 여러 개의 프로세스가 공유하는 데이터 및 자원에 대하여 어느 한 시점에서는 하나의 프로세스만 자원 또는 데이터를 사용하도록 지정된 공유 자원(영역)을 의미한다.

* 임계 구역에는 하나의 프로세스만 접근할 수 있으며, 해당 프로세스가 자원을 반납한 후에만 다른 프로세스가 자원이나 데이터를 사용할 수 있다.

* 임계 구역은 특정 프로세스가 독점할 수 없다.

* 임계 구역의 자원이나 데이터는 여러 프로세스가 사용해야 하므로 임계 구역 내에서의 작업은 신속하게 이루어져야 한다.

* 프로세스가 임계 구역에 대한 진입을 요청하면 일정 시간 내에 진입을 허락해야 한다.

* 현재 임계 구역에서 실행되는 프로세스가 없다면 임계 구역 사용을 기다리고 있는 잔류 영역에 있는 프로세스의 사용을 허락해야 하며, 그 이외에 있는 프로세스는 임계 구역에 진입할 수 없다.


>임계 구역의 개념에 대한 문제 출제됨. 영문으로 Critical Section이라는 것을 기억할 것.

>공유 자원

공유 자원에는 CPU, 메모리, 디스크, 입ㆍ출력 장치, 버퍼 등이 있다.


3. 상호 배제 기법

상호 배제(Mutual Exclusion)는 특정 프로세스가 공유 자원을 사용하고 있을 경우 다른 프로세스가 해당 공유 자원을 사용하지 못하게 제어하는 기법을 의미한다.

* 여러 프로세스가 동시에 공유 자원을 사용할 때 각 프로세스가 번갈아가며 공유 자원을 사용하도록 하는 것으로, 임계 구역을 유지하는 기법이다.

* 상호 배제 기법을 구현하기 위한 방법에는 소프트웨어적 구현과 하드웨어적 구현이 있다.


>상호 배제 개념과 영문표기법을 기억할 것.


소프트웨어적 구현 방법

* 두 개의 프로세스 기준: 데커(Dekker) 알고리즘, 피터슨(Peterson) 알고리즘

* 여러 개의 프로세스 기준: Lamport의 빵집 알고리즘


>Lamport의 빵집 알고리즘

고객이 빵집에 들어갈 때 번호를 부여하여 순서대로 고객에게 빵을 제공하는 방법과 같이, 각 프로세스에게 번호를 부여하여 자원을 사용하도록 하는 방법.


하드웨어적 구현 방법

Test_And_Set 기법과 Swap 명령어 기법이 있다.


4. 동기화 기법

동기화 기법(Synchronization)은 두 개 이상의 프로세스를 한 시점에서는 동시에 처리할 수 없으므로 각 프로세스에 대한 처리 순서를 결정하는 것으로, 상호 배제의 한 형태이다.

* 동기화를 구현할 수 있는 방법에는 세마포어와 모니터가 있다.


>세마포어와 모니터를 묻는 구체적인 문제가 출제됨. 각각의 의미와 특징을 파악 할 것.


세마포어(Semaphore)

* 세마포어는 '신호기', '깃발'을 뜻하며, 각 프로세스에 제어 신호를 전달하여 순서대로 작업을 수행하도록 하는 기법이다.

* 세마포어는 다익스트라(E.J.Dijkstra)가 제안하였으며, P와 V라는 두 개의 연산에 의해서 동기화를 유지하고 상호 배제의 원리를 보장한다.

* S는 P와 V 연산으로만 접근 가능한 세마포어 변수로, 공유 자원의 개수를 나타내며 0과 1 혹은 0과 양의 값을 가질 수 있다.

[그림 및 설명]


모니터

* 모니터는 동기화를 구현하기 위한 특수 프로그램 기법으로 특정 공유 자원을 프로세스에게 할당하는 데 필요한 데이터와 이 데이터를 처리하는 프로시저로 구성된다.

* 자료 추상화와 정보 은폐 개념을 기초로 하며 공유 자원을 할당하기 위한 병행성 구조로 이루어져 있다.

* 모니터 내의 공유 자원을 사용하려면 프로세스는 반드시 모니터의 진입부를 호출해야 한다.

* 외부의 프로시저는 직접 액세스 할 수 없다.

* 모니터의 경계에서 상호 배제가 시행된다.

* 모니터에는 한순간에 하나의 프로세스만 진입하여 자원을 사용할 수 있다.

* 모니터에서는 Wait와 Signal 연산이 사용된다.

[그림]


>정보 은폐

모니터 내부의 프로시저와 데이터의 정보를 은폐시켜서 다른 외부의 프로시저가 접근하거나 변경하지 못하도록 하는 기법.

 

'Algorithm' 카테고리의 다른 글

스케쥴링  (0) 2008.08.19
선점,비선점 스케쥴링  (1) 2008.08.19
주소지정방식  (0) 2008.08.19
RISC 기본원리  (0) 2008.08.19
deadlock 4가지  (0) 2008.08.01
Posted by 으랏차
,

주소지정방식

Algorithm 2008. 8. 19. 09:30

C H A P T E R 4   ::: 주소 지정 방식 :::




공부할 내용
★ 주소 지정 방식 (addressing)
★ 세그먼트와 세그먼트 레지스터
★ 스택의 구현
★ 직접 주소 지정
★ 간접 주소 지정
★ 인덱싱
★ 인덱스 레지스터, 베이스 레지스터
★ 주소를 지정하는 일반적인 규칙
★ 코드세그먼트내에서의 주소 지정

기초적인 PC 주소 지정 방식
★ 기계어 명령이 사용하는 주소의 길이 = 16비트
   - 16비트를 사용하여 만들 수 있는 주소 = 0000H부터 FFFFH까지
      따라서, 메모리의 크기 <= 64K 바이트   (이는 지나친 제약임)
★ 더 나은 방법은?
   움직이는 팔을 가진 로보트가 있다고 하자.
   그 로보트의 팔은 64인치만큼 들락날락하며 움직일 수 있다고 하자.
   (1) 로보트가 방안의 어떤 곳에 고정되어 있는 경우
       그 팔은 64인치 이내의 거리에 있는 물건만을 잡을 수 있다.
   (2) 로보트가 방안을 돌아다닐 수 있다면 그 팔로 방안의
       어느 곳에 있는 물건도 잡을 수 있다.
  ★ 인텔 프로세서는 이런 방식으로 주소를 지정함.
인텔 프로세서의 주소 지정 방식
★ 어셈블리 언어 프로그램에 사용되는 주소
   = 세그먼트 주소 (segment address) + 오프셋(offset)
★ 세그먼트 주소 = 20 비트 크기  =>
   방안에서의 로보트의 위치에 해당
  오프셋 = 16비트 크기 => 로보트 팔에 해당
★ 실효 주소(effective address) : 바이트의 실제 주소
      = 세그먼트 주소 + 오프셋
   예) 세그먼트 주소가 50000H이고 오프셋이 62A3H라고 하자.
       실효 주소 = 50000H + 62A3H
                 = 562A3H
   예) 세그먼트 주소를 50000H로 고정한 상태에서 오프셋만을 변경
        시켜가면서 접근할 수 있는 바이트들은?
           실효주소의 범위 = 50000H ~ 5FFFFH (64K바이트 분량)
   예) 세그먼트 주소가 50000H일 때, 실효주소 8726BH번지의 자료를
        엑세스할 수 있나? no
        해결책: 8726BH가 64K바이트 이내에 들어오도록 세그먼트
               주소를 변경시켜야만 한다.

★ 하드웨어는 실효 주소를 계산하여 항상 20비트짜리 숫자로 만든다.
  즉, 실효 주소는 00000H ~ FFFFFH까지 될 수 있고,
  이제 1 메가바이트 크기의 메모리를 가질 수 있다.



세그먼트와 세그먼트 레지스터
★ 모든 프로그램은 세그먼트(segment) 단위로 나뉘어져야 한다.
   즉, 큰 프로그램을 작성할 때는 프로그램을 적당한 크기로
   나누어서 각 조각이 한 세그먼트에 들어갈 수 있도록 해야 한다. 
★  한 세그먼트의 최대 크기는 64K바이트이다.
★ 프로그램안에는 각 세그먼트의 시작 주소와 끝 주소를 어셈블러에게
  알려주는 특정 명령들이 있다.
★ 프로그램이 실행되는 동안에 프로세서는 각 세그먼트의
  세그먼트 주소를 CS, DS, ES 또는 SS라고 불리는 세그먼트 레지스터 
   (segment register)에 저장하여 두고 관리한다.

★ 한 프로그램이 가질 수 있는 세그먼트의 개수는 4개 이상일 수 있지
만 동시에 활성화될 수 있는 세그먼트의 개수는 4개뿐이다. 
  (이유: 프로세서에 들어있는 세그먼트 레지스터의 개수 = 4)
★ 4개의 표준 세그먼트
   (1) 코드 세그먼트(code segment)
       - 기계어 명령이 있는 곳
   (2) 데이터 세그먼트(data segment)
       - 자료가 저장되어 있는 곳
   (3) 엑스트라 세그먼트(extra segment)
       - 자료가 저장되는 곳 (필요시에 이 세그먼트를 둘 수 있음)
   (4) 스택 세그먼트(stack segment)
      - 스택이 있는 공간
★ 각 세그먼트의 주소가 저장되어 있는 레지스터
   CS: 코드 세그먼트의 주소
   DS: 데이터 세그먼트의 주소
   ES: 엑스트라 세그먼트의 주소
   SS: 스택 세그먼트의 주소
★ 모든 프로그램마다 4개의 표준 세그먼트가 있는가?
   아니다.
   - 모든 프로그램에는 최소한 (명령이 있을 곳인) 코드 세그먼트와
     스택 세그먼트가 있어야 한다.  (COM파일에는 스택이 없음)
   - 데이터 세그먼트와 엑스트라 세그먼트는 꼭 있을 필요는
     없으나 대부분의 프로그램에는 적어도 한 개의 데이터
     세그먼트가 있다.
세그먼트 레지스터의 용도
★프로그램에서의 주소 표시법
  [세그먼트 레지스터 이름] : [오프셋]

  예) 데이터 세그먼트의 시작점으로부터  6AH 바이트 떨어져 있는
      곳의 자료의 주소는?
        DS:6AH
   예) 엑스트라 세그먼트의 시작점으로부터 1A5H 떨어져 있는 곳의
       자료의 주소는?
       ES:1A5H

★ 프로그램이 실행될 때 프로세서는 오프셋을 해당 세그먼트 레지스터
의 값에 더하여 실효 주소를 얻는다.
   즉, 주속 DS:6AH라면, 프로세서는 6AH를 DS의 값에 더한다.
★ 각 세그먼트 레지스터에는 어떻게 해당 세그먼트의 시작주소가 저장
되는가?
   - 프로그램이 실행되기 전에 운영체제가 프로그램을 기억장치에
     로드(load)한다. 이 때에 프로그램의 각 세그먼트의 주소가 결정됨
   - CS, SS:운영체제가 초기화함.
     ES, DS: 프로그리머 자신이 (프로그램안에서) 초기화해야 함.

세그먼트 레지스터가 갖는 값
★ 세그먼트 레지스터에는 세그먼트 주소가 들어 있다.
  그렇다면, 16비트 크기의 레지스터에 20비트 크기의 세그먼트 주소가
어떻게 저장되는 것일까?
  해결책: 주소의 20비트 중에서 레지스터에는 최상위 16비트만을 저장
          남은 4비트는 모두 0으로 간주함.
   예) 운영체제가 코드 세그먼트를 217A0H번지에,
       스택 세그먼트를 1F8A0H에 로드하였다고 하자.
       이 때: CS 레지스터가 갖는 값 =  217AH이고
              SS 레지스터가 갖는 값 = 1F8AH가 된다.
★  프로그램의 각 세그먼트는 0H로 끝나는 주소에 자동적으로 load됨.
   (즉, 세그먼트는 항상 패러그래프 경계에 정돈된다.)
스택의 구현
★ SS(stack segment) 레지스터: 스택 세그먼트의 주소가 저장됨
     - 프로그램이 로드될 때 운영체제가 이 값을 설정해 준다.
★ SP(stack pointer) 레지스터: 스택의 탑의 오프셋이 저장됨
★ 스택 탑의 실효주소 = SS:SP
★ 스택에 저장되는 항목(entry)의 크기 = 16비트 (2바이트) 
★ SS 레지스터: 스택 영역의 가장 낮은 주소를 가리킨다.
   SP 레지스터의 초기값: 스택의 크기
   - 첫째 푸쉬 명령은 자료를 스택영역의 최상위 주소에 저장함
   - 그 다음 푸쉬 명령이 저장하는 자료는 그 다음 최상위 주소의
     엔트리에 저장된다.
   - SP 레지스터: 항상 자료가 마지막으로 저장된 곳을 가리킨다.
     (즉, 스택의 탑을 가리킨다.)
★ 스택은 최상위 주소로부터 시작하여 스택의 베이스를 향하여 아래
방향으로 자란다.
★ 일반적으로 한 항목이 푸쉬될 때는 아래와 같은 일이 이루어진다.
  1. SP는 다음의 빈 공간을 가리키기 위하여 그 값이 2 만큼 감소한다.
     (각 항목이 차지하는 공간은 2 바이트임을 잊지 말자.)
  2. 푸쉬할 항목이 SP가 가리키는 곳에 복사된다.
★ 자료가 팝될 때는 아래와 같은 일이 이루어진다.
  1. SP가 가리키는 곳의 항목이 적당한 다른 곳에 복사된다.
  2. 팝된 후에 스택의 탑에 있는 항목을 가리키기 위하여 SP는 그 값
     이 2만큼 증가된다.
★프로그램이 로드될 때, SP 레지스터는 첫째 항목이 저장될 장소보다
두 바이트 위에 있는 주소로 초기화된다. 첫째 푸쉬 명령은 SP를 2
감소시켜서 첫째 항목이 저장될 곳의 오프셋을 얻는다.


직접 주소 지정 방식
(1) 데이터 세그먼트안의 오프셋이 10AH인 곳을 지칭하려고 할 때
      DS:10AH
(2) 숫자대신 이름을 오프셋으로 사용 (고급언어의 변수에 해당)
   예) SUM이라는 이름이 데이터 세그먼트의 오프셋이 10AH인 곳을
      나타낸다고 하자.  이 곳을 참조할 때는
        DS:SUM
(3) 메모리 영역을 참조할 때, 그 주소가 데이터 세그먼트에 있으면
    세그먼트 레지스터의 이름을 생략할 수 있다.
       SUM
(4) 데이터가 다른 세그먼트에 있는 경우 (예. ES)
       ES:SUM
간접 주소 지정 방식
★ 오프셋이 레지스터에 저장되어 있는 경우
  예)  SI 레지스터의 값이 1000H라고 하자.
       MOV AX, SI  (1000H를 AX에 복사)
       MOV AX, [SI]  (오프셋 1000H에 저장된 자료를 AX에 복사)
★ 간접 주소 지정 방식에 사용될 수 있는 레지스터
   = SP, BP, BX, SI와 DI 임
★ 간접 주소 지정할 때, 대부분의 경우에 세그먼트 레지스터를 명시할
필요는 없다.
   (이유: 프로세서가 적당한 것을 이미 가정하고 있기 때문이다.)


  
   예) 데이터 세그먼트 내의 어떤 자료의 오프셋이 BX에 들어
       있다고 하자. 이 자료는 참조할 때는 다음과 같이 한다.
       [BX]
   예) BX의 값이 엑스트라 세그먼트 자료의 오프셋인 경우 
       ES:[BX]
[예외] 이 규칙을 따르지 않는 중요한 예외가 하나 있다.
      스트링을 MOV 하는 명령을 사용할 때, 프로세서는 DI 레지스터
      의 값이 엑스트라 세그먼트에 있는 오프셋임을 가정한다.


인덱싱(indexing)
★ 인덱싱: 1차원 배열 또는 2차원 배열과 같은 자료를 나타내는데 사용
★ 즉, 배열 전체에 이름을 1개 주고 배열 내의 각 항목(item)은
   첫째 자료 항목으로부터의 상대거리를 사용하여 참조함.
★ 베이스 주소(base address): 배열의 첫째 항목의 주소
예)  100개의 원소를 갖는 배열이 데이터 세그먼트에 있고, 그 원소들은
     연속된 100개의 바이트에 저장되어 있다고 하자. 각 원소는 한
     바이트를 차지한다. 배열의 이름은 LIST라고 하자.
     (1) 첫째 바이트를 엑세스할 때: LIST
     (2) 두번째 바이트를 엑세스할 때: LIST+1
★ 베이스 주소에 더해지는 수를 변위량(displacement)이라 함.
예) 100개의 워드로 구성된 배열 BIGLIST를 생각하여 보자. 각 워드가
    2바이트를 차지하므로 원소들의 변위량은 다음과 같이 된다.
    첫째 원소    ← BIGLIST
    둘째 원소    ← BIGLIST+2
    셋째 원소    ← BIGLIST+4
        
    100번째 원소   ← BIGLIST+198


인덱스 레지스터
★ 배열의 원소를 엑세스할 때 사용되는 변위량을 레지스터에 저장하여
두고 사용할 수 있음. 이 때 사용되는 레지스터를 인덱스 레지스터  
(index register)라고 한다.
★ 인덱스 레지스터로 사용될 수 있는 레지스터: SI, DI
예) 100바이트로 구성된 배열 LIST를 고려하여 보자. 프로그램이 이 배 
열의 원소를 처음부터 끝까지 순서대로 참조한다고 하자. 이 때 SI  
레지스터의 값을 0부터 99까지 변화시키면서 LIST[SI] 를 사용함.
★ LIST[SI]의 의미: SI에 들어 있는 값(value)을 LIST의 오프셋에    
더하여 얻은 주소에 있는 자료를 참조하라.


예) 100개의 워드로 된 배열 BIGLIST를 고려하여 보자. 인덱스를 주기
    위하여 DI 레지스터를 사용한다면
    - 원소를 엑세스할 때: BIGLIST[DI] 를 사용
    - 첫째 원소를 참조하려면 DI = 0
      둘째 원소를 참조하려면 DI = 2
      셋째 원소를 참조하려면 DI = 4
       .........
       n 번째 원소를 참조하려면 DI = (n-1)★ 2
★ 배열의 원소가 더블워드인 경우의 인덱스는 4의 배수이어야 하고,
  쿼드워드인 경우는 8의 배수이어야 한다. 어셈블리 언어를 사용할
  때는 프로그래머가 이를 직접 처리하여야 한다
   (고급언어에서와는 달리).
베이스 레지스터: BX 레지스터
★ 베이스 주소 역시 레지스터에 저장될 수 있다. 데이터 세그먼트에서
는  BX가, 스택에서는 BP가 이런 용도로 사용된다. 이 레지스터들은
  베이스 레지스터(base register)라고 불린다.
예) 배열 LIST는 다음과 같이 인덱스될 수 있다: LIST[DI]
    LIST의 오프셋을 BX 레지스터에 넣어 두었다면
           LIST[DI] <==> [BX][DI]
★ 베이스 주소를 레지스터에 넣어 두면 1개의 명령문을 사용하여 여러
개의 자료 구조를 액세스할 수 있다.
★ 더 복잡한 형식: TABLE[BX][DI]
  두 레지스터의 값이 자료 항목의 오프셋에 더해진다.
  예) BX에 20 들어 있고, DI에 4가 들어 있다면
      TABLE[BX][DI] <==> TABLE + 24 이다.
★ 이중 인덱싱(double-indexing)을 사용하여 얻는 점
  - 자료구조 안에서 베이스 주소를 설정할 수 있다는 것이다.
예) TABLE을 1바이트짜리 원소로 30행 100열짜리 테이블이라고 하자.
    - BX : 특정 행을 가리키도록 하자.
    - DI나 SI: 그 행의 원소를 인덱스할 수 있다.
    첫째 행: 0번째 바이트부터 99번째 바이트
    둘째 행: 100번째 바이트로부터 199번째 바이트
    18번째 행의 57번째 원소: BX = 1700, SI = 56를 저장한 후에
    아래와 같이 함
           TABLE[BX][SI] <==> TABLE + 1756
베이스 레지스터: BP 레지스터
★ 스택의 주소 지정: 대부분의 경우에 SS, SP 레지스터를 사용
     SS : 세그먼트 주소,   SP: 스택 탑의 오프셋
★ 가끔은 스택 내부에 있는 정보를 액세스할 필요가 있을 때도 있다.
   이 때는 BP 레지스터에 스택 내에서의 베이스 주소를 저장한다.
예) 프로시저 A가 프로시저 B를 호출할 때 스택을 통하여 어떤 정보를
    프로시저 B에게 전달한다고 하자.
     - 프로시저 B가 프로시저 A로부터 제어권을 넘겨받은 순간에
       스택 탑의 오프셋을 BP 레지스터에 저장하여 두면 나중에
       어떠한 정보가 스택에 푸쉬되어도 프로시저 A로부터 전달받은
       자료는 BP의 값을 베이스 주소로 하여 액세스할 수 있다.
예) 프로시저 A가 10개의 워드를 스택에 푸쉬하였다고 하자.
    - 프로시저 B의 실행이 시작되면, 프로시저 B가 가장 먼저 하는 일
      은 SP의 값을 BP에 복사함으로써 스택 탑의 오프셋을 저장함.
   - 프로시저 B는 언제라도 10개의 워드를 다음과 같이 엑세스함
     SS:BP
     SS:BP+2
     SS:BP+4
     .....
     SS:BP+18
★ BP가 베이스 주소로 사용되면 SS가 묵시적으로 가정됨.
   SS:BP+2    <==> BP+2

주소를 지정하는 일반적인 규칙
★ 직접 주소를 지정할 때
     TABLE
     TABLE[SI]
     TABLE[DI]+8
     TABLE[BX][SI]+8
★ 간접 주소를 지정할 때
   - SP, BP, BX, SI 또는 DI를 사용한다.
   - BP나 BX가 사용될 때는 SI나 DI가 인덱스로 사용된다.
     [BP]
     [SI]
     [BX][DI]
     [SI]+4
     [BP][DI]+4
★ 간접 방식이든 직접 방식이든 하나의 주소에는 2개 이상의 베이스
  레지스터가 사용될 수도 없고 2개 이상의 인덱스 레지스터가
  사용될 수도 없다.
★ 인덱스의 값을 지정할 때 어셈블러는 다음의 규칙을 따른다.
     인덱스의 값에는 특정 순서가 없다.
     레지스터의 이름은 대괄호에 싸여 있어야 한다.
  레지스터의 이름들과 한 개의 상수 변위량을 모두 하나의 대괄호
안에 넣어 사용할 수 있는데, 이 때 이들은 각각 + 부호로 분리되
어 있어야 한다.
  레지스터의 이름 앞에 상수 변위량을 쓸 수도 있는데 이 때는 이
두 값 사이에 + 부호가 있을 필요가 없다.

   예) TABLE[BX][SI]+8
       TABLE[BX+SI+8]
       TABLE[8+SI+BX]
       [BP][SI]+12
       12[BP][SI]
       12[BP+SI]


★ 아래의 패턴을 추천함
   (1) 직접 주소의 표현: 이름[베이스][인덱스]+상수
       예) TABLE[BX][SI]+8
   (2) 간접 주소의 표현: [베이스][인덱스]+상수
       예) [BP][DI]+8


코드 세그먼트 내에서의 주소 지정 방식
★ 코드 세그먼트로의 주소 지정:
   프로세서가 CS 레지스터와 IP 레지스터를 사용해 자동 해결
★ CS: 코드 세그먼트의 세그먼트 주소가 있음
   IP:바로 다음에 수행될 명령의 오프셋이 있음
★명령을 실행할 때마다 IP 는 그 다음 명령을 가리키도록 수정됨.
★ 다음에 실행될 명령이 분기 명령, 프로시저 호출 등이면
   프로세서는 IP 레지스터의 값을 그에 맞게 바꾼다.
★ 코드 세그먼트로의 주소 지정은 자동적으로 이루어지므로
   대부분의 경우에 CS 레지스터와 IP 레지스터의 값은 잊고 지내면 됨

'Algorithm' 카테고리의 다른 글

선점,비선점 스케쥴링  (1) 2008.08.19
병행프로세스와 상호배제  (0) 2008.08.19
RISC 기본원리  (0) 2008.08.19
deadlock 4가지  (0) 2008.08.01
B-, B+ Tree  (0) 2008.08.01
Posted by 으랏차
,