2023. 4. 24. 16:23ㆍ운영체제 (OS)
Semaphores Two purpose
-- Mutual exclsuion
: 공유자원을 보호하기 위함 - 공유자원에 하나의 스레드만 접근 가능
: semaphore P(s)&V(s)
: 항상 이진 세마포어
-- Synchronization
: 여러 스레드가 프로세스 사이에서 순서를 조정하여 공유자원을 보호하는 것
: coke machine
두 기능을 보장하지 위해 각각을 분리
: Lock : mutual exclusion 보호
: Condition Variables : Synchronization 보호
: 둘 다 언어에 독립적이며 많은 프로그래밍 환경에서 사용할 수 있음
Lock
-- Locked or Unlocked = Busy or Free
-- Nachos
: Lock(*name) : 'unlocked'로 초기화한 구체적 이름이 있는 lock 생성
: Lock::Acquire() : lock 이 unlock 이 될 때까지 기다리고 lock을 거는 것
: Lock::Release() : lock 을 풀고 Lock::Acquire()에 기다리고 있는 스레드를 꺠움
: 이진 세마포어를 좀 수정하여 구현 가능
Conventions
: 공유 자원에 접근하기 전에 Lock::Acquire() 을 호출
++ 이미 lock 인 상태에 접근하려 하면 오류 발생
: 공유 자원에 접근한 후 Lock::Release() 를 호출
++ 해당 lock 을 다른 스레드가 갖고 있으면 오류 발생
Queue
: Queue::Remove() 는 queue 안에 이미 아이템이 있으면 하나의 아이템만 return
: 만약 queue 가 비어있으면 ( remove 할 게 없는데 ) remove 할 게 있을 때까지 기다리게 함
++ 만약 lock 이 걸린채로 잠들면 다른 스레드들은 공유 queue 에 접근할 수도, queue에 아이템을 추가할 수도, sleeping 스레드를 깨울 수도 없기에 위의 상태에서는 스래드가 sleep 할 수 없음
: 해결
++ condition variables 스레드가 CS 안에서는 lock 을 풀고 잠들 수 있게 한다. ( 자고 일어나면 바로 다시 lock )
Condition
: Condition(*name) : 구제적인 이름을 가진 condition class 생성
++ condition 생성 후 프로그래머는 Lock::Lock() 을 호출해야 함
: Condition::Wait(conditionLock) : lock 을 보유하고 대기하는 동안 다른 스레드가 접근 가능
++ 무한 루프를 피하기 위해 codition variable 을 사용하여 대기 중인 스레드가 락을 다시 취득할 때까지 대기하도록 하는 것이 중요
: Condition::Signal(conditionLock) : 스레드가 락을 해제하고 대기 중인 스레드가 있으면 그 중 하나를 깨워서 ready 상태로 만듦
++여러 스레드 중 하나만 깨워 race condition 이 발생하지 않음
: Conditon::Broadcast(conditionLock) : 위에서 자고 있는 스레드 모두를 깨우는 것
: Wait, Signal, Broadcast 모두 호출하기 전에 lock 을 호출해야 하는 것!!!!!!!!!!!중요함 !!!!!!!!!!!!
: 더 높은 level 의 동기화 구조를 만들 떄 주의해야 함
++ low-llevel 구조를 조합하고 일부 논릴 추가하여 동시성 문제를 해결해 high-level 구성
++ 스레드를 생성하고 큐에 추갛여 실행을 예약하거나 대기상태로 전환하는 드으이 작업 수행 필요
++ 예를 들어 , high-level 구조의 세마포어는 락과 조건 변수로 구현되는데
세마포어는 락으로 보호되는 카운터와 대기 큐로 구성된다.
카운터 값은 세마포어에 엑세스하는 스렏의 수를 추적하는데 카운터 값이 0보다 작으면 스레드는 대기 큐에 추가되고 락이 해제된다. 이후 세마포어의 값을 증가시키는 스레드는 대기 큐에서 하나의 스레드를 깨우고, 락을 다시 획득하여 작업을 수행할 수 있음.
: high-level 동기화 구현에서는 이진 세마포어를 적절히 생성하고 queueing 하여 P와 V를 사용하여 스레드 간 동기화 수행
-- lock and contion variables 는 데이터 구조와 연관됨
: 프로그래머는 데이터 구조에서 연산을 수행하기 전에 lock 을 요청함
: 다른 작업에서 데이터 구조가 적절한 상태가 될 때까지 기다려야 하는 경우, 대기하는 데 condition variables 을 사용
'운영체제 (OS)' 카테고리의 다른 글
[16] CPU Scheduling(1) (0) | 2023.05.15 |
---|---|
[14] Monitor & Dining Philoshophers (0) | 2023.04.24 |
[12] Implementing Semaphores (0) | 2023.04.24 |
[10 & 11] Mutual Exclusion & Semaphore (1) | 2023.04.23 |
[08] Thread (0) | 2023.04.21 |