[OS] 스레드(Thread) 동기화(Synchronization)
1. Thread Synchronization
- 동기화
- 작업들 사이에 실행 시기를 맞추는 것
- 여러 스레드가 동일한 자원(데이터) 접근 시 동기화 이슈 발생
- 동일 자원을 여러 스레드가 동시 수정 시 각 스레드 결과에 영향을 줌
2. 동기화 이슈 해결방안
- Mutual exclusion (상호 배제)
- 스레드는 프로세스 모든 데이터를 접근할 수 있으므로 여러 스레드가 변경하는 공유 변수에 대해 Exclusive access 필요
- 어느 한 스레드가 공유 변수를 갱신하는 동안 다른 스레드가 동시에 접근하지 못하게 막음
- 임계 자원: critical resource
- 임계 영역: critical section
# Python
lock.acquire()
for i in range(1000):
g_count += 1
lock.release()
- Semaphore
- Mutex 와 세마포어
- ciritical section 에 대한 접근을 막기 위해 locking 메커니즘 필요
- Mutex (binary semaphore): 임계 구역에 하나의 스레드만 들어갈 수 있음
- Semaphore: 임계구역에 여러 스레드가 들어갈 수 있음, counter를 두어서 동시에 리소스에 접근할 수 있는 스레드 수를 제어
2.1. Semaphore
- S: 세마포어 값 (초기 값만큼 여러 프로세스가 동시 임계 영역 접근 가능)
- P: 검사 (임계영역에 들어갈 때)
- S 값이 1 이상이면, 임계 영역 진입 후, S값 1 차감(S값이 0이면 대기)
- V: 증가 (임계영역에서 나올 때)
- S 값을 1 더하고, 임계 영역을 나옴
P(S) : wait(S) { while (S <= 0) { // 대기 S--; // 다른 프로세스 접근 제한 } } V(S) : signal(S) { S++; // 다른 프로세스 접근 허용 }
- 바쁜 대기
- wait() 는 S가 0이라면 임계영역에 들어가기 위해 반복문 수행
P(S) : wait(S) { while (S <= 0) { // 바쁜 대기 S--; // 다른 프로세스 접근 제한 } }
- 대기 큐
- S가 음수일 경우, 바쁜 대기 대신, 대기큐에 넣음
wait(S) { S->count--; if (S->count < 0) { add this process to S->queue; wakeup(P) } }
-
wakeup() 함수를 통해 대기큐에 있는 프로세스 재실행
signal(S) { S->count--; if (S->count < 0) { remove a process P from S->queue; wakeup(P) } }
2.1.1 주요 함수
- sem_open()
- 세마포어 생성
- sem_wait()
- 임계영역 접근 전, 세마포어를 잠그고(lock), 세마포어가 잠겨있다면 풀릴 때까지 대기(wait)
- sem_post()
- 공유자원에 대한 접근이 끝났을 떄, 세마포어 잠금을 해제
3. 스레드 교착상태와 기아상태
- Thread deadlock & starvation
- 프로그래밍은 근본적으로 중단없이 코드 실행
- 중단은 대부분 loop로 표현
- loop는 CPU에 부하를 걸리게 함
3.1. 교착상태(Deadlock)
- 무한 대기 상태, 두개 이상의 작업이 서로 상대방의 작업이 끝나기만들 기다리고 있을 때
- 발생조건
- 상호배제(Mutual exclusion)
- 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구
- 점유대기(Hold and wait)
- 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다림
- 비선점(No preemption)
- 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없음
- 순환대기(Circular wait)
- 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가짐
- 상호배제(Mutual exclusion)
참고
This is personal diary for study documents.
Please comment if I'm wrong or missing something else 😄.
댓글남기기