무지개곰
article thumbnail
반응형

목차

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

데드락

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

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()

데드락 발생 조건

상호 배제

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

대기 조건

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

비선점

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

순환 대기

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


라이브락

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

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()


기아 상태

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

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()


참고 자료

반응형
profile

무지개곰

@무지개곰

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