[운영체제] 프로세스 동기화

Benjamin·2022년 12월 28일
0

운영체제

목록 보기
2/3

데이터 일관성 문제 (Data Consistency Problem)

두 개 이상의 프로세스나 쓰레드가 데이터를 공유하는 환경에서 서로 교차적으로 데이터를 사용(use, access, reference, read-write, manipulate)할 때 발생하는 문제

Race Condition

공유 자원에 여러 프로세스나 스레드가 접근할 경우 접근 순서에 따라 결과가 달라지는 현상


프로세스 동기화

  • 정의 : 다중 프로세스 환경에서 자원에 데이터 일관성을 유지하도록 하는 것
  • 필요성 : 데이터에 동시 접근시 데이터 일관성이 깨지거나 결과가 잘못될 가능성이 있다.

임계 영역 (Critical Section)

동일한 자원에 동시에 접근하는 경우가 발생하는 코드 영역
접근 순서에 따라 실행 결과가 달라지는 구역

👉 Solution

  • Mutual Exclusion (상호배타)
    : 프로세스 P가 critical-Section 부분을 수행중이면 다른 모든 프로세스들은 그들의 critical-Section에 들어가면 안된다.
  • Progress (진행)
    : 아무도 critical-Section에 있지 않은 상태에서 critical-Section에 들어가고자 하는 프로세스가 있으면 critical-Section에 들어가게 해주어야 한다.
  • Bounded Waiting (유한 대기)
    : 프로세스가 critical-Section에 들어가려고 요청한 후부터 그 요청이 허용될 때까지 다른 프로세스들이 critical-Section에 들어가는 횟수에 한계가 있어야 한다.

-> 위 세 가지 모두를 만족해야 한다.


동기화 문제 해결방법

Lock

동기화 문제에 대한 가장 기본적인 해결 방법은 Lock 입니다.
특정 프로세스가 공유 자원에 접근 중일때는 다른 프로세스는 접근을 하지 못하도록 Lock을 걸어 해결합니다.

  • 임계 영역 진입 부분을 안전하게 처리
    • 임계 영역으로의 진입 가능성 확인과 진입을 원자적으로 처리
      - 경쟁 조건이 발생하지 않도록 함
      - 진입하게 되면 임계 영역을 잠금
    • 경쟁 조건이 발생하더라도 안전하게 처리
      - 복합적인 진입 조건 검사
      - 임계 영역 문제 해결을 위한 요구 조건 만족시킴
  • Lock 변수에 공동으로 접근하면 똑같이 임계 영역 진입에 대한 문제가 발생 할 수 있습니다.
  • 고전적인 소프트웨어 해결책 : 피터슨 알고리즘, 데커 알고리즘 - CPU가 여러개일때는 동작 안함
  • 임계 영역을 Lock으로 보호 (CPU, 하드웨어 수준에서 Lock을 건다)
    • Lock을 획득한 프로세스만 임계 영역으로 진입 허용
    • 잠겨져 있지 않으면 Lock을 잠그고 임계 영역에 진입

Semaphores

세마포어는 두 개의 원자적 함수로 조작되는 정수 변수이다.
여러 프로세스나 스레드가 Critical Section에 진입할 수 있는 Signaling 메커니즘이다.

P 연산은 공유 데이터를 획득하는 과정이고
V 연산은 반납하는 과정이다.

< Semaphores의 두가지 종류 >

  • Counting
    도메인이 0 이상인 임의의 정수값이다.
    주로 resource counting에 사용한다. : 사용가능한 자원의 개수

  • Binary semaphore
    0 또는 1 값만 가질 수 있는 semaphore이다.
    주로 mutual exclusion에 사용한다.

Monitor

이전의 세마포어의 문제점은 코딩하기가 힘들고 실수하기 쉬우며, 정확성을 입증하기가 어렵다. V(mutex)와 P(mutex)의 순서에 따라 Deadlock이 생기거나 Mutual Exclusion이 깨질 수 있기 때문이다. 이러한 단점을 보완할 수 있는 구조로 Monitor가 있다.

Monitor(모니터)는 동시 수행 중인 프로세스 사이에서 추상 데이터의 안전한 공유를 보장하기 위한 High-level 동기화 구조이다.
공유 데이터를 접근하기 위해서는 모니터의 내부 Procedure를 통해서만 접근할 수 있도록 한다.

세마포어와의 가장 큰 차이점은, 모니터는 락(Lock)을 걸 필요가 없다.
세마포어는 프로그래머가 직접 wait와 signal을 사용하여 Race condition을 해결해야 하지만 모니터는 자체적인 기능으로 해결할 수 있게 된다.


위 그림은 Race condition이 발생할 수 있는 경우의 예시이다. P1이 B와 C를 사용하고 있을 때 P2가 C에 접근한다면 Race condition이 발생할 수 있다.
우리는 이를 방지하기 위해 여러 알고리즘이나 세마포어 같은 도구들을 배웠고, 이를 사용하면 다음과 같이 작용한다.


반면, 모니터는 아래와 같이 이루어져있다.

모니터는 공유 데이터 구조, 공유 데이터에 대한 연산을 제공하는 프로시저(Procedure), 현재 호출된 프로시저간의 동기화를 캡슐화한 모듈(module)이다.
프로세스가 공유 데이터를 사용하기 위해서는 반드시 모니터 내의 Procedure를 통해야 한다. 그리고 동일한 시간엔 오직 한 프로세스나 스레드만 모니터에 들어갈 수 있다.

모니터에 진입하려고 했지만 내부에 프로세스가 들어가 있어 진입하지 못한 프로세스들은 모니터 큐(Monitor Queue)에서 기다린다. 프로세스가 모니터 내에서 기다릴 수 있게 하도록 조건 변수(Condition variable)가 사용된다.

조건 변수는 오직 wait와 signal 연산만으로 사용될 수 있다.
세마포어 변수와 유사하지만 변수가 어떤 값을 가지진 않고, 자신의 큐에 프로세스를 매달아서 sleep 시키거나 큐에서 프로세스를 깨우는 역할만 한다.

0개의 댓글