본문 바로가기
CS/운영체제

프로세스 동기화

by minkang 2021. 7. 28.

동기화 (Synchronization)

두 개의 프로세스 A, B가 공유 메모리를 이용해 데이터를 주고받는데 A가 쓰면 B가 읽어 가야 된다.

하지만 동기화가 없을 경우 A가 쓰고 난 뒤인지 전인지 알 수 있는 방법이 없다.

따라서 프로세스 또는 스레드들이 수행되는 시점을 조절화는 것을 동기화라고 한다.

 

임계 영역 (Critical Section)

여러 프로세스가 데이터를 공유하며 수행될 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 부분

이러한 영역에는 동시에 공유 데이터에 접근하여 잘못된 결과를 만들 수 있기 때문에, 한 프로세스가 임계 영역을 수행할 때에는 다른 프로세스가 접근하지 못하도록 막아야 한다.

 

임계 영역 문제를 해결하기위한 3가지 조건

  • 상호 배제 (Mutual excultion)
    • 하나의 프로세스가 임계 영역에서 실행중이면 다른 프로세스들은 임계 영역에 접근할 수 없다.
  • 진행 (Progress)
    • 임계 영역에 들어간 프로세스가 없는 상태에서, 들어가려고 하는 프로세스가 여러 개 있다면 어느 것이 들어갈지를 적절히 결정해주어야 한다.
  • 한정 대기 (Bounded wating)
    • 다른 프로세스의 기아(Starvation)를 방지하기 위해, 한 번 임계 구역에 들어간 프로세스는 다음번 임계 영역에 들어갈 때 제한을 두어야 한다.

임계 영역의 동시 접근을 해결하기 위한 방법으로는 Lock, Semaphore, monitor 등이 있다.

 

 

Lock

하드웨어 기반 해결책으로서, 동시에 공유 자원에 접근하는 것을 막기 위해 임계 영역에 진입하는 프로세스는 Lock을 획득하고 임계영역에서 빠져나올 때, Lock을 방출함으로서 동시에 접근이 되지 않도록 막는다.한계점 : 다중처리기 환경에서 시간적 효율의 측면을 적용할 수 없다.

 

세마포어 (Semapoheres)

소프트웨어상에서 임계 영역 문제를 해결하기 위한 방법

 

세마포어의 종류

1) Binary semaphore

  • s가 0과 1 두 종류의 값만 갖는 경우
  • 상호배제나 프로세스 동기화의 목적으로 사용
  • Mutex라고도 불린다.

2) Counting semaphore

  • s가 0이상의 정수 값을 가질 수 있는 경우
  • Producer-Consumer 문제 등을 해결하기 위해 사용

임계 구역에 들어간 프로세스가 없는 상태에서, 들어가려고 하는 프로세스가 여러 개 있다면 어느 것이 들어갈지를 적절히 결정해주어야 한다.

 

세마포어 P,V 연산

P : 임계 영역에 들어가기 전에 수행 (프로세스 진입 여부를 자원의 개수(s)를 통해 결정)

V : 임계 영역에서 나올 때 수행 (자원 반납 알림, 대기 중인 프로세스를 깨우는 신호)

 

구현 방법

procedure P(S)   --> 최초 S값은 1임
    while S=0 do wait  --> S가 0면 1이 될때까지 기다려야 함
    S := S-1   --> S를 0로 만들어 다른 프로세스가 들어 오지 못하도록 함
end P

--- 임계 구역 ---

procedure V(S) --> 현재상태는 S가 0임
    S := S+1   --> S를 1로 원위치시켜 해제하는 과정
end V

이를 통해 한 프로세스가 P 혹은 V를 수행하고 있는 동안 프로세스가 인터럽트 당하지 않게 된다.

P와 V를 사용하여 임계 영역에 대한 상호 배제 구현이 가능하게 되었다.

 

예시

최초 S 값은 1이고, 현재 해당 구역을 수행할 프로세스 A, B가 있다고 가정하자

  1. 먼저 도착한 A가 P(S)를 실행하여 S를 0으로 만들고 임계구역에 들어감
  2. 그 뒤에 도착한 B가 P(S)를 실행하지만 S가 0이므로 대기 상태
  3. A가 임계구역 수행을 마치고 V(S)를 실행하면 S는 다시 1이 됨
  4. B는 이제 P(S)에서 while문을 빠져나올 수 있고, 임계구역으로 들어가 수행함

 

모니터

  • 동시 수행중인 프로세스 사이에서 추상 데이터 타입의 안전한 공유를 보장하기 위한 high-level 동기화 구조
  • 세마포어의 문제점으로 코딩하기 어려운 점과 정확성 입증이 어렵다는 점을 개선
  • 고급 언어의 설계 구조물로서, 개발자의 코드를 상호배제 하게끔 만든 추상화된 데이터 형태이다.
  • 공유자원에 접근하기 위한 키 획득과 자원 사용 후 해제를 모두 처리한다. (세마포어는 직접 키 해제와 공유자원 접근 처리가 필요하다. )

 

뮤텍스

  • 세마포어와 마찬가지로 병행 처리를 위한 동기화 기법 중 하나이다.
  • Mutual Exclusion 상호 배제의 약자이다.
  • 뮤텍스는 상태가 0,1로 이진 세마포어로 부르기도 함
  • 임계 영역에 들어갈 때 lock을 걸어 다른 프로세스(혹은 쓰레드)가 접근하지 못하도록 하고, 임계영역에서 나와 unlock을 한다.

 

세마포어와 뮤텍스의 차이

  • 세마포어는 공유 자원에 여러개의 프로세스(또는 스레드)가 접근할 수 있지만 뮤텍스는 오직 1개의 프로세스(또는 스레드)만 접근 가능하다
  • 세마포어는 뮤텍스로 변경 가능하지만 뮤텍스는 세마포어로 변경 불가능
  • 세마포어는 세마포어를 가지지 않는 프로세스도 세마포어를 해제할 수 있지만 뮤텍스는 뮤텍스를 소유한 프로세스만이 해제가능하다.

 

 

 

 

출처

https://velog.io/@conatuseus/OS-%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4%EC%99%80-%EB%AE%A4%ED%85%8D%EC%8A%A4

https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Operating%20System/Semaphore%20%26%20Mutex.md

'CS > 운영체제' 카테고리의 다른 글

메모리  (0) 2021.08.30
메모리 관리 전략, 페이징, 세그멘테이션  (0) 2021.08.19
교착상태 (DeadLock)  (0) 2021.07.27
CPU 스케줄링의 종류  (0) 2021.07.27
스케줄러  (0) 2021.07.24