[12] Implementing Semaphores
Two version of Semaphores
--
-- Classical
Implementing Semaphores
-- Busy-waiting
: 세마포어를 기다리는 스레드에 대한 대기 큐 지원을 안함
: busy-waiting 을 통해 자원 낭비를 함
++ busy-waiting : 주머니 속의 돌이 들어왔는지 아닌지를 무한 루프를 돌며 확인하는 것
: wait(s) , signal(s) 또한 CS의 일부인데 보호되지 않음
--Disabling interrupts
: 세마포어를 기다리는 스레드에 대한 대기 큐 지원을 안함
: busy-waiting 을 통해 자원 낭비
: muti-processor 에서는 작동하지 않음
++ CPU1 에서는 인터럽트가 비활성화 될 수 있지만 CPU2 에서는 인터럽트가 비활성화 되지 않을 수 있다
: 타이머를 방해해 타이머를 통해 이벤트를 발생시키는 다른 어플리케이션에 문제가 발생할 수 있다
: OS 는 가능하지만 user 는 사용할 수 없는 방법
++ OS 즉 kernel 모드에서 인터럽트를 처리하기에 user mode 에서는 인터럽트 제어를 하지 못함
-- test&set instruction
: 멀티스레드 환경에서의 동시 접근 문제를 해결하기 위해 사용되는 원자적 연산
: 하드웨어에서 지원되며 원자적으로 실행
: 커널 모드에서만 사용할 수 있음
: 메모리 내의 값을 읽고, 해당 값을 반환하면서 동시에 해당 메모리 위치에 다른 값을 쓰는 역할( RMW : Read-modify-write)
++ 예를 들어 'lk' 의 값이 0 인 상태를 'free' 라고 하는데 이때 메모리 내의 값으로 0을 읽고 0을 return 하는 동시에 해당 메모리에 1 값을 쓴다.
: 인터럽트 비활성화의 문제인 multi-processor에서 동작하지 못하는 문제를 해결할 수 있음
++ 캐실 일관성 문제가 있을 수 있지만 멀티프로세서에서도 동기화를 보장하는 기술을 사용
: 세마포어를 기다리는 대기 큐를 지원하지 않음
: 위와 같은 busy-waiting 문제
Nachos 에서 Semaphores
-- Semaphores
: Semaphores::Semaphores() : 구체적인 세마포어 이름과 값을 만듦
: Semaphore::P() : wait()
: Semaphore::V() : signal()
-- Locks
: Lock::Acquire()
: Lock::Release()
-- Condition variables
: Condition::Wait()
: Condition::Signal()
++ 사아진 ++