[운영체제] Process Synchronization(프로세스 동기화)

김성록·2023년 3월 21일
0

운영체제

목록 보기
10/14

Process Synchronization에 대해 설명해보세요.


프로세스 동기화

  • 프로세스가 서로 협력하여 공유 자원을 사용할 때, 경쟁 조건이 발생하면 공유 자원을 신뢰할 수 없게 만들 수 있다. 이를 방지하기 위해 프로세스들이 공유 자원에 접근하려고 할 때 프로세스들의 순서를 정하여 데이터의 일관성을 유지시키는 것이 프로세스 동기화이다.

  • Race Condition(경쟁 조건)
    : 여러 프로세스(또는 스레드)가 공유 자원에 동시에 접근할 때, 공유 자원에 대한 접근 순서에 따라 실행 결과가 달라질 수 있는 상황이다. 동시에 접근할 때 자료의 일관성을 해치는 결과가 나올 수 있다. 대표적으로 다음 세 상황에서 경쟁 조건이 발생할 수 있다.

    • 커널 모드로 수행 중 인터럽트가 발생하는 경우
      :커널 모드의 수행이 끝나기 전에는 인터럽트를 받지 않도록 하는 방법으로 문제를 해결한다.
    • 프로세스가 시스템 콜을 호출해서 커널 모드로 수행중인데 Context switch가 발생하는 경우
      : 커널 모드를 수행 중일 때에는 CPU가 선점 되지 않도록 하고, 커널 모드에서 유저 모드로 돌아갈 때 선점되는 방법으로 문제를 해결한다.
    • 멀티 프로세스에서 공유 메모리 내의 커널 데이터에 접근하는 경우
      : 커널 내부에 있는 각 공유 데이터에 접근할 때마다 그 데이터에 대해서만 lock/unlock 하는 방법으로 문제를 해결한다.
  • Critical Section(임계 구역)
    : 여러 프로세스(또는 스레드)가 자원을 공유하는 상황에서, 하나의 프로세스(스레드)만 접근할 수 있도록 제한해둔 코드 영역이다. 임계 구역에서 경쟁 조건이 발생할 수 있다. 임계 구역으로 인해 발생하는 문제(Critical Section Problem, CSP)들을 해결하기 위해 다음 조건들을 만족해야 한다.

    • Mutual Exclusion(상호 배제)
      : 이미 한 프로세스가 임계 구역에서 작업 중이면, 다른 모든 프로세스는 임계 구역에 진입하면 안 된다.
    • Progress(진행)
      : 임계 구역에서 작업 중인 프로세스가 없다면, 다른 프로세스가 진입할 수 있어야 한다.
    • Bounded Waiting(한정 대기)
      : 다른 프로세스의 기아를 방지하기 위해 임계 구역에 한 번 접근했던 프로세스는 다시 임계 구역에 접근할 때 제한을 두어야 한다.

임계 영역 문제 해결 방법

  • Mutex(Mutual Exclusion) Lock

    • 동시에 공유 자원에 접근하는 것을 막기 위해 임계 구역에 진입하는 프로세스는 acquire()함수를 통해 Lock을 획득하고, 임계 구역을 빠져나올 때 release() 함수를 통해 Lock을 반환함으로써 동시 접근을 방지한다.

    • available 이라는 변수는 Lock의 가용 여부를 나타낸다. Lock이 가용 상태이면 acquire()호출이 성공하고 Lock은 사용 불가 상태가 된다. 사용 불가 상태의 Lcok을 획득하려고 시도하는 프로세스는 Lock이 반환될 때까지 봉쇄된다.

    • 이러한 방식은 임계 구역에 들어가기 전에 Lock을 얻기 위해 acquire() 함수에서 무한 루프에 빠져 CPU cycle을 낭비하게 되는 Busy Waiting의 단점이 있다.

    • Mutex Lock 유형을 Spinlock이라고도 하는데, 이는 Lock을 사용할 수 있을 때까지 프로세스가 기다리면서 계속 회전하기 때문이다.

  • Semaphore(세마포어)

    • 세마포어는 Busy Waiting이 필요 없는 동기화 도구이며, 여러 프로세스나 스레드가 임계 구역에 진입할 수 있는 Signaling 메커니즘이다.

    • 사용 가능한 자원의 개수를 주로 S라는 변수로 나타내며, wait() 함수(P)와, signal() 함수(V)로만 접근 가능하다. 이 때, S값을 변경하는 연산은 반드시 원자적으로 수행되어야 한다.

    wait(S) {
      S--;
      if(S < 0){
      	add this process to S.L;
          block();
      }
    }
    signal(S) {
      S++;
      if(S <= 0){
      	remove a process P from S.L;
          wakeup(P);
         }
    }
    • L은 block된 프로세스들이 기다리는 Queue이다. Block을 수행하면 커널은 block을 호출한 프로세스를 중단시키고 해당 프로세스의 PCB를 Wait Queue에 넣어준다. Wakeup을 수행하면 block된 프로세스 P를 깨워서 이 프로세스의 PCB를 Ready Queue로 이동시킨다.

    • S가 0 이상의 정수값을 가질 경우 Counting Semaphore로 주로 자원의 개수를 세는 데 사용되며, 0과 1 값만 가질 경우 Binary Semaphore로 Mutex Lock과 동일한 역할을 한다.

    • 코딩하기가 힘들고 실수하기 쉬우며, 정확성을 입증하기 어렵다.

  • Moniter(모니터)

    • 세마포어의 단점을 보완하기 위한 High-level 동기화 구조이다. 공유 자원에 접근하기 위해서는 모니터의 내부 Procedure을 통해서만 접근할 수 있다.

    • 세마포어는 프로그래머가 직접 wait과 signal 함수를 통해 Lock을 이용하여 경쟁 조건을 해결하지만 모니터는 자체적인 기능으로 해결할 수 있어 Lock을 이용할 필요가 없다.

    • 모니터에 진입하지 못한 프로세스들은 모니터 큐에서 대기한다. 이 때, Condition Variable(조건 변수)을 사용하여 순서를 보장받는다. 조건 변수는 wait과 signal연산 만으로 접근 가능하며, 어떤 값을 가지진 않지만 자신의 큐에 프로세스를 매달아서 sleep 시키거나 큐에서 프로세스를 깨우는 역할을 한다.

profile
예비 개발자

0개의 댓글