공유 자원
progress: avoid deadlock
bounded waiting: avoid starvation
race condition
스레드 안전: 동시 접근이 이루어져도 실행에 문제가 없는 상태
동기화
Peterson's Solution
현대 컴퓨터 구조가 load, store 같은 기본 기계어를 수행하는 방식 때문에 이러한 구조에서 올바르게 실행된다고 보장할 수는 없다
int turn
Boolean flag[2]
flag[i]=true, turn=j;
// flag[i]는 임계구역으로 진입할 준비가 됐다.
// turn은 프로세스가 임계구역에서 실행 될 수 있다.
Hardware support for synchronization
Memory Barriers: 메모리의 변경 사항을 다른 모든 프로세서로 전파하는 명령어를 제공
memory model
Hardware instruction: 한 워드의 내용을 검사하고 변경하거나, 두 워드의 내용을 원자적으로 교환할 수 있는 명령어, test_and_set, compare_and_swap
Atomic variables: 정수, 부울 등 기본 데이터 유형에 대한 원자적 연산을 제공한다. 상호 배제 보장 카운터 및 시퀀스 생성기와 같은 공유 데이터 한 개의 갱신에만 제한되는 경우가 많다.
Mutex Lock: 임계구역에 들어가기전에 acquire(), 빠져나올 때 release(). 바쁜 대기
위 유형을 spin lock 이라고도 한다.
semaphores: wait()-P, signal()-S, 바쁜대기
SMP 시스템에서 원자적으로 실행하는 것을 보장하기 위해, CAS, spin lock 등 다른 기법 제공
발견하기 어려운 타이밍 오류를 야기할 수 있다.
monitor: 모니터 형은 내부에서 상호배제가 보장되는 프로그래머가 정리한 일련의 연산자 집합을 포함한 ADT
Signal and wait: p는 q가 모니터를 떠날 때 까지 기다리거나 다른 조건을 기다린다.
Signal and continue :Q는 P가 모니터를 떠날 때 까지 기다리거나 다른 조건을 기다린다.
Liveness:프로세스가 실행 수명 주기 동안 진행되는 것을 보장하기 위해 시스템이 충족해야 하는 일련의 속성
Priority Inversion: L, M, H. H가 필요한 세마포 S를 L이 쓰고 있고. M이 L을 선점했다면 H는 M이 끝나고 L이 끝나길 기다려야 한다.
priority-inheritance protocol: 더 높은 우선순위의 프로세스가 필요로 하는 자원을 가진 프로세스는 자원을 다 쓸 때 까지 더 높은 우선 순위를 갖는다.
The Bounded-Buffer Problem
n개의 버퍼로 구성된 pool, 각 버퍼는 한 아이템만 저장한다.
mutex 이진 세마포는 버퍼 풀에 접근하기 위한상호 배제 기능을 제공하며 1로 초기화된다.
empty와 full 세마포는 각각 비어 있는 버퍼의 수와 꽉 찬 버퍼의 수를 기록한다.
int n semaphore mutex=1, empty=n, full=0;
Readers-Writers 문제
Read-Write Lock: 락을 획득할 때 읽기인지 쓰기인지 모드 지정.
공유 데이터를 읽기만 하는 프로세스와 쓰기만 하는 스레드를 식별하기 쉬운 응용
Writer 보다 Reader의 개수가 많은 응용
The Dining Philosophers Problem
각 젓가락을 세마포로 표현
최대 n-1 명의 철학자만을 테이블에 동시에 않도록 한다.
두 젓가락을 모두 집을 수 있을 때만 집도록 허용한다.
odd: left 먼저, even: right 먼저 집게 한다.
모니터: 양쪽을 집을 수 있을 때만 집기
enum{Thinking, Hungry, Eating} state[n]
(state[(i+n-1)%n] != Eating) &&(state[(i+1)%n] != Eating)
대체방안
Transaction Memory: 메모리 읽기와 쓰기 연산의 원자적인 연속적 순서
한 트랜잭션의 모든 연산이 완수되면 메모리 트랜잭션은 확정된다. 그렇지 않으면 모든 연산 취소 후 roll-back
Open MP: 어플리케이션 개발자가 경쟁조건을 발견해야 한다. mutex lock처럼 동작
함수형 언어