스레드 동기화란 무엇이며 왜 사용해야 할까?(+ 뮤텍스와 세마포어)

hoon·2023년 2월 14일
0

동기화 이슈

  • 동기화란 작업들 사이에 실행 시기를 마추는 것을 말한다.
  • 여러 스레드가 동일한 자원(데이터) 접근시 동기화 이슈가 발생하며 동일 자원을 여러 스레드가 동시 수정시, 각 스레드 결과에 영향을 준다.

동기화 이슈 해결방안

  • 상호배제(Mutual exclusion)
  • 스레드는 프로세스 모든 데이터를 접근 할 수 있으므로 여러 스레드가 변경하는 공유 변수에 대해 Exclusive Access가 필요하다.
  • 어느 한 스레드가 공유 변수를 갱신하는 동안 다른 스레드가 접근하지 못하도록 막아서 동기화 문제를 해결한다.

상호 배제(Mutual exclusion)

공유자원을 어느 시점에서 단 한 개의 프로세스만이 사용할 수 있도록 하며, 다른 프로세스가 공유자원에 대하여 접근하지 못하게 제어하는 기법으로, 여러 프로세스가 동시에 공유 자원을 사용할 때 각 프로세스가 번갈아 가며 공유 자원을 사용하도록 하는 것으로 임계 구역을 유지하는 기법이다.

공유자원

공유자원은 시스템안에서 각 프로세스, 스레드가 함께 접근할 수 있는 메모리, 파일, 데이터, 모니터 등의 자원이나 변수 등을 의미한다. 이 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 경쟁상태에서는 동시에 자원에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결괏값에 영향을 줄 수 있는 상태이다.

임계영역

임계영역은 둘 이상의 프로세스, 스레드가 공유자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역을 말한다. 임계 영역을 해결하기 위한 방법은 크게 뮤텍스, 세마포어, 모니터 세 가지가 있으며, 이 방법 모두 상호배제, 한정대기, 융통성 이라는 조건을 만족한다. 이 토대가 되는 매커니즘은 잠금(locking)이다. 예를들면, 화장실을 A라는 사람이 사용중일때 문을 잠가서(locking) A가 나오면 B가 화장실을 쓰는 방법이다.

  • 상호배제 : 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다.
  • 한정대기 : 특정 프로세스가 영원히 임계영역에 들어가지 못하면 안된다.
  • 융통성 : 한 프로세스가 다른 프로세스의 일을 방해하면 안된다.

뮤텍스(Mutex)

뮤텍스는 프로세스나 스레드가 공유자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠금을 해제하는 객체이다. 잠금이 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에 접근 할수 없다. 또한, 임계 구역에 하나의 스레드만 들어갈 수 있다. (화장실 열쇠의 개수가 하나라고 생각하자)

세마포어(Semaphore)

세마포어는 일반화된 뮤텍스로 간단한 정수 값과 두 가지 함수 wait 및 signal로 공유 자원에 대한 접근을 처리한다. wait()은 자신의 차레가 올때까지 기다리는 함수이며, signal()은 다음 프로세스로 순서를 넘겨주는 함수이다. 프로세스나 스레드가 공유자원에 접근하면 세마포어에서 wait() 작업을 수행하고 프로세스나 스레드가 공유 자원을 해제하면 세마포어에서 signal() 작업을 수행한다. 또한, 세마포어는 임계 구역에 여러 스레드가 들어갈 수 있다. counter를 두어서 동시에 자원에 접근할 수 있는 허용 가능한 스레드 수를 제어한다. (화장실 열쇠의 열쇠의 개수를 정할 수 있다)

모니터

모니터는 둘 이상의 스레드나 프로세스가 공유자원에 안전하게 접근할 수 있도록 공유자원을 숨기고 해당 접근에 인터페이스만 제공한다. 모니터는 모니터 큐를 통해 공유자원에 대한 작업들을 순차적으로 처리한다.

profile
프론트엔드 학습 과정을 기록하고 있습니다.

0개의 댓글