[Go 동시성 프로그래밍] 읽기 - 2장 코드 모델링 : 순차적인 프로세스 간의 통신
Go 동시성 프로그래밍 책의 2장 코드 모델링 챕터를 읽고, 읽은 내용을 정리해봅니다.
동시성과 병렬성의 차이
동시성(concurrency) : 동시에 실행되는 것처럼..
병렬성(parallelism) : 실제로 물리적으로 동시에..
코드를 모델링할 때 동시성과 병렬성의 차이는 객체의 추상화에 큰 영향을 미친다.
동시성은 코드의 속성이고, 병렬처리는 실행중인 프로그램의 속성이다. 이에 의해...
첫째, 우리는 병렬적인 코드를 작성하는 것이 아니라, "병렬"로 실행되기를 바라면서 "동시성" 코드를 작성하는 것이다.
둘째, 동시성 코드가 실제로 병렬로 실행되는지 여부를 모를 수도 있다.
셋째, 병렬 처리인지 아닌지는 시간, 또는 컨텍스트에 의해 결정된다. (상대적이다) 원자성에서의 컨텍스트 정의 - 원자적이라고 판단할 수 있는 범위 - 와는 다르게, 두 개 이상의 연산이 병렬적으로 실행됬다고 여길 수 있는 범위로 정의해볼 수 있다. 예를 들어, 컨텍스트가 5초 동안이라면 1초짜리 연산 두개는 병렬 실행이 아니지만, 컨텍스트가 1초라면 병렬 실행으로 볼 수 있다.
CSP란 무엇인가?
상호작용하는 순차적 프로세스들(Communicating Sequential Processes) - 1971년 Charles Antony Richard Hoare가 ACM에 발표.
프로세스 미적분/대수(process calculus/process algebras)라는 형식 표현법으로 동시성 시스템을 수학적으로 모델링.
프로세스(함수)간의 입력과 출력이 언어의 기본 요소로 간주되어야 한다고 주장.
채널의 기반이 됨.
동시성을 지원하는 언어의 장점
Go의 동시성에 대한 철학
동시성을 관리하는 decision tree
IF 성능 상의 임계 영역인가?
{
기본 요소 사용
END
}
ELSE
{
IF 데이터의 소유권을 이전하려고 하는가?
{
채널 사용
END
}
ELSE
{
IF 구조체의 내부 상태를 보호하려고 하는가?
{
기본 요소 사용
END
}
ELSE
{
IF 여러 부분의 논리를 조정해야 하는가?
{
채널 사용
END
}
ELSE
{
기본 요소 사용
END
}
}
}
}
데이터의 소유권을 이전하려고 하는가?
채널은 한번에 하나의 동시 컨텍스트만 데이터 소유권을 가져야 한다는 의도를 채널의 타입에 인코딩함으로써 메모리의 소유권 개념을 전달할 수 있게 도와준다.
메모리 내부 큐를 통해 생산자와 소비자를 구분할 수 있다.
구조체의 내부 상태를 보호하고자 하는가?
어떤 타입을 넘어서 잠금이 드러나는 것을 발견하면 경계해야 한다.
여러 부분의 논리를 조정해야 하는가?
Go 채널과 select를 이용하면 복잡성을 훨씬 쉽게 제어할 수 있다.
동시성 코드가 작동하는 방식, 데드락 또는 레이스가 발생하는 이유, 기본 요소를 사용하는 방식을 이해하는데 어려움을 겪고 있다면 채널을 사용해야 한다는 신호이다.
성능 상의 임계영역인가?
메모리 접근 동기화를 사용하기 때문에 채널이 더 느릴 수 있다.
// fin.