SW 기반 솔루션
문제점
속도가 느림 구현 복잡 선점 발생 가능
여기까진 복습
ch6_part3 부터 시작
HW Instructions
Test-and-Set Instruction
Interrupt를 받지 않는 것을 보장 (Preemption 되지않는다)
Busy waiting
1. 자동으로 실행(Execution)
2. 전달받은 인자의 원본을 반환
3. 전달받은 인자의 값을 true로 set하고 return
한번에 수행 target의 현재값을 리턴하고, 값을 true로 변경
ME with TAS
ME : Mutual Exclusion TAS : Test And Set
lock 초기값 false → TAS의 리턴값은 false → CS진입
이후 lock값이 true로 변환 → Pi가 CS에서 일을 하는 동안, 다른 프로세스가 진입 → Pi의 lock값이 true이므로 while문에서 대기
Pi가 일을 끝내고 나오면서 lock값을 false로 변환
Solution using test_and_set() (TAS를 이용한 상호배제)
shared boolean variable lock : initialized to false
문제점 : 3개 이상의 프로세스에서는 Bounded Waiting 위배 가능
ME with TAS : N-process ME
Compare-and-Swap Instruction
HW Solution
장점
구현이 단순
단점
Busy Waiting(Bounded Waiting 위배)
Busy Waiting 문제 해결을 위한 ME 기법 : Semaphore(대부분의 OS에서 사용하는 기법)
Atomic Variables
atomic : 더 이상 쪼갤 수 없는 상태. uninterruptible
Mutex
자원 활용을 위한 key
Solution to Critical-section Problem Using Locks
acquire lock : lock값을 받음
사용후
release lock : lock 사용 해제
SpinLock
- 정수 변수
- 초기화, P(), V() 연산으로만 접근 가능
1.
위 연산들(초기화, P, V)은 atomic 연산
(OS 자원이며, 전체가 한 사이클에서 수행됨)
2.
P(),V() 연산들을 진행하는 동안, 선점 발생X
- Multiprocessor 시스템에서만 가능
1.
왜?(조사해서 공부하기)
Semaphore
- Dijkstra
- Busy Waiting 문제 해결
- 정수형 변수 S (Semaphore >= 0)
•
초기화, P(), V() 연산들
(spinlock과 유사)
•
P : 진입 전 검사
V : CS에서 나오면서 검사
•
S 하나에 Ready Queue 하나 할당
Semaphore Usage
Counting Semaphore
Binary Semaphore
초기화 연산
P(), V() 연산
P연산에서, 마지막 줄 코드가 Spinlock과는 달리, 레디큐에서 기다리게 된다(== 하드웨어의 도움을 받는다)







