[임계영역(Critical Section)]
임계영역
공유 리소스에 대한 동시 엑세스는 예기치 않거나 잘못된 동작을 발생할 위험이 있다.
이렇게 공유 데이터를 접근하는 코드 부분을 임계영역이라고 한다.
임계영역을 충족하는 조건
- 상호 배제 : 프로세스 A가 ciritical section 부분을 수행 중이면 다른 모든 프로세스들이 사용하면 안된다.
- Progress : 임계영역을 사용하는 프로세스가 없다면 필요한 프로세스가 사용할 수 있도록 해야한다.
- 유한대기 : 프로세스가 임계영역에 들어가려고 요청한 후부터 그 요청이 허용되기까지 다른 프로세스들이 임계영역에 들어가는 횟수에는 한계가 있다.
[크리티컬 섹션의 독점 사용을 보장하는 매커니즘]
상호배제(Mutex)
쓰레드의 동시 접근을 허용하지 않는다.
임계영역에 들어가기 위해서는 뮤텍스를 가지고 있어야만 들어갈 수 있다. 👉 세마포어의 카운트가 1인 것과 유사하다.
세마포어(Semaphores)
접근 순서를 동기화 하는 것이다.
임계영역에 들어가기 전에 P연산을 통해 공유 데이터를 획득하고 자원을 다 사용하고 난 이후 놓아줄때 V연산을 통해 임계영역을 나온다.
임계영역에 접근하려 할 때, 이미 다른 프로세스가 사용중이라면 while문을 돌며 wait상태로 대기한다.
👉 busy wait == spin lock
(임계영역의 길이가 짧을 때 사용하는 것이 좋다.)
락을 얻지 못하여 자원을 기다리는 동안 해당 프로세스를 sleep 상태로 보낸다.
👉 bolock & wakeup == sleep lock
(임계영역의 길이가 긴 경우 사용하는 것이 좋다.)
(종류)
Counting sample
- P호출이 발생할 때마다 세마포어를 1씩 감소시킨다.
- V호출은 세마포어를 1씩 증가시켜 자원을 Pool로 반납하고 다른 쓰레드가 할당이 가능하도록 알린다.
Binary semaphore(=mutex)
- 0 또는 1 값만 갖을 수 있는 세마포어
[뮤텍스와 세마포어의 차이]
세마포어
일종의 카운터로 critical section에 프로세스가 동시에 N개 접근하여 사용할 수 있다.
- 카운터 값이 0과 1로만 제한된다면 Binary semaphore, 그 이상이면 Counting semaphore
P연산은 임계영역에 들어가기전에 수행된다. 👉 프로세스 진입 여부를 자원의 갯수를 통해 결정한다.
V연산은 임걔영역에서 나올때 수행된다. 👉 자원 반납을 알림, 대기 중인 프로세스를 깨우는 신호이다.
뮤텍스
임계영역을 갖고 있는 쓰레드들의 실행시간이 서로 겹치지 않고 단독적으로 실행되게 하는 기술이다.
해당 영역에 접근을 하기 위해 lock과 unlock을 사용한다.
(lcok)
- 현재 임계영역에 들어갈 권한을 얻는다.
- 만약 다른 프로세스가 임계영역을 사용중이라면 종료까지 대기한다. 👉 spin lock
(unlock)
- 현재 임계영역을 모두 사용했음을 알린다.
- 대기중인 프로세스가 임계영역에 진입할 수 있다.
사용되는 알고리즘은 데커(Dekker) 알고리즘, 피터슨(Peterson) 알고리즘, 제과점(Bakery) 알고리즘이 있다.
'운영체제' 카테고리의 다른 글
[OS]데드락이란? (1) | 2022.09.01 |
---|---|
[OS] 쓰레드와 멀티쓰레드 (0) | 2022.08.29 |
[OS]시스템구조 - 컴퓨터 계층구조 (0) | 2020.11.22 |
[OS]동기식/비동기식 (0) | 2020.11.21 |
[OS]인터럽트(Interrupt) (0) | 2020.11.17 |