[CS - 운영체제] 경쟁상태, 세마포어와 뮤텍스

Jo HangJoon·2022년 9월 29일
0

CS 공부

목록 보기
6/17

질문의 핵심

  • 경쟁 상태란?
  • 세마포어란?
  • 뮤텍스란?
  • 세마포어와 뮤텍스의 차이점은?
  • 모니터란?

1. 경쟁상태(Race Condition)

경쟁상태란?

공유 자원에 대해 여러 프로세스가 동시에 접근을 시도할 때, 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태.

공유 자원에 여러 프로세스가 동시에 접근하면 자료의 일관성을 해치는 결과가 나타날 수 있다.

  • 커널 코드 실행 중에 인터럽트가 발생할 경우 커널의 전역변수는 모든 프로세스의 공유물이므로 경쟁상태일 가능성이 있다. 커널모드에서 작업하는 동안에는 인터럽트를 disable시켜 인터럽트를 방지할 수 있다.
  • 프로세스가 시스템 콜을 하여 커널모드로 진입해서 작업을 수행하는 도중에 문맥 교환이 발생할 경우 다음 프로세스가 같은 데이터를 조작할 수 있다. 커널모드에서 작업하는 동안에는 시간이 초과되더라도 CPU 제어권을 선점할 수 있도록 해서 방지할 수 있다.
  • 멀티 프로세서에서 공유 메모리 내의 커널 데이터에 접근할 경우 여러 개의 cpu가 동시에 커널 내부의 공유 데이터에 접근할 수 있다. 커널 내부에 있는 공유 데이터에 접근할 때마다 그 데이터에 대해 lock/unlock함으로써 해결할 수 있다.
  • 멀티스레드 환경에서 두 개 이상의 스레드가 공통의 전역변수에 접근할 경우 경쟁상태가 발생할 수 있다.

2. 임계 영역(Critical Section)

  • 운영체제에서 여러 프로세스가 데이터를 공유하면서 수행될 때 각 프로세스에서 공유 자원에 접근하는 프로그램 코드 부분.
  • 공유 자원의 독점을 보장해줘야 하는 영역.

임계 영역 해결 조건

임계 영역을 해결하기 위한 충족 조건에 3가지가 있다.

  • 상호 배제(Mutual Exclusion): 어떤 프로세스가 임계 영역을 수행 중이면 다른 모든 프로세스들은 그 임계 영역에 들어가지 못하게 막는다.
  • 진행(Progress): 임계 영역에 들어간 프로세스가 있지 않은 상태에서 임계 영역에 들어가려는 프로세스가 있으면 들어가게 해준다. 임계 영역에 있는 프로세스 외에는 다른 프로세스가 임계 영역에 진입하는 것을 방해할 수 없다.
  • 유한 대기(Bounded Waiting): 기아 문제를 방지하기 위해 프로세스가 임계 영역에 들어가려고 요청한 후부터 다른 프로세스들이 임계 영역에 들어가는 횟수에 한계가 있어야 한다.

임계 영역 해결 방법

유저 모드 동기화

