티스토리 뷰

동기화 문제

동기화 문제란 서로 다른 process/thread가 동일한 자원에 동시에 접근하여 엉뚱한 값을 읽거나 수정하는 문제이다.

 

  • 한 순간에 하나의 process/thread만 해당 자원에 접근하고 조작할 수 있도록 보장해야 한다. 다시 말해서 process/thread들이 동기화되도록 할 필요가 있다.

 


임계 영역

둘 이상의 process/thread가 동시에 동일한 자원에 접근하도록 하는 프로그램 코드 부분을 의미한다.

 

  • 임계 구역의 원자성을 보장하기 위해 임계구역으로 진입 허가를 요청하는 부분을 entry section이라고 하고, 임계 영역이 끝나고나면 exit section으로 퇴출하게 된다.

 


 

대표적인 동기화 방법으로 Mutex와 Semaphore가 있다.

 

Mutex

  • mutal exclusion
  • 공유자원에 접근할 수 있는 process/thread의 수를 1개로 제한한다. 임계영역을 보호하고, 경쟁상황을 방지하기 위해 mutex lock을 사용한다. 즉 process/thread는 임계영역에 들어가기 전에 반드시 lock을 획득해야 하고, 임계구역을 빠져나올 때 lcok을 반환해야 한다.

 


Semaphore

  • 공유 자원에 접근할 수 있는 process/thread의 개수가 2개 이상이 될 수 있다는 것이다.
  • semaphore 변수 S(세마포)에 동시에 접근 가능한 process/thread의 갯수를 저장한다.
  • S>0 임계 영역으로 들어갈 수 있고 들어가면 S 값을 1 감소시킨다.
  • S==0 다른 process/thread는 임계영역으로 접근할 수 없다.
  • 임계영역에서의 작업 끝나고 임계영역에서 exit하면서 S값을 1 증가시킨다.

 


# 요약

동기화문제를 해결하기 위해 mutex, semaphore 기법 등을 사용할 수 있다.

 

Mutex란 1개의 스레드만이 공유 자원에 접근할 수 있도록 하여, 경쟁 상황을 방지하는 기법이다. 공유 자원을 점유하는 thread가 lock을 걸면, 다른 thread는 unlock 상태가 될 때까지 해당 자원에 접근할 수 없다.

 

Semaphore란 S개의 thread만이 공유 자원에 접근할 수 있도록 제어하는 동기화 기법이다. Semaphore 기법에서는 정수형 변수 S(세마포) 값을 가용한 자원의 수로 초기화하고, 자원에 접근할 때는 S-- 연산을 수행하여 세마포 값을 감소시키고 자원을 방출할 떄는 S++ 연산을 수행하여 세마포 값을 증가시킨다. 이 때 세마포 값이 0이 되면 모든 자원이 사용 중임을 의미하고, 이후 자원을 사용하려는 프로세스는 세마포 값이 0보다 커질 때까지 block 된다.