[OS] 운영체제(5장) 프로세스 동기화 - 2
4. 동기화 하드웨어(Synchronization Hardware)
lock을 사용하는 임계구역 문제 해결책
임계구역을 lock으로 보호하여, 경쟁조건을 방지함
Lock의 구현
- 소프트웨어 알고리즘 - 복잡하고 비효율적
- 하드웨어 지원
- 인터럽트 금지(disable)
- Atomic 명령어
인터럽트 금지(Interrupt Disable)
임계구역 실행 동안 인터럽트를 방지하여 선점을 허용하지 않음
- 현재 수행중인 코드가 선점되지 않고 계속 수행함
단일 프로세서 시스템에서는 임계구역 문제 해결 가능
멀티 프로세서 시스템에서는 적용 불가능
- 한 CPU의 인터럽트를 금지시켜도, 다른 CPU는 여전히 임계구역에 진입할 수 있음.
- 모든 CPU의 임계구역 진입을 방지하기 위해서, 모든 CPU의 인터럽트를 금지시키는 것은 시간이 소요되므로 비효율적임.
시스템 클록(시계)에 대한 영향
시스템 클록이 인터럽트에 의해서 갱신되는 시스템에서, 인터럽트 금지는 시간에 영향을 줄 수 있음
원자적 명령어(Atomic Instruction)
연속되는 여러 개 동작(read-modify-write 동작)을 원자적으로(인터럽트 되지 않고/분리되지 않고) 수행하는 기계어 명령어
Atomic 명령어의 예
Test and Set (TAS) instruction
word 내용을 검사(test)하고 변경(set)하는 동작을 원자적으로 수행
Swap instruction
두 word의 내용의 교환(swap)을 원자적으로 수행
Lock 변수 사용하기 – Atomic 명령어 사용
- 두 상태: 0 (unlock, open, 사용 중이 아님), 1 (lock, close, 사용 중)
- atomic 명령어를 사용하여 lock 변수를 조작함
TAS 또는 SWAP 명령어를 사용한 lock 변수의 조작
Test and Set (TAS) instruction | SWAP instruction |
---|---|
5. 뮤텍스 락(Mutex Locks)
뮤텍스 락(Mutex Locks)은 동시에 공유 리소스에 접근할 수 있는 스레드의 수를 제한하여 상호배제를 구현하는 기술로 보통 상호배제를 위한 가장 기본적인 기법 중 하나이다.
- 두 함수 제공
- acquire() – lock 획득
- release() – lock 반환
임계 구역 문제에 대한 하드웨어 기반 해결안
- 응용 프로그래머에게는 복잡하며 일반적으로 직접 사용할 수 없음
- 해결방법 – 운영체제에서 응용프로그래머에게 이를 위한 소프트웨어 도구를 제공 → Mutex Lock
스핀락(Spinlock) : busy-waiting mutex lock
루프를 반복 실행하면서 lock 획득을 기다림 CPU cycle이 낭비됨 → 단일 프로세서 시스템에서 특히 문제임 멀티프로세서 시스템에서 짧은 시간 내에 lock 획득이 예상되면 스핀락이 유용함 - context switching이 없음
Busy-waiting이 없는 Mutex Lock
Busy-waiting이 없는 Test and Set을 사용한 상호 배제
lock을 획득하지 못하면 프로세스는 lock을 기다리는 대기상태로 전환 하고 CPU를 내어 놓음
6. 세마포(Semaphores)
Mutex Lock보다 더 정교하고 강력한 프로세스 동기화 도구
세마포 S
- 특별한 표준 동기화 연산을 통해서만 접근 할 수 있는 정수 변수.
- 세마포 값은 대개 사용 가능한 특정 자원의 수를 나타냄
Semaphore 연산
- 초기화 연산 – semaphore S 값 초기화
- 두 개의 원자적(atomic) 연산 (by Dijkstra)
- P operation (Proberen = test) → wait(S), acquire(S)
- V operation (Verhogen = increment) → signal(S), release(S)
Semaphore 용도
- 상호 배제(Mutual exclusion) → 이진 세마포(binary semaphore)
- 유한 개수의 자원 접근, 한정된 concurrency → counting semaphore
- 프로세스 동기화: signaling
Binary semaphore 상호배제 구현 (mutex lock과 유사)
- semaphore 값: 0 or 1 (1로 초기화)
- 임계구역 접근 제어에 사용
카운팅 세마포(Counting Semaphore)
Counting semaphore 한정된 concurrency, 유한 개수 자원 접근
- semaphore 값: 가용 자원 개수를 의미(최대 가용 자원 개수로 초기화)
- 유한 개수의 자원의 접근 제어에 사용
일반적인 동기화
- (예) 프로세스 P1의 A 부분 실행 후에 프로세스 P2의 B 부분이 실행되어야 함
- Code:
Semaphore 구현
바쁜 대기(Busy waiting) Semaphore
spinlock과 유사하게 구현
바쁜 대기 없는(No Busy waiting) Semaphore
- 프로세스의 block-wakeup 방법 이용
- semaphore를 획득할 수 없을 때 semaphore 대기 큐에 자기 프로세스를 추가하고 자신을 block 시킴
- semaphore를 사용 가능하게 되면, semaphore 대기 큐에서 한 프로세스를 꺼내어 ready queue로 이동하여, 대기 중인 하나의 프로세스를 wakeup시킴
No busy-waiting 세마포 구현
Sempahore S
- value – 세마포 값
- list – 이 세마포를 대기하는 프로세스 리스트 (세마포 대기 큐)
Sempahore 연산
- 세마포 값을 먼저 감소 → 음수 가능
- 음수의 크기는 세마포를 대기하는 프로세스들의 개수임 (세마포 검사와 감소의 순서가 busy-waiting 방법과 반대)
- 두 프로세스가 같은 세마포에 대해 P 또는 S 연산이 중첩되어 실행되지 않도록 해야 함. (atomic 실행)
교착상태(Deadlock)와 기아(Starvation)
Semaphore를 사용한 코드는 교착상태와 기아가 발생할 수 있음
교착상태
두 개 이상의 프로세스들이 그들 중 한 프로세스에 의해서만 발생될 수 있는 사건을 무한정 기다리고 있어서, 진행이 되지 않는 상황
기아 – 무한 봉쇄(indefinite blocking)
</span>
- 일부 프로세스가 무한정 대기할 수 있는 상황
- (예) 세마포 대기 리스트가 LIFO 순서로 되어 있으면 리스트 앞쪽에 있는 프로 세스는 제거되지 못할 수 있음 (세마포가 빈번히 사용되는 경우)
7. 고전적인 동기화 문제
lock을 사용하는 임계구역 문제 해결책
유한 버퍼 문제(Bounded-Buffer Problem) | Readers와 Writers 문제 | 식사하는 철학자 문제(Dining-Philosophers Problem) |
---|---|---|
두 프로세스가 하나의 자료 공유 | 여러 프로세스가 하나의 자료 공유 - 일부는 읽기만 수행 -일부는 갱신 수행 |
여러 프로세스가 여러 자료 공유 |
Dining-Philosophers Problem
- 여러 프로세스들에게 여러 자원을 할당할 필요가 있는 병행 제어(concurrency control) 문제를 단순하게 나타낸 예임.
- 철학자 → 프로세스(process), 젓가락 → 자원(resource)
8. 모니터(Monitors)
Semaphore 사용의 문제점
프로그래머가 잘못 사용하면 다양한 유형의 오류 발생 가능
잘못된 Semaphore 사용 예
- P와 V 연산의 순서를 반대로 사용
- V대신에 P를 사용
- P 또는 V를 누락
이러한 실수가 아니어도 동작의 정확성을 증명하기 어렵고 식사하는 철학자 문제와 같이 교착상태를 유발할 수 있다.
모니터
- 병행 프로그래밍(Concurrent Programming)을 위한 지원
- 병행 프로그래밍이 순차 프로그래밍보다 어려움
- 세마포와 같은 기능을 직접 사용하지 않고 병행 프로그래밍을 위해 고수준의 상호배제를 지원하는 기능이 개발됨
- 잘못 사용할 위험성을 줄임
- 모니터(Monitor)
- 프로세스 동기화를 위한 편리하고, 효율적이고, 안전한 방법을 제공하는 고수준의 동기화 추상화 데이터 형(ADT) – data와 procedure를 포함
- monitor에서 정의된 procedure만에 monitor 내의 local data를 접근가능
- monitor의 procedure들은 한 번에 하나의 프로세스만 진입하여 실행할 수 있음 → 상호배제 보장
조건 변수(Condition Variables)
- Condition: 모니터에서 동기화에 사용되는 특별한 자료형 condition x, y;
- Condition 변수를 사용하는 연산 - wait, signal
wait(), signal()
- wait(x) 를 호출한 연산은 프로세스는 다른 프로세스가 signal(x)을 호출할 때까지 일시 중지(suspend)됨
- signal(x) 연산은 정확히 하나의 프로세스만 재개시킴. 일시 중지된 프로세스가 없으면, 아무런 영향이 없음
모니터 내에서의 동기화
조건변수에 대한 두 연산(wait, signal)을 사용하여 수행함
댓글남기기