커널 코드가 실행되지 않는 동기화 기법. 피터슨 알고리즘(Pterson's Algorithm) 이 있다.

커널 모드 동기화

커널에서 제공하는 동기화 기능을 활용하는 방법. 각 프로세스들 안의 스레드들끼리의 동기화도 가능하다. 세마포어, 뮤텍스, 모니터 등의 방법이 있다.


3. 세마포어(Semaphore)

세마포어란?

  • 정수값을 갖는 변수이자 자원의 개수.
  • 동기화 기법 중 추상적인 방법.

세마포어는 여러 프로세스들에 의해 공유되는 변수 로 정의된다. 이 변수는 오직 waitsignal이라는 연산에 의해서만 접근이 가능하다.

  • wait: 세마포어의 수를 1 줄임. 0이 되면 lock.
  • signal: 세마포어의 수를 1 늘림.

세마포어(변수)의 개수에 따라 Counting SemaphoreBinary Semaphore로 나뉜다.

  • Counting Semaphore: 세마포어가 양의 정수값을 가짐. 설정한 값 이상의 스레드가 자원에 접근하면 lock이 실행됨.
  • Binary Semaphore: 세마포어가 1임. 뮤텍스처럼 사용됨.

세마포어 방식

Busy-Wait 방식

  • 자원이 모두 사용중이라면 프로세스가 wait하는 방식.
  • 자원에 여유가 생기면 자원을 획득, 자원을 모두 사용했다면 자원을 반납한다.
  • 자원을 다 사용하고 임계 영역에서 나온 프로세스는 signal 연산을 하기 전까지 Busy waiting을 한다.
    • Busy waiting: 임계 영역에 진입 시도를 반복하는 것.

Block-Wakeup 방식

  • 자원의 값을 감소시킨다. 자원의 개수가 부족하면 현재 프로세스를 wait 큐에 추가시킨 후, block().
  • 다른 프로세스가 작업을 완료하여 자원을 반납했을 때, 사용 가능한 자원의 수가 없다면 현재 자원을 기다리는 프로세스가 존재한다는 뜻이다. 따라서, wait 큐에서 프로세스를 꺼내와 wakeup 시킨다.
  • 임계 영역의 길이가 긴 경우에는 Block-Wakeup 방식이 유리하다.
  • 임계 영역의 길이가 짧은 경우에는 잦은 문맥 교환으로 인해 오버헤드가 증가하기 때문에 Busy-Wait 방식이 유리하다.

4. 뮤텍스(Mutex)

뮤텍스란?

  • 상호배제를 뜻하며, Binary Semaphore와 같은 의미이다.
  • 자원에 단 하나의 작업만이 접근할 수 있게 해준다.
  • 운영체제 커널에 의해 제공되어 무겁고 느리다.

프로세스가 소유할 수 있는 key를 기반으로 하는 방법이다. 이 key를 소유한 스레드/프로세스만이 공유자원에 접근할 수 있다. 뮤텍스를 사용하면 임계 영역에 진입할 때, lock을 걸어 다른 프로세스 혹은 스레드가 접근하지 못하도록 한다. 임계영역을 나오면 unlock을 건다.

세마포어와의 차이점

  • 세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 세마포어가 될 수 없다.
  • 뮤텍스는 동기화 대상이 1개일 때 사용하고, 세마포어는 동기화 대상이 여러개일 때 사용한다.
  • 뮤텍스는 자원을 소유할 수 있고 책임을 가지지만, 세마포어는 자원을 소유할 수 없다.
  • 뮤텍스는 자원을 소유하고 있는 스레드만이 뮤텍스를 해제할 수 있지만 세마포어는 자원을 소유하지 않는 스레드가 세마포어를 해제할 수 있다.

5. 모니터(Monitor)

모니터란?

  • 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스(프로시저)만을 제공한다. 프로시저가 호출되면 동기화하여 안전하게 공유 자원을 사용할 수 있도록 돕는다.
  • 한 번에 하나의 프로시저만 접근하여 사용 가능하다.
  • 프로세스가 세마포어의 signal 메커니즘을 자동으로 처리, 편리하게 뮤텍스 개념을 사용할 수 있도록 제공된다.
  • 동기화를 위해 구현된 기능 또는 모듈.

한 번에 하나의 프로세스만 모니터에서 활동하도록 보장해준다. 주로 고급언어, 프레임워크나 라이브러리에서 모니터를 지원한다. 하나의 데이터마다 하나의 모니터를 결합할 수 있으며, 모니터는 그것이 결합된 데이터가 동시에 두 개 이상의 스레드에 의해 접근할 수 없도록 막는 잠금 기능을 제공함으로써 동기화를 수행한다. 자바와 C#에서 스레드를 동기화하는 방법으로 모니터가 사용된다.


참조

0개의 댓글