개요

- synchronization, 동기화 : 여러 프로세스 혹은 쓰레드가 거의 동시에 공유 데이터를 조작하기 위해 실행되어도, 공유 데이터의 일관성을 유지하는 것이다.(즉 기댓값에 맞게 데이터 결과가 나오도록 하는 것)
- race condition, 경쟁 조건 : 여러 프로세스 혹은 쓰레드가 거의 동시에 같은 데이터를 조작할 때, 타이밍이나 접근 순서에 따라 데이터의 결과가 달라질 수 있는 상황이다.
- critical section, 임계 영역 : 공유 데이터의 일관성을 보장하기 위해, 하나의 프로세스 혹은 쓰레드만 진입해서 실행할 수 있도록 하는 영역이다. 코드가 critical section이다. race condition은 경쟁하여 결과가 달라질 수 있는 상황 자체를 말한다.
critical section 문제를 해결하기 위한 3가지 조건
- mutual exclusion, 상호 배제 : 한번에 하나의 프로세스 혹은 쓰레드만 임계 영역에서 실행 가능하다.(임계 영역으로 들어갈 수 있다)
- progress, 진행 : 임계 영역에 들어간 프로세스 혹은 쓰레드가 없을 때, 프로세스들 혹은 쓰레드들이 임계 영역으로 들어가려고 할 때 그 중 하나는 들어갈 수 있게 해야 한다. 그냥 진행이 계속 될 수 있게 해야 한다고 이해하자.
- bounded waiting, 한정된 대기 : 어떤 프로세스나 쓰레드가 임계 영역에 못 들어가고 무한하게 대기하고 있으면 안된다는 조건이다.
Spin Lock - busy waiting

- test_and_set?
lock이라는 데이터의 현재 값을 읽어내고, lock이라는 데이터의 값을 true로 바꿔주는 과정을 하나의 인스트럭션으로 처리한다. 이렇게 하나의 인스트럭션(cpu가 실행할 수 있는 가장 작은 단위) 이렇게 함으로써 정말 동시에 두 개의 프로세스가 lock을 얻으려고 요청해도, cpu가 알아서 같은 메모리 영역에는 동기화시켜서 동시에 실행시키지 않는다.

Mutex - block/wakeup

- 무조건 mutex가 spin lock에 비해 좋은가?


Semaphore - block/wakeup

- mutex, 이진 semaphore의 차이
priority donation, priority inheritance
mutex
p1. - 10 lock
p2 - 10
priority inversion
세마포어는 순서 동기화가 가능하다.
