동기화 문제를 해결하기 위해 뮤텍스(mutex), 세마포어(Semaphore) 기법 등을 사용할 수 있다.
뮤텍스와 세마포어를 설명하기 위해 알아야 할 용어는 동기화 문제와 임계영역이다.
동기화 문제란 무엇인가?
서로 다른 process나 thread가 메모리 영역을 공유하기 때문에 (여기서, process경우는 IPC 공유 메모리 방식을 이용하는 경우이다.) 여러 process나 thread가 동일한 자원에 동시에 접근하여 엉뚱한 값을 읽거나 수정하게 되는 문제를 말한다.
예시를 통해 알아보자.
count++를 CPU 입장에서 분해해보면 3개의 atomic operations으로 나뉜다.
- count 변수의 값을 가져온다.
- count 변수의 값을 1 증가시킨다.
- 변경된 count 값을 저장한다.
CPU는 atomic operation을 연산하게 된다. 따라서 count++을 하기 위해 3번의 연산을 하게 된다.
시분할 시스템으로 작동하는 multi process/multi thread 시스템에서, 두 개의 thread가 동일한 데이터인 count에 동시에 접근을 하여 조작을 하는 상황을 가정해보겠다. thread1에서도 count++를 하고, thread2에서도 count++를 한다면 그 실행 결과가 접근이 발생한 순서에 따라 달라질 수 있다. 이를 경쟁상황(race condition)이라고 합니다.
즉, 둘 이상의 thread가 동일한 자원에 접근하여 조작하고, 그 실행 결과가 접근이 발생한 순서에 따라 달라지는 경쟁상황에 의해서 동기화 문제가 발생할 수 있습니다. 경쟁 상황으로부터 보호하기 위해, 우리는 한 순간에 하나의 process/thread만 해당 자원에 접근하고 조작할 수 있도록 보장해야 합니다. 다시 말해서 process/thread들이 동기화되도록 할 필요가 있다.
임계영역이란?
임계영역(Critical Section)이란, 둘 이상의 process/thread가 동시에 동일한 자원에 접근하도록 하는 프로그램 코드 부분을 의미하여 동시에 접근해서는 안되는 공유자원의 코드 영역이다.
중요한 특징중 하나는, 한 process/thread가 자신의 임계구역에서 수행하는 동안에는 다른 process/thread들은 그들의 임계구역에 들어갈 수 없어야 한다는 사실이다. 즉, 임계영역 내의 코드는 원자적으로(atomically) 실행이 되어야 한다.
원자적으로 실행 되기 위해서 각각의 process/thread는 자신의 임계구역으로 진입하려면 진입 허가를 요청해야한다. 이 부분을 entry section이라고 하고, 진입이 허가되면 임계영역을 실행할 수 있다. 임계영역이 끝나고 나면 exit section으로 퇴출하게 된다.
임계영역의 원자성을 보장하여 process/thread들이 동기화되도록 할 수 있는데 이 방법이 바로 대표적으로 뮤텍스(Mutex)와 세마포어(Semaphore)인 것이다.
뮤텍스 (Mutex)
공유자원에 접근할 수 있는 process/thread의 수를 1개로 제한한다. 임계영역을 보호하고, 경쟁상황을 방지하기 위해 mutex lock을 사용한다. 즉 process/thread는 임계영역에 들어가기 전에 반드시 lock을 획득해야 하고, 임계구역을 빠져나올 때 lock을 반환해야 한다.
→ 접근 제어를 위해 lock과 unlock 사용
- lock: 현재 임계 구역에 들어갈 권한을 얻어옴
- unlock: 현재 임계 구역을 모두 사용했음을 알림
▷ 뮤텍스는 자원을 점유하고 있는 프로세스가 lock을 할 수 있는 권한을 가져서, 자원을 점유하기 시작할때 lock을 걸어버린다.
▷ lock을 가지고 있는 변수만이 unlock을 할 수 있고, 다른 프로세스들은 unlock 상태가 될때까지 기다렸다가 나중에 해당 공유 자원에 접근 가능하다.
세마포어 (Semaphore)
뮤텍스와 가장 큰 차이점은 공유 자원에 접근할 수 있는 process/thread의 개수가 2개 이상이 될 수 있다는 것이다.
세마포어 변수 S(세마포)에 동시에 접근 가능한 process/thread의 갯수를 저장한다. S가 0보다 크면 임계영역으로 들어갈 수 있고, 임계영역에 들어가면 S값을 1 감소시킨다. S값이 0이 되면 다른 process/thread는 임계영역으로 접근할 수 없다. 임계영역에서의 작업이 끝나고 임계영역에서 exit하면서 S값을 1 증가시킨다.
세마포어 값이 0,1만 가질 수 있는 경우 binary semaphore라고 하는데, 이는 뮤텍스랑 거의 유사하게 작동한다.
▷현재 공유 자원을 사용중인 대상뿐만 아니라 다른 프로세스 및 스레드도 unlock이 가능하다. (위에서 언급했듯이 뮤텍스는 lock을 가지고 있는 프로세스만이 unlock 가능하다.)
정리하자면...
세마포어는 카운터 변수값만큼 공유 자원에 해당 프로세스(또는 스레드)가 접근 가능하다.
뮤텍스는 오직 하나의 프로세스(또는 스레드)가 접근 가능하다.
세마포어는 현재 수행중인 프로세스가 아닌 다른 프로세스가 unlock이 가능하고
뮤텍스는 lock을 획득한 프로세스가 반드시 unlock을 해야 다른 프로세스가 접근 가능하다.
'CS 공부 > 운영체제' 카테고리의 다른 글
멀티 스레드(Multi Thread)란? (0) | 2023.08.14 |
---|---|
멀티 프로세스(Multi Process)와 시분할 시스템의 동시성(Concurrency) (0) | 2023.08.11 |
경쟁 상태(Race Condition)란 ? (0) | 2022.08.28 |
IPC(Inter Process Communication) (0) | 2022.08.07 |
PCB와 Context Switching (0) | 2022.07.31 |
댓글