Synchronization with Hardware Support
다음과 같은 방법이 있다.
- interrupt disabling : disable/enable INT
- test-and-set : Intel에서 제공
- swap : ARM에서 제공
Interrupt Disabling
Critical section에서 disable INT (interrupt)를 해서 race condition이 일어나지 않게 한다.
CPU가 1개라면 race condition은 스케줄링에 의해 발생한다.
Critical section의 값이 바뀌기 전에 스케줄링이 일어나서 발생하는 것이다.
그리고 스케줄링은 대부분 timmer interrupt에 의해 발생한다.
따라서 critical section에서 disable INT (interrupt)를 함으로써 스케줄링을 일어나지 않게 하여 race condition이 일어나지 않게 할 수 있다.
disable/enable INT는 user level 에서는 허용하지 않기 때문에 kernel 내부에서 synchronization을 할 때 사용한다.
그러나 CPU가 여러 개 일 때는 disable/enable INT의 방법이 통하지 않는다.
CPU가 여러 개 일 때는 disable INT를 한다고 해서 다른 CPU에서 critical section에 들어가는 것을 막을 방법이 없기 때문이다.
Test-and-Set
Test-and-Set은 CPU가 하드웨어적으로 직접 실행하는 명령어이다.
하드웨어 logic으로 구성되어, atomic하게 lock을 잡을 수 있다.
shared data는 <pre>boolean lock = false</pre>이다.
이를 이용해서 다음과 같이 구현한다.
do {
// entry section
while (TestAndSet(lock)); // lock을 atomic하게 잡는다.
// critical section
...
// exit section
lock = false;
...
} while(1);
Swap
두 개의 메모리 변수 값을 atomic하게 맞바꾼다.
두개의 shared data를 이용한다.
- boolean lock
- boolean waiting[n]
do {
// entry section
key = true;
while (key == true) swap(lock, key); // lock을 잡을 때 까지 기다림.
// critical section
...
// exit section
lock = false;
...
} while(1);
Bounded Buffer Using Test-and-Set
Unbounded Waiting vs. Bounded Waiting
Lamport의 backery algorithm을 이용하면 bounded waiting을 충족할 수 있다.
'Computer Science > Operating System' 카테고리의 다른 글
Synchronization with OS Support : Mutex (0) | 2021.06.20 |
---|---|
Synchronization with OS Support : Semaphore (0) | 2021.06.20 |
Synchronization Algorithm (0) | 2021.06.19 |
Synchronization (0) | 2021.06.19 |
CPU Scheduling Algorithm (0) | 2021.06.19 |
댓글