무지개곰
article thumbnail
반응형

1. 목차

  1. 데드락
  2. 라이브락
  3. 기아 상태

2. 데드락

둘 이상의 프로세스가 서로가 가진 한정된 자원을 요청하는 상태

<code />
type value struct { mu sync.Mutex value int } func Sum(a, b *value) { defer wg.Done() a.mu.Lock() defer a.mu.Unlock() time.Sleep(2*time.Second) b.mu.Lock() defer b.mu.Unlock() fmt.Printf("%d + %d = %d\n", a.value, b.value, a.value + b.value) } var a, b value wg.Add(2) go Sum(&a, &b) go Sum(&b, &a) wg.Wait()

2.1. 데드락 발생 조건

2.2. 상호 배제

동시에 실행되는 프로세스가 어떤 임의의 시점에 하나의 리소스에 대한 배타적 권리를 보유한다.

2.3. 대기 조건

동시에 실행되는 프로세스는 하나의 리소스를 보유하고 있는 동시에 또 다른 추가 리소스를 기다리고 있다.

2.4. 비선점

동시에 실행되는 프로세스 중 하나를 보유하고 있는 리소스는 해당 프로세스에 의해서만 사용 해제 될 수 있다.

2.5. 순환 대기

동시에 실행되는 프로세스 중 하나가 다른 동시 프로세스로 이어지는 체인에서 기다려야 한다.


3. 라이브락

데드락을 해결하기 위해 Lock과 Unlock을 진행하지만 다른 프로세스가 동시에 Lock과 Unlock을 진행함으로써 다음 단계로 나아가지 못하는 상태

<code />
type value struct { mu sync.Mutex } func Process(a, b *value){ answer := -1 for { a.mu.Lock() time.Sleep(time.Second) if b.mu.TryLock(){ answer = a.value + b.value b.mu.Unlock() }else { a.mu.Unlock() } a.mu.Unlock() if answer == 0 { break } } } var a, b value a.value = -1 b.value = 1 wg.Add(2) go Process(&a, &b) go Process(&b, &a) wg.Wait()


4. 기아 상태

다른 프로세스에게 자원을 뺏기게 되어 원래보다 더 적게 작동하게 되거나 못하게 되는 상태

<code />
var wg sync.WaitGroup var mu sync.Mutex var runTime = 1*time.Second func processA(){ count := 0 defer wg.Done() for begin := time.Now(); time.Since(begin) <= runTime; { mu.Lock() time.Sleep(2 * time.Nanosecond) mu.Unlock() count += 2 } } func processB(){ count := 0 defer wg.Done() for begin := time.Now(); time.Since(begin) <= runTime; { mu.Lock() time.Sleep(1 * time.Nanosecond) mu.Unlock() count ++ mu.Lock() time.Sleep(1 * time.Nanosecond) mu.Unlock() count ++ } } wg.Add(2) go processA() go processB() wg.Wait()


5. 참고 자료

반응형
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!