1. 동시성과 병렬성의 차이

- 동시성 은 "코드"의 속성, 병렬성은 "프로세스"의 속성이다.

  ㄱ. 우리가 작성한 코드들은 병렬로 실행되기를 바라면서 작성한다.

  ㄴ. 동시성 코드를 작성했다 할지라도, 실제로 병렬로 실행되는지 의 여부조차 모를 수가 있다.

  ㄷ. 병렬처리인지 아닌지는 컨택스트에 의해 결정된다. 

 

2. 대부분의 범용성 있는 언어들은 OS 스레드와 1:1 맵핑된 수준의 추상화 수준을 제공한다. 이는 다시 말해 동시성이 어려운 이유를 

야기하는 문제 가 실질적으로도 일어나는 레이어 계층이기도 하다. 

 

3. CSP 란 무엇인가 

- 상호작용 하는 순차적 프로세스들의 약자이다. 호어 가 제시한 논문의 약자로 "프로그래밍에서 두 가지 기본요소인 입력 및 출력이 간과되고 있으며, 특히 동시에 실행되는 코드의 경우에는 더욱 그렇다고 말한다." 논문에 제시된 코드를 보면 Go의 채널과  상당히 유사함을 알 수 있다. 

 

4. Go와 다른 대중적인 어어의 차이점 은 무엇인가?

 - OS 스레드 및 메모리 접근 동기화 수준에서의 언어 추상화 체인 이 기본언어의 틀인 반면, Go에서는 고 루틴 및 채널의 개념으로 이를 대체한다. 이에 고에서는 다음과 같은 통상적인 방법으로 코딩한다. 고루틴은 가볍기 때문에 고루틴 생성을 걸정할 필요는 없다. 

 

*자바로 작성된 스프링 프레임워크 와 고 의 에코 프레임워크는 어떻게 작동하는가?

각 요청마다 스프링 프레임워크는 아파치 톰캣 웹서버로부터 스레드풀에서 스레드를 할당받아 처리하고 스레드를 반환한다.

각 요청마다 고에서는 고 루틴을 생성해 처리하고 종료한다.

이것은 어떤 것이 더 빠르다고 할 수 없지만 GO에서는 리소스를 효율적으로 사용한다고 말할 수 있다.

 

5. Go의 동시성에 대한 철학

- 통신을 통해 메모리를 공유하고, 메모리 공유를 통해 통신하지 말라 이다. Go에서는 Sync 패키지를 이용해 전통적인 잠금 메커니즘을 사용할 수도 있고 혹은 채널을 이용해서 해결할 수 도 있다. 이에 언제 어떤 방식을 써야 하는지에 대해 트리를 이용해 제공하고 있다.

- 데이터 소유권을 이전하려는가? => 채널을 사용하면 동시성 코드를 다른 동시성 코드와 함께 구성할 수 있다는 점이다.

- 구조체의 내부 상태를 보호하고자 하는가? => 메모리 접근 동기화 기본요소를 사용하수 있는 최적의 선택지이다.

- 여러 부분 논리를 조정해야 하는가? => 채널을 사용한다면 Select 문을 활용해 긴급한 복잡성을 훨씬 쉽게 제어할 수 있다.

- 성능상의 임계영역 인가? => 해당영역 이 프로그램의 나머지 부분보다 현저하게 느린 주요 병먹 지점이라면, 메모리 접근 동기화 기본요소를 사용하자 이다.

 

고 루틴을 사용해 문제 공간을 모델링하고 작업 중 동시에 수행되는 부분을 표현하기 위해 고루틴을 사용하자.

단순화를 목표로 하고, 가능하면 채널을 사용하며 고 루틴을 무한정 쓸 수 있는 자원처럼 다루어라.!

 

+ Recent posts