Backend with Golang

[Concurrency-1] Concurrency가 왜 어려운가?

아직개구리 2023. 5. 28. 23:39

1. Race condition

공유된 자원을 두개이상의 operation이 실행되려고 할때, 그 순서가 보장되지 않게 되고, 가능한 여러개의 시나리오가 발생할 수 있다. 

아무리 짧은 코드라도 큰 variability를 가지고 올 수 있는것이다. 

 

2. Atomicity 

atomic이라는 걸 생각하면 context와 크게 연관되어 있다. 

어떻게 scope를 정의하느냐에 따라서, atomic한지 안한지가 다르게 결정될 수 있다. 

the atomicity of an operation can change depending on the currently defined scope! 

 

atomic이라면 concurrent context 안에서는 safe하다는 것을 암시한다. 

많은 statement들이 atomic 하지않지만, atomicity는 논리적으로 correct program을 구성하기 위한 중요한 요소이다. 

그렇기 때문에 나중에 다루겠지만, 여러 테크닉들을 통해서 atomicity를 강제적으로 부여할 수 있다. 

 

3. Memory Access Synchronization 

공유된 자원에 대해서 execlusive access가 필요한 영역을 critical section이라고 한다. 

이런 것들에 대해서는 convention이 있는데, data에 접근할 시점에는 Lock을 부르고, 끝났을 때는 Unlock을 부르는 것이다. 

이 방식을 통해서 data race에 대해서는 해결을 할 수 있지만, order of operation은 아직 nondeterministic하다. 

 

4. Deadlocks, Livelocks, and Starvation

Deadlock은 모든 concurrent process들이 하나의 다른 process를 기다리는 상황을 말한다. 

이런 경우 밖으로부터의 intervention없이는 절대 recover되지 않는다. 

 

Coffman Condition -이 네개의 필요조건을 deadlock에 빠진다.

- Mutual Exclusion: concurrent process가 배타적인 통제권을 가지고 있다. 

- Wait for Condition: 프로세스가 자원을 가지고 있으면서, 다른 자원을 기다리는 것

- No preemption: 프로세스가 어떤 자원을 release할 때까지 자원을 뺏을 수 없다. 

- Circular Wait: 각 프로세스는 순환적으로 다음 프로세스를 기다리고 있다. 

 

Livelock은 actively performing concurrent operations을 하고 있지만, program을 앞으로 나아가는 것을 하지 않는 상태를 의미한다. 

 

Starvation은 어떤 concurrent process가 이것이 실행되는데 필요한 모든 resource를 받을 수 없을 때를 말한다. 이것은 보통 어떤 한개 이상의 greedy한 concurrent process가 불공평하게 하나나 그 이상의 concurrent process가 효율적으로 일을 하는 것을 방해할 때를 의미한다. 

 

'Backend with Golang' 카테고리의 다른 글

[Concurrency-3] Go Channel의 사용  (0) 2023.06.13
[Concurrency-2] Chapter 3 channel 전까지  (0) 2023.06.12
MySQL - Transaction  (0) 2023.05.09
Docker-compose.yml 파일 작성하기 (TBU)  (0) 2023.05.09
Go: JSON  (0) 2023.05.03