티스토리 뷰

개요

 

Don't communicate by sharing memory, share memory by communicating.

고언어에서 말하는 문장의 의미는 무엇일까?

실제 코드로 들여다보기 이전에 비유로서 개념을 챙겨보았다.

 

링크1: https://blog.golang.org/share-memory-by-communicating

 

기존 언어

 

communicate by sharing memory

 

대부분의 기존 언어들은 데이터 구조 (=메모리) 공유해두고

쓰레드 (=일꾼)들이 메모리에 접근하면서 서로간의 통신을 하였다.

 

쓰레드가 다른 쓰레드들이 접근 못하게 Lock 걸어놓고 공유 메모리에 접근하여 작업을 하고

작업이 완료되면 Unlock 해준다.

그때서야 다른 쓰레드는 공유 메모리에 접근해서 자신의 일을 있다.

보통 이럴때 Lock, Unlock 하는 녀석이 Mutex 이다.

 

다른 방법으로는 파이썬의 쓰레드-안전 (thread-safe) 큐가 있다.

 

Golang

 

share memory by communicating.

 

Golang 에서는 채널로 통신하면서 공유할 내용을 전달한다.

핵심 컨셉은 C. A. R Hoare CSP (Communicating Sequential Processes) 에서 가져온 것이다.

 

 

비유: 여러명이 함께 요리를 한다면?

 

위와 같은 설명만으로는 머리속으로 들어오지 않았다.

여러명이 함께 피자를 만든다는 컨셉으로 비유를 해보려 한다. (혹시나 틀린 부분이 있으면 댓글 부탁드립니다.)

 

쓰레드들: 일꾼 A, B, C 각각 도우를 만들고, 토핑을 하고, 화덕에 굽는 일을 한다.

 

기존 언어

 

일꾼 A, B, C 재료와 도구가 있는 요리실 (= 메모리) 공유한다.

이들의 대화를 들어보자.

 

B 요리실로 들어가며 문을 잠근다. "? 아직 빵을 안만들었네?" 그리고  나온다.

A 들어가려 했지만 문이 잠겨 있었다. B 나오는 보며 들어가서 문을 잠근후

- 도우를 만든다음 나온다.

C 요리실로 들어가며 문을 잠궜지만, 아직 토핑이 안되었길래 나온다.

B C 나오는 보고 냉큼 들어가서 토핑을 하고

C 드디어 들어가 화덕에 굽는다.

 

 

어딘가 매끄럽지 못하다. 여기서는 그래도 피자를 굽긴 했지만 심지어는 C 토핑도 안된 피자를 화덕에 구울 수도 있다.

 

 

Golang

 

일꾼 A, B, C 1, 2, 3층에 자리잡은 다음, 층간 음식 이동이 가능한 음식 엘리베이터를 설치했다.

채널 준비 완료

 

A 밀가루를 만든 다음에 엘리베이터에 넣고 B 있는 2층에 보낸다.

B 엘리베이터 도착 소리를 듣고, 도우를 꺼내어 토핑을 한다. 그리고 C에게 보낸다.

C 엘리버에터가 도착하는 보고는 피자를 화덕에 넣어 굽는다.

 

매끄럽기도 하지만, 이런게 바로 우리가 일을 하는 방식이지 않은가?

 

반응형

'golang' 카테고리의 다른 글

Go runtime AND goroutine  (0) 2019.07.23
Golang 의 동시성을 이용한 소수 찾기  (0) 2019.07.22
Concurrency Is Not Parallelism  (0) 2019.07.19
Slack Slash Command - 영한 번역(3)  (0) 2019.07.16
Slack Slash Command - 영한 번역(2)  (0) 2019.07.15
반응형
잡학툰 뱃지
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함