-------------------1장 동시성 소개--------------------
go 언어는 동시성과 관련된 부수적인 작업들을 추상화함으로써 프로그래머가 문제 해결에만 집중할 수 있도록 도와준다.
동시성이 어려운이유
- 레이스 컨디션: 프로그램의 순서가 보장되지않을때 발생한다.
- 가능성이 있다는것. 그것이 버그가 될 소지가 된다.
- 원자성: 동작하는 컨텍스트 내에서 나누어지거나 중단되지 않는다는 것을 의미한다.
- 컨텍스트(context)라는 현재 정의된 범주가 중요하다.
- 어떤연산을 원자적이라고 판단할 수 있는 범위를 컨텍스트라고 정의힌다.
i++ i의 값 가져오기/ i증가시키기/ i 저장하기 원자적인것을 합친다고 더큰 원자성을 보장하는것은 아니고, 이경우 i를 다른 고루틴에게 노출하지 않는 고루틴의 컨텍스트일경우 원자적이다. - 메모리 접근 동기화
- sync.mutex.lock을 통해서 메모리에 대한 사용권한을 독점적으로 획득하는 등 여러가지 방법이 있다.
- 메모리를 독점적으로 획득하였다고해서, 레이스 컨디션이 해결되는것은 아니다.
- 데드락
- 다른 프로그램이 끝나기만을 기다리는 상태에서 진행이 되지않는것
- 조건: 상호 배제, 대기조건, 비선점, 순환대기
- 라이브락
- 실제로 연산은 진행되자만, 프로그램의 진행에는 어떠한 영향도 주지않는 상태
- 기아상태
- 작업을 실행하는데 필요한 모든 리소스를 얻을 수 없는 모든 상황을 의미한다.
-------------------2장 코드 모델링: 순차적인 프로세스 간의 통신--------------------
동시성과 병렬성
- 동시성은 코드의 속성이고, 병렬처리는 실행중인 프로그램의 속성이다.
- 우리는 병렬적인 코드를 작성하는 것이 아니라, 병렬로 실행되기를 바라면서 동시성 코드를 작성하는것이다.
- 병렬처리인지 아닌지는 시간, 컨텍스트에 의해 결정된다.(컨텍스트가 5초라면 1초동안 번갈아가며 실행하는 것은 병렬적이다.)
- 대부분의 동시성 논리는 가장 높은 추상화 수준인 os스레드에서 작성되어 있다.
CSP=communicating sequential process
- 상호작용하는 순차적 프로세스들 이라는 논문을 기반으로 go가 만들어졌다.
- 입력과 출력이 언어 기본 요소로 간주되어야된다. 입력과 출력을 매우중요한 것으로 고려해야된다.
- source와 destination을 통해서만 통신할 수 있다.
- 대다수의 언어들은 메모리에 대한 접근을 공유하고 동기화하는 방식으로 동시성을 지원했다.
- 하지만 메세지 전달 스타일은 읽고 쓰기 쉽고 추론하는것도 쉬워진다.
동시성을 지원하는 언어의 장점
- 보통은 os스레드/ 메모리 접근 동기화 수준으로 지원
- go는 고루틴/ 채널을 이용해서 동기화 지원
- 추상화된 기능들은 병렬성이라는 측면을 고민할 필요가 없어지도록 도와주며, 본연의 동시성 수준에 가깝게 문제를 모델링하도록 해준다.
- go의 런타임은 고루틴을 os스레드에 자동으로 다중화하고 스케줄링을 관리해준다.
go의 동시성에 대한 철학
- 메모리 공유를 사용해 통신하지 말고, 통신을 통해 메모리를 공유하라
- 채널을 과도하게 사용하는 것에 대한 불평도 있긴하다.
- sync라는 전통적인 메모리 공유방법도 지원하긴 한다.
- 그럴때 우리는 기본적으로 제공되는 기능/ 채널 둘중에 무엇을 선택할지는 4가지사항을 고려하면 된다.
- 데이터의 소유권을 이전하는가? -> 채널
- 구조체 내부 상태를 보호하고자하는가? -> 기존
- 논리적으로 조정해야되는가?(기아, 데드락 등)-> 채널
- 성능상의 임계 영역인가? -> 기존
'프로그래밍 > golang' 카테고리의 다른 글
| concurrency in go(3) (0) | 2023.01.04 |
|---|---|
| concurrency in go(2) (0) | 2023.01.03 |
| google go style guide 공부 (0) | 2022.12.12 |
| golang 팀내 테스트 코드 작성 (0) | 2022.11.20 |
| golang style guide (0) | 2022.11.20 |