쓰레드 동기화(Thread Synchronization) 한줄 정리

ssuda·2020년 1월 24일
0

임계구역 문제(Critical Section Problem)


  • Critical-Section
    • 여러 개의 쓰레드로 이루어져있는 Multi Thread System에서 여러 쓰레드에서 사용하는 공통 데이타 등을 바꾸는 Segment Of Code를 Critical Section이라고 한다.
      • Critical-Section에서 일어나는 Data Inconsistency를 Critical Section Problem이라고 한다.
  • Solution
    Critical Section Problem을 해결하기 위해서는 다음 세가지의 조건이 만족되어야 한다.
    - 상호배타 (Mutual Exclusion) : 공통 변수에 대한 Update는 상호배타적이어야 한다. 즉, 어느 한 시점에 한 Thread만이 Critical Section의 코드를 실행해야 한다.
    - 진행 (Progress) : 진입 결정은 유한 시간 내에 일어나야 한다.
    - 유한대기 (Bounding Waiting) : 어느 쓰레드라도 유한시간 내에 Critical Sectino에 들어갈 수 있어야 한다.

프로세스/쓰레드 동기화


프로세스 동기화의 목적은 임계구역 문제를 해결하고, 프로세스의 실행 순서를 원하는대로 제어하기 위함이다.

동기화 도구(Synchronization Tools)


  • Sychronization Tools
    • Semaphores
      • Monitors

세마포(Semaphores)


  • 세마포(Semaphores)
    • 동기화 문제 해결을 위한 소프트웨어 툴중 하나이다.
  • 내부 구조와 동작
    • 내부 구조는 정수형 변수와 두개의 동작(P,V)로 이루어져 있다.
      • P : test = acquire()
        정수 값을 1 감소시키고, 그 정수 값이 0보다 작으면 이를 호출한 Process(or Thread)를 Queue안에 넣고 Block한다.
      • V : increase = relase()
        정수 값을 1 증가시키고 만약 정수 값이 0보다 작거나 같으면 Queue내에 있는 한 프로세스를 깨운다.
  • 일반적인 사용1 : Mutual Exclusion
    semaphore의 초기값을 1 로 설정하고, Critical Section의 앞에는 semaphore.acquire() 뒤에는 semahpore.relaese()를 동작시킨다면, Critical Section에는 오직 하나의 Process만 들어갈 수 있다.
    +) semaphore의 초기값은 number of permit으로 생각하자. 즉, CS에 들어올 수 있는 process의 최대수이다.
  • 일반적인 사용2 : Ordering
    semaphore의 초기값을 0으로 설정하고, P1은 먼저 S1을 실행한 후에 semaphore.relase()를 하게 하고 P2는 semaphoere.acquire()을 한 후에 S2를 실행시킨다면, S1이 먼저 돈 뒤에 S2가 돌게 된다.

참고 영상


본 글은 다음 링크의 강의 영상을 정리한 것입니다.
운영체제:(10)프로세스 동기화-Youtube
운영체제:(11)임계구역 문제
운영체제:(12)세마포

profile
안녕하세요 코딩을 사랑하는 ssuda 입니다.

0개의 댓글