반응형
임계 영역에 접근하는데 있어서 동기화를 위해 사용되는 기법인 스핀락, 뮤텍스, 세마포어에 대해서 알아보자.
locks 방식을 이용한 동기화 기법
- 스핀락(spinlock), 뮤텍스(mutex)
- 상호 배제가 되도록 만들어진 lock 변수 사용
- lock을 소유한 스레드만이 임계 영역에 진입할 수 있다.
- lock을 소유하지 않은 스레드는 대기한다.
wait-signal 방식을 이용한 동기화 기법
- 세마포어(semaphore)
- n개의 자원을 사용하려는 m개의 프로세스(또는 스레드)의 관리 제공
- 자원을 소유하지 못한 프로세스(또는 스레드)는 대기(wait)
- 자원의 사용을 마친 프로세스(또는 스레드)는 알림(signal)
스핀락(Spinlock)
- lock 변수
- true : lock을 잠근다, lock을 소유한다.
- false : lock을 연다, lock을 해제한다
- 연산
- lock 연산
- 임계 영역에 들어갈 때 실행되는 코드
- lock이 잠김 상태면, lock이 풀릴 때까지 무한 루프를 돌면서 lock이 해제될때까지 기다린다.
- lock이 연린 상태면, lock을 잠그고 임계 영역 실행
- unlock 연산
- 임계 영역을 나올 때 실행하는 코드
- lock을 열린 상태로 변경
- lock 연산
- lock을 얻을 때까지 계속해서 lock 변수를 확인하면서 기다리는 busy waiting 상태이다.
- busy waiting 상태에 있다는 것은 무한 루프를 돌면서 최대한 다른 프로세스(또는 스레드)에게 CPU를 양보하지 않는다는 것이다.
- 임계 영역의 실행 시간이 짧을 경우에는 효과적이다.
- 그렇지 않을 경우 lock을 기다리는 프로세스(또는 스레드)가 계속해서 CPU를 점유하고 있으므로 CPU를 쓸데없이 낭비하게 된다.
P(S) {
while (S <= 0); // 자원이 없다면 while 루프를 돌며 대기함.
S -= 1; // 자원을 획득함.
}
V(S) {
S += 1; // 자원을 해제
}
뮤텍스(Mutex)
- lock 변수
- true : lock을 잠근다, lock을 소유한다.
- false : lock을 연다, lock을 해제한다
- 대기 큐
- lock이 열리기를 기다리는 프로세스(또는 스레드) 큐
- 연산
- lock 연산(임계 영역의 entry 코드)
- unlock 연산(임계 영역의 exit 코드)
- 임계 영역에서의 실행 시간이 짧은 경우 비효율적이다.
- 1. 특정 프로세스(또는 스레드)가 임계 영역 접근 시 lock이 잠겨 있으면 대기 큐에서 대기시키고 context switching
- 2. lock이 풀리면 깨어난 후 context switching하여 CPU를 할당 받아 실행 재개
- 위와 같이 두 번의 context switching 시간이 발생한다.
세마포어(Semaphore)
- n개의 자원
- 자원을 할당받지 못한 스레드들을 위한 대기 큐
- counter 변수
- 사용 가능한 자원의 개수
- 정수형 전역 변수 : 자원의 개수(n)로 초기화
- P/V 연산
- P(wait) 연산 : 자원의 사용 허가를 받기 위해 자원 요청시 실행
- V(signal) 연산 : 자원 사용이 끝났음을 알리기 위해 자원 반환시 실행
P(S) {
if (S > 0)
S -= 1;
else
wait on the queue Q;
}
V(S) {
if (any processes waiting on Q)
wakeup one of them;
else
S += 1
}
References
- http://itnovice1.blogspot.com/2019/09/spin-lock.html
- https://yoongrammer.tistory.com/63
- https://www.youtube.com/playlist?list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN
- https://www.youtube.com/playlist?list=PLV1ll5ct6Gtz5fnKa6kwluZJw4Zz2XbqM
반응형
'CS > OS' 카테고리의 다른 글
[OS] 07. 메모리 관리 (0) | 2021.12.27 |
---|---|
[OS] 06. CPU 스케줄링 (0) | 2021.12.26 |
[OS] 공유 자원 접근 문제 (0) | 2021.12.22 |
[OS] 05. 프로세스 관리 (0) | 2021.12.21 |
[OS] 04. 프로그램의 구조와 실행 (0) | 2021.12.20 |
댓글