Skip to content

Latest commit

 

History

History
35 lines (30 loc) · 2.97 KB

Synchronization.md

File metadata and controls

35 lines (30 loc) · 2.97 KB

동기화(Synchronization)

  • 레이스 컨디션 상황을 막기 위해 프로세스/스레드들에 하나의 자원에 대한 처리 권한을 주거나 순서를 조정해주는 기법이다.
  • 다중 스레드 환경에 공유되는 자원이 있다면 필수적으로 고려해야한다.
  • 프로세스의 경우 OS 레벨에서 공유 자원 문제를 처리해주지만 한 프로세스 내에서 실행되는 여러 개의 스레드들은 공유 자원에 대해 동기화 문제를 고려해야한다.
  • 스레드 동기화는 모니터(Monitor)와 세마포어(Semaphore)로 구성된다.
  • 사용하는 시스템이나 언어에서 어느쪽을 지원하는지에 따라 선택해서 사용한다.
    • Java는 기본적으로 모니터를 지원한다.
  • 스레드 동기화는 공유 자원에 접근하기 위해 자물쇠의 획득과 해제에 비용이 든다. 따라서 라이브러리를 별도로 만드는 편이다.
    • ex) Java의 StringBuffer, StringBuilder

모니터(Monitor)

  • 상호 배제 자물쇠(mutual exclusion lock)로 보호되는 루틴의 집합을 일컬음
  • 자물쇠를 획득하기 전까지 모니터에 속하는 루틴을 실행할 수 없다.
  • 즉 한 모니터에 한 스레드씩 실행되며, 다른 스레드들은 실행중인 스레드가 자물쇠를 놓아줄 때까지 기다려야한다.
  • 모니터에 속하는 스레드가 다른 이벤트 발생을 기다리기 위해 스스로 멈추면 다른 스레드가 모니터로 진입할 수 있다.
  • 대기중인 스레드가 이벤트가 발생했다는 연락을 받으면 스레드가 깨어나서 자물쇠를 재획득하게 된다.

세마포어(Semaphore)

  • 세마포어는 모니터와 비슷하지만 더 간단하다.
  • 공유 자원을 보호하기 위한 자물쇠만 있다.
  • 스레드에서 공유자원을 사용하기 위해 자물쇠를 획득해야한다.
  • 자물쇠를 쥐고 있는 스레드에서 놓아주기 전까지 그 자원을 획득하려는 스레드는 막히게된다.
  • 자물쇠를 놓아주는 순간 자물쇠를 획득하려고 대기하던 스레드가 그 자물쇠를 획득한다.
  • 가장 기본적인 방식의 세마포어를 상호 배제(mutual exclusion, 줄여서 뮤텍스 mutex라 부름) 세마포어라 한다.

모니터와 세마포어의 차이

  • 모니터가 자물쇠의 획득과 해제를 모두 자동으로 처리해줘서 쓰기에 간단하다.
  • 세마포어는 획득한 자물쇠를 해제하는 작업을 일일이 해줘야한다.

경쟁 상황(레이스 컨디션, Race Condition)

  • 공유 자원에 여러 프로세스/스레드가 동시에 접근하기 위해 경쟁하는 상태를 뜻한다.
    • ex) OS에서 CPU 점유율 등
  • 동기화 처리를 제대로 하지 않으면 의도하지 않은 잘못된 결과가 나올 수 있다.

전문