동기화
- 동기화: 작업들 사이에 실행 시기를 맞추는 것
- ex) 1,2,3,4 번의 작업이 있음 -> 3,4번 작업이 시작되려면 1,2번이 완료되어야함 -> 1번은 완료되고 2번은 아직 끝나지 않았을때 3,4번은 기다려야 함
동기화 이슈
- 여러 스레드가 동일한 자원접근시 동기화 이슈 발생
- 동일 자원을 여러 스레드가 동시 수정시, 각 스레드 결과에 영향을 줌
동기화 이슈 해결 방안
- Mutual exclusion(상호 배제)
- 쓰레드는 프로세스 모든 데이터를 접근할 수 있으므로, 여러 스레드가 변경하는 공유 변수에 대해 Exclusive Access필요
- 어느 한 스레드가 공유 변수를 갱신하는 동안 다른 스레드가 동시 접근하지 못하도록 막기
Mutex (Mutual exclusion / 상호 배제)
일종의 Locking매커니즘. lock을 가지고 있을 경우에만 공유 데이터에 접근 가능하다.일부 음식점들은 공용 화장실 관리 차원에서 화장실을 잠궈두고 다닌다.손님들이 화장실에 가려면 주인에게 열쇠를 받은 후 가야한다.물론 다음 손님이 화장실에 가려면 앞 손님이 열쇠를 반납해야 갈 수 있다.이렇게 열쇠가 있는-lock을 가지고 있는 경우에만 공유자원(화장실)에 접근할 수 있다.이게 바로 Mutex라고 보면 된다.
유의할 점은 Lock에 대한 소유권이 있다는 점이다.열쇠를 획득한 사람만 반납할 수 있다.
1 | lock.acquire() |
2 | for i in range(100000): |
3 | g_count += 1 |
4 | lock.release() |
세마포어(Semaphore)
세마포어는 동시에 리소스에 접근할 수 있는 ‘허용가능한 Counter의 갯수’를 가지고 있는 Counter로 보면 된다.예를 들면 101병실에 방문객용 의자가 3개 있다고 치자. 간호사는 이 병실에 방문자가 5명만 들어갈 수 있도록 허용하고 나머지 방문객들은 밖에서 대기하도록 한다. Counter갯수만큼 공유자원(병실)에 접근할 수 있다.이 세마포어 Counter의 갯수에 따라 1개의 경우 Binary Semaphore,2개 이상의 경우 Counting Semaphore라고 부른다.Binary Semaphore의 경우 개념적으로 Mutex와 같다고 볼 수 있다.