computer

스레드 동기화 이슈

유순이 2021. 6. 23. 07:47

스레드의 실행 순서에 대해 확신할 수 없다.

 

임계영역(critical section)

임계자원(critical source)

 

join() -> 다른 스레드가 완료될 때까지 기다린다.

 

mutual exclusion

lock.aquire()

lock.release()

 

동기화 : 여러 작업들 간의 실행 시기를 맞추는 것

여러 스레드가 동일한 데이터에 접근 시에 동기화 이슈가 발생한다.

동일 자원을 여러 스레드가 수정하게 되면, 각 스레드의 결과에 영향을 준다.

>> 해결방안 :  Mutual Exclusion 

스레드는 모든 정보에 접속할 수 있으므로, 공유 변수에 대한 Exclusive Access가 필요하다.

한 스레드가 공유 변수를 갱신하는 동안, 접근하지 못하도록 막는다.

 

이렇게 막는 기법 (Locking Mechanism)에 2가지 종류가 있다.

1. Mutex(binary Semaphore)

: 임계 구역에 스레드 하나

2. Semaphore

: 임계 구역에 여러 스레드 (counter를 설정)

>> 성능 상의 이슈로

 

세마포어

P: 검사

V: 증가

S: 세마포어 값

 

멈출 수가 없어 while 문으로 대기를 시킨다. ( a.k.a 바쁜 대기)

 

S가 음수일 때, 대기 큐에다가 넣고 block(sleep)() 시킨다.

그리고 대기 큐에 있는 함수 재 실행 wakeup() 시킨다.

 

sem_open()

sem_wait()

sem_post()

 


Deadlock (교착 상태)

: 무한 대기 상태

두 개 이상의 작업이 서로 상대의 작업이 끝나길 기다리는 상태

 

발생 조건 (네 가지 모두 성립이 될 때, 교착 상태가 발생할 가능성이 있다.)

1. 상호 배제(Mutual Exclusion): 프로세스들이 필요로 하는 자원에 대한 배타적인 통제권을 요구

2. 점유 대기(Hold and Wait): 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다림

3. 비선점(No Preemption): 점유 중인 자원을 빼앗을 수 없음

4. 순환 대기(Circular Wait): 각 프로세스가 순환적으로 다음 프로세스가 원하는 자원을 가짐

 

해결 방법

1. 예방

2. 회피

3. 발견: 교착 상태에 있는 프로세스와 자원 발견

4. 회복: (교착 상태의)프로세스를 종료하거나 할당된 자원을 선점하여 회복

 

 

Starvation (기아 상태)

: 특정 프로세스가 우선순위가 밀려 원하는 자원을 할당받지 못하는 상태

 

해결 방법

1. 우선순위 변경