오늘 하루에 집중하자
  • [CS] 공유 자원(Shared Resource)과 임계구역(Critical Section), 세마포어(Semaphore) - 추가예정
    2022년 12월 21일 11시 00분 28초에 업로드 된 글입니다.
    작성자: nickhealthy

     

    프로세스는 독립적으로 작업을 할 수도 있고, 공유된 자원을 가지고 공동 작업을 할 수도 있다. 하지만 여러 프로세스가 한정된 자원을 가지고 공동으로 작업할 때 발생할 수 있는 문제와 이를 해결할 수 있는 방법을 알아보고자 한다.

     

    공유 자원의 접근


    공유 자원(Shared Resource)은 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말한다. 공유 자원은 공동으로 이용되기 때문에 누가 언제 데이터를 읽거나 쓰느냐에 따라 그 결과가 달라질 수 있다. **따라서 프로세스들의 공유 자원 접근 순서를 정하여 예상치 못한 문제가 발생하지 않도록 해야 한다.**

     

    💡

    경쟁 조건(race condition)

    2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황을 의미한다.

    경쟁 조건이 발생하면 공유 자원 접근 순서에 따라 실행 결과가 달라질 수 있다.

     

    임계구역(Critical Section)

    공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역을 임계구역(Critical Section)이라고 한다.

    즉, 전역 변수나 메모리, 파일 등 한정된 자원을 가지고 각 프로세스가 어떤 작업을 수행하였을 때 접근 순서에 따라 실행 결과가 달라지는 구간을 의미한다.

    임계 구역(Critical Section)의 'Critical'은 '('앞으로의 상황에 영향을 미친다는 점에서) 대단히 중요한'이라는 뜻으로, 프로세스 실행 상황에서는 공유할 수 없는 자원이 중요한 자원이다. 예를 들어, 음식을 할 때 믹서기가 하나만 있다고 가정하면, 믹서기는 주방에서의 임계구역이다. 수프와 주스를 만들어야 하고 믹서기가 하나인데, 급하다고 쇠고기와 오렌지를 같이 갈아 넣으면 안된다.

     

    이처럼 임계구역에서는 프로세스들이 동시에 작업하면 안된다. 어떤 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역 밖에서 기다려야 하며, 임계구역의 프로세스가 나와야 들어갈 수 있다. 

     

    또한 임계구역은 소프트웨어 뿐 아니라 하드웨어 자원을 사용할 때도 적용되는 개념이다. 예를 들어 프린터 1대를 여러 명이 동시에 사용하는 경우 프린터는 임계구역이 된다. 프린터 1대를 가지고 여러명이서 작업을 하는데 만약 임계구역으로 지정하지 않고 공유해서 사용할 경우, 어떤 사람은 풍경 이미지를 출력하고 어떤 사람은 인물 이미지를 출력할 경우 두 개의 사진이 서로 뒤섞여 출력될 수도 있는 것이다. 이러한 문제를 피하기 위해 하드웨어 자원도 한번에 한 프로세스만 사용해야 한다.

     

    임계구역의 해결 조건

    다음의 세 가지 조건을 조건을 모두 만족해야 한다.

    • 상호 배제(mutual exclusion)
      • 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없다.
    • 한정 대기(bounded waiting)
      • 어떤 프로세스도 무한 대기(infinite postpone)하지 않아야 한다. 즉 특정 프로세스가 임계구역에 진입하지 못하면 안 된다.
      • 위의 믹서기 예시에서 한 요리사(process)가 믹서기(resource)를 계속 사용해서 다른 요리사가 믹서기를 계속 사용하지 못한 채 기다리면 안된다.
    • 진행의 융통성(progress flexibility)
      • 진행의 융통성은 한 프로세스가 다른 프로세스의 진행을 방해해서는 안 된다는 것을 의미한다.
      • 위의 믹서기 예시에서 요리사가 2명일 때(A, B) 요리사 B는 요리사 A의 작업 속도와 관계없이 믹서기가 비어 있으면 언제든 사용할 수 있어야 한다.

     

    임계 구역의 해결 방법

    임계구역 문제를 해결하는 단순한 방법은 잠금(lock)을 이용하는 것이다. 예를 들어 임계구역이 화장실(공유 자원)이라면 사용자(process)는 화장실 문을 잠그고 사용한 후(공유 자원 사용) 나올 때 잠금을 해제한다(공유 자원 반환). 그리고 기다리는 사람이 있다면 사용해도 좋다는 신호를 보낸다. 잠금 해제와 동시에 동기화 신호를 보내는 것이다. (상호 배제)

     

    예시들을 통해 임계 구역을 해결하는 방법에 대해 더 구체적으로 알아보자.

    우선 아래는 임계구역을 설명하기 위한 기본 코드이다. 은행 예금으로 예시를 든다.

     - boolean 변수는 ture와 false 값만 가질 수 있으므로 잠금(lock)을 표현하기에 적합하다. - 또한 여러 프로세스들이 사용할 공유 자원인 전역 변수 balance 정의

    #include <stdio.h>
    
    typedef enum {false, true} boonlean;
    extern boolean lock = false;
    extern int balance;
    
    int main() {
    	while (lock == true);
        lock = ture;
        balance += 10; /* 임계 구역 */
        lock = false;
    }

     

    임계구역은 한 순간에 한 프로세스만 접근할 수 있는 곳이다.

     

     

    댓글