여러 개의 프로세스가 동시에 실행할 수 있는 멀티 코어 시스템은 성능이 좋아지지만 동시에 프로세스 간의 공유 자원 접근 관리라는 문제가 생겼다.
즉, 공유 자원에 여러 프로세스나 스레드가 동시에 접근하면 문제가 발생하는데 이렇게 다수의 컴포넌트가 공유 중인 자원을 동시에 읽거나 수정할 때 생기는 문제를 동기화 문제라고 한다.
이런 문제는 스핀락 뮤텍스 세마포어를 통해 해결할 수 있다.
서로 알고 있는 정보를 일치시키는 것.
아이폰을 맥북에 동기화 시키면 아이폰의 정보를 맥북에서 알 수 있다.
ex) 카카오톡, 메시지, 전화
임계영역
프로세스 간의 공유 자원을 접근하는데 있어 문제가 발생하지 않도록 한 번에 하나의 프로세스만 이용하며 다른 프로세스들의 접근을 제한하는 영역이다.
임계 영역의 규칙
- 상호배제 : 하나의 프로세스가 임계 영역에 들어가 있다면 다른 프로세스는 들어갈 수 없어야 한다.
- 진행 : 들어가려는 프로세스가 여러 개라면 어느 것이 들어갈 것인지 결정해줘야 한다.
- 한정된 대기 : 다른 프로세스의 기아를 막기 위해 한 번 임계 영역에 들어간 프로세스는 다음번 임계 영역 접근에 제한이 생겨야 한다.
스핀락(Spinlock)
특정한 자원을 획득하거나 해제를 통해 공유 자원에 대한 접근 권한을 관리하는 방법이다.
권한을 획득하기 전까지는 CPU는 무의미한 코드를 수행하는 Busy Waiting 상태로 대기하다가 접근 권한을 얻게 되면 내부 코드를 수행하고 종료 후 권한을 해제한다.
상호배제 원칙에 따라 임계 영역에는 하나의 컴포넌트만 접근할 수 있다.
스핀락의 경우, 락의 획득과 해제는 동일한 주체(스레드)에서 이루어져야 한다.
뮤텍스(Mutex)
MUTual EXclusion으로 상호 배제라고도 한다.
스핀락과 같이 접근 권한을 획득할 때까지 Busy Waiting 상태에 머무르지 않는다.
접근 권한을 획득할 때 Sleep 상태로 들어가고 Wakeup 되면 권한을 획득을 시도한다.
뮤텍스의 경우 Locking 메커니즘으로 오직 하나의 스레드만이 동일 시점에 뮤텍스를 얻어 임계 영역에 접근할 수 있다.
락의 획득과 해제는 동일한 주체(스레드)에서 이루어져야 한다.
세마포어
스핀락과 뮤텍스와 다르게 특정 개수 이상의 스레드가 동시에 공유 자원에 접근할 수 있다.
세마포어는 정수 값으로 표현되며, 값의 증가(V 연산)와 감소(P 연산)를 통해 자원 접근을 제어한다.
컴포넌트가 특정 자원에 접근할 때 P 연산(semWait)이 먼저 호출되어 임계 영역에 들어갈 수 있는지 확인한다.
조건에 만족한다면 P 연산을 빠져나와 임계 영역에 들어가게 되고, 이후 V 연산(semSignal)이 호출되어 임계 영역을 빠져나온다.
semWait 연산 : 세마포어의 값을 감소시킵니다.
만약 값이 0 이하가 되면 semWait을 호출한 스레드는 블록이 되지만, 값이 0보다 크면 스레드는 작업을 계속 수행한다.
semSignal 연산 : 세마포어의 값을 증가시킵니다.
만약 값이 0 이하면 semWait 연산에 의해 블록된 스레드들 중 하나를 깨워 작업을 재개하게 한다.
뮤텍스와 세모포어의 차이점
세마포어는 여러 개의 스레드가 접근할 수 있지만 뮤텍스는 오직 1개의 스레드만 접근이 가능하다.
ex)
세마포어는 마치 대형주차장과 같다.
대형주차장 하나의 공간의 여러대의 차를 주차할 수 있기 때문에 대형 주차장을 생각할 수 있다.
뮤텍스는 가정집의 화장실과 같다.
오직 한 사람만이 화장실을 사용할 수 있고, 다른 사람이 사용 중일 때는 대기해야 하며 사용이 끝나야 다음 사람이 들어갈 수 있다.
그리고 세마포어는 현재 수행 중인 스레드가 아닌 다른 스레드가 세마포어 해제를 할 수 있지만
뮤텍스의 경우 획득하고 해제하는 주체가 동일해야 합니다.
'CS > 운영체제' 카테고리의 다른 글
교착상태(DeadLock) (0) | 2024.07.04 |
---|---|
TLB (0) | 2024.06.27 |
요구 페이징과 페이지 교체 알고리즘 (0) | 2024.06.23 |
페이징 (0) | 2024.06.23 |
가상 메모리와 주소 공간 (0) | 2024.06.18 |