OS - 프로세스 동기화

최정훈·2024년 11월 5일

동기화

  • 동시다발적으로 실행되는 프로세스들은 서로 협력하며 영향을 주고받는다. 이 과정에서 공유자원의 일관성을 보장해야한다.(동기화를 고려해야한다.)
  • 프로세스의 동기화
    • 사전적인 의미는 프로세스들의 수행시기를 맞추는 것
    • ‘실행 순서 제어’를 통해 프로세스를 올바른 순서대로 실행한다
    • ‘상호 배제’를 통해 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하도록 한다

실행 순서 제어를 통한 동기화 예시

  • ex) Reader Writer Problem Reader - 값을 읽어들이는 프로세스 Writer - 값을 저장하는 프로세스 이들을 정해진 순서대로 실행되어야 한다. (Writer프로세스가 끝나고 Reader프로세스가 실행되어야 함)


상호 배제를 위한 동기화 예시

  • ex) Bank Account Problem 공유가 불가능한 자원의 동시 사용을 피하기 위한 동기화 계좌에 10만원이라는 잔액이 있을 때, 프로세스A는 2만원을 입금하는 프로세스이고, 프로세스B는 5만원을 입금하는 프로세스라고 가정할 때 A, B를 동시에 실행시켜도 17만원이라는 기댓값이 나오지 않을 수 있다. 만약 둘 중 하나의 프로세스가 완전히 종료되기 전에 문맥교환(Context Swithcing)이 발생하면 공유되어야 하는 ‘잔액’이라는 자원에 동시에 접근하기 때문에 이와 같은 일이 일어날 수 있다.
  • ex) Producer & Consumer Problem 물건을 계속 생산하는 Producer, 물건을 계속 소비하는 Consumer ‘물건의 총합’이라는 공유되는 자원이 있다고 가정 이 상태에서 Producer와 Consumer를 각각 10번 실행시킨다면 이상적인 기댓값을 0이다. 하지만, 항상 그렇다고 보장할 수 없다. 마찬가지로 공유되서는 안되는 자원에 동시에 접근했기 때문에 발생한 문제


공유자원과 임계구역

  • 공유자원 - 여러 프로세스 혹은 스레드가 공유하는 자원

    • 전역변수, 파일, 입출력장치, 보조기억장치 등등
  • 임계구역 - 동시에 실행되면 문제가 발생하는 자원이 포함된 코드영역

    • 앞선 예시에서의 잔액, 물건 총 합
    • 한 프로세스가 임계 구역에 진입하고자 하면, 진입한 프로세스 이외의 다른 프로세스들은 대기해야한다.
    • 만약, 대기하지 않고 임계 구역에 동시에 접근하게 되면 자원의 일관성이 깨질 수 있는데, 이를 Race Condition이라고 한다.

  • OS가 Race Condition을 해결하는 세 가지 원칙

    • 상호배재(Mutual Exclusive) - 한 프로세스가 임계구역에 진입했다면, 다른 프로세스는 들어올 수 없다.
    • 진행(Progress) - 임계 구역에 어떠한 프로세스도 진입하지 않았다면, 진입을 희망하는 프로세스는 바로 들어갈 수 있어야 한다.
    • 유한 대기(Bounder Waiting) - 한 프로세스가 임계 구역에 진입하고자 대기하는 중이라면, 언젠가는 임계 구역에 진입할 수 있어야 한다. 임계 구역에 진입하기 위해서 무한정 대기해서는 안된다.

프로세스 동기화 기법

  • 뮤텍스 락(Mutex Lock) 상호 배제를 위한 자물쇠 역할 임계 구역 전, 후로 acquire, release진행
    • acquire - 프로세스가 임계 구역에 진입하기 전에 확인. 잠겨있다면 열릴 때까지 대기한다. 이렇게 대기하는 상태를 바쁜 상태(busy waiting)이라고 한다.
    • release - 임계 구역에서의 작업이 끝나고 호출. 현재 임계구역이 잠겨있다면 연다.

  • 세마포 좀 더 일반화된 방식의 동기화 도구 공유 자원이 여러 개 있는 경우에도 적용가능 임계 구역에 진입하기 전에 멈춤 신호를 받으면 잠시 대기 임계구역 앞뒤로 wait, signal진행
    • wait - 임계 구역에 들어가도 되는지 알려주는 함수, 카운팅하고 있는 공유자원을 -1

    • signal - 임계 구역 앞에서 대기하는 프로세스에게 가도 된다고 신호를 주는 함수, 카운팅하고 있는 공유자원 +1

      busy waiting를 해결하기 위해서, 사용할 수 있는 자원이 없을 경우에 대기상태로 전환(해당 프로세스의 PCB를 대기 큐에 삽입). 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비상태로 만듦(해당 프로세스의 PCB를 대기 큐에서 꺼내서 준비 큐에 삽입)

      세마포는 실행순서도 보장해준다

    • 공유자원을 0으로 설정하고, 먼저 실행할 프로세스 뒤에 signal, 다음 실행할 프로세스 앞에 wait

    • 이렇게 되면 나중에 실행되야하는 프로세스는 wait상태로 대기할 것이고, 먼저 실행되어야하는 프로세스가 signal을 호출해서 공유자원의 값이 다시 0이 되면 실행이 가능해진다.

  • 모니터 사용자가 다루기에 편한 동기화 도구 상호배제를 위한 동기화와 순서를 위한 동기화 모두 제공 조건변수(condition variable)사용
profile
게임개발자(희망)의 공부일지

0개의 댓글