반응형
목차
- 데드락
- 라이브락
- 기아 상태
데드락
둘 이상의 프로세스가 서로가 가진 한정된 자원을 요청하는 상태
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()
참고 자료
- 책 : Concurrency in Go (Go 동시성 프로그래밍)
- https://seung.tistory.com/entry/GoLang-%EB%8D%B0%EB%93%9C%EB%9D%BD-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9D%BD-%EA%B8%B0%EC%95%84%EC%83%81%ED%83%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-Deadlcok-Livelock-Starvation : 데드락, 라이브락, 기아 상태
반응형
'개발일기 > Prism' 카테고리의 다른 글
[개발 일기] 채팅 구현 사전 공부 (0) | 2024.03.10 |
---|---|
[개발 일기] controller-service-repository 리팩토링 (0) | 2024.02.04 |
[개발 일기] 해시태그, 기술스택 구현 (0) | 2024.01.24 |
[개발 일기] 프로필 이미지 수정 기록, 해시태그 구상 (0) | 2024.01.22 |
[개발 일기] 프로필 수정 페이지 구상 (0) | 2024.01.02 |