[운영체제] 동기화 기법

byeol·2023년 3월 25일
0

동기화를 위한 대표적인 도구를 배운다.

뮤텍스 락, 세마포, 모니터에 대해 알아보자


뮤텍스 락

탈의실 = 하나의 공유 자원
대기줄 사람들 = 프로세스

탈의실에 프로세스가 들어가면 문을 잠근다.
다음 번 사람은 문이 열렸는지 계속 확인한다.

뮤텍스 락은
동시에 접근해서는 안되는 자원에 동시에 접근하지 않도록 만드는 도구
상호 배제를 위한 동기화 도구

즉 크게

  • 전역변수 lock (잠기면 true 열리면 false)
  • acquire()
    • 프로세스가 임계구역 진입하기 전에 호출
    • lock이 true이면 반복적으로 false로 바뀌었는지 확인
    • true가 아니라면 true로 바꿔주고 임계 구역으로 가게됨
       acquire(){
        while(lock==true)
        ;
        lock=true;  
       }
  • release()
    • 임계 구역 작업이 끝나고 호출
    • lock을 false로 바꿔준다.
      release() {
        lock = false;
       }

하나의 프로세스는 아래와 같이 구성된다.

acquire()
//임계구역
release()

프로세스는 공유자원이 잠겨있는지 계속 확인해야 하는데 이와 같은 대기 방식을 "바쁜 대기(busy wait)"라고 한다.

세마포

= 뮤텍스 락 + 하나의 공유 자원에서 여러 개의 공유 자원
= 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 조금 더 일반화된 방식의 동기화 도구

상호 배제를 위한 세마포

세마포가 어떻게 구현되는지 간략하게 살펴보자

  • 전역 변수 S
    = 임계 구역에 진입할 수 있는 프로세스의 개수
    = 사용 가능한 공유 자원의 개수
  • wait()
    • 임계 구역에 들어가도 좋은지, 기다려야 하는지 알려주는
      1. 만일 임계 구역에 진입할 수 있는 프로세스의 개수 즉 S가 0이하라면
      1. 사용할 수 있는 자원이 있는지 반복적으로 확인
      1. 임계 구역에 진입할 수 있는 S가 1 이상이면 S를 1 감소시키고 진입
      wait(){
        while(S <= 0)
        ;
        S--;
      }
  • signal()
    • 임계 구역 앞에서 기다리는 프로세스에게 들어가도 좋다는 신호를 보내는
    • 임계 구역에서의 작업을 마친뒤 S +1
      signal(){
        S++;
      }

하나의 프로세스는 아래와 같다.

wait()
//임계구역
signal()

그러나 뮤텍스 락과 마찬가지로 바쁜 대기가 발생한다.

따라서 실제로 세마포는 더 좋은 방법을 사용한다.

다른 더 좋은 방법의 세마포

앞서 발생하는 바쁜 대기를 해결

  • wait()
    • 사용할 수 있는 자원이 없는 경우 해당 프로세스 상태를 대기 상태로
    • 그 프로세스의 PCB를 세마포를 위한 대기 큐에 집어 넣는다
     wait() {
     S--;
     if(S<0){
       add this process to Queue;
       sleep();
      }   
     }
  • signal()
    • 대기 큐에 있는 프로세스 p를 제거
    • 프로세스 p를 대기상태에서 준비상태로
        signal(){
          S++;
          if(S<=0){
            remove a process p from Queue
            wakeup(p)
          }
        }

실행 순서 제어를 위한 세마포

  • 먼저 실행할 프로세스

    
    // 임계구역
    signal()
  • 나중에 실행할 프로세스

     wait()
     //임계구역
    

모니터

세마포 앞 뒤로 wait()와 signal() 불편하다
wait()와 signal()의 순서를 헷갈리거나 중복해서 사용하거나 혹은 아예 빠트리는 경우가 생길 수 있음

사용자가 사용하기에 훨씬 쉬운 도구인 모니터
모니터란

공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리한다. 그리고 반드시 프로세스는 인터페이스를 통해서만 공유 자원 접근 가능

상호 배제를 위한 모니터

공유 자원을 다루는 인터페이스에 접근하기 위한 큐를 만들고, 모니터 안에 항상 하나의 프로세스만 들어오도록 상호 배제를 위한 동기화 기법

실행 순서 제어를 위한 모니터

조건 변수를 사용한다.

조건 변수란
프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수

조건변수는 wait와 signal 연산을 수행한다.

모니터에 접근한 어떤 프로세스가 조건 x에 대한 wait를 호출하면
조건 변수 x에 대한 큐에 그 프로세스가 산입된다.

빈 모니터에 다음 프로세스가 들어온다.

다른 프로세스의 signal 연산을 통해서 큐에 대기된 프로세스는 실행이 재개된다.

profile
꾸준하게 Ready, Set, Go!

0개의 댓글