운영체제 (OS)

[12] Implementing Semaphores

yongyongMom 2023. 4. 24. 14:47
SMALL

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()

 

++ 사아진 ++

반응형
LIST