Search

동시성과 병렬성 (by Rob Pike)

subtitle
동시는 동시에하는 것이고 병렬은 병렬적으로 하는 것이다. 끄덕.
Tags
개발 일반
Created
2021/08/15
2 more properties

동시성과 병렬성: 둘 다 동시에 하는 거 아니야?

구글 개발자이자 Go 개발에 참여한 Rob Pike는 이렇게 말했다. 동시성과 병렬성은 엄연히 다르다.
동시성은 여러 일을 한꺼번에 다루는 데 관한 것이다. 병렬성은 여러 일을 한꺼번에 실행하는 데 관한 것이다. - Rob Pike(Google Developer, Go 개발자) / 7가지 동시성 모델
이 말만 보면 엄연히 같아보이는데?
인용된 말은 7가지 동시성 모델이라는 책에서 가져왔는데, 이 말을 아무리 봐도 동시성과 병렬성의 차이를 모르겠다. 별 차이 없어보이는 말을 하고 끄덕이는 고이즈미 같다.
..음! (끄덕)

롭 파이크의 설명과 예시, 예시, 예시

저 말만 봐서는 오히려 병렬성과 동시성을 구분하는 게 더 헷갈린다. 롭 파이크가 실제로 컨퍼런스에서 동시성과 병렬성을 설명한 영상은 조금 더 낫다. (그래도 영상에는 롭 파이크의 설명이 부족했다는 댓글 의견이 많긴 하다)
영상 15분 정도까지가 동시성과 병렬성에 대한 설명이다. 그 이후부터는 고루틴을 활용한 go 홍보 .. ㅋ
요즘 프로그래밍 언어를 보면 객체지향적이다. 하지만 세상은 그보다 더 복잡하다. 세상은 모든 것이 동시에 일어난다. 유저가 클릭하고 기다리는 동시에 무언가를 보고 또 다른 페이지를 연다. 동시성을 만든다는 것은 동시에 실행하는 것을 만드는 것이며 통제 흐름Threads of control을 스위칭하는 것이다.
많은 사람들이 '나 동시성 툴 만들었어!'라고 하지만 병렬과 동시는 다르다. 많은 프로세서에서 실행될 수록 많은 리소스를 차지하게 되고 프로그램은 더 느려진다. 사람들은 병렬성과 동시성을 섞어서 혹은 교체 가능한 단어라고 생각하지만 그렇지 않다.
그렇다면 동시성은 뭘까?
동시성
동시성이란 '독립적으로 실행할 수 있는 것들의 조합'composition of independently executing things이다. 예를 들어 커널은 운영체제에서 마우스, 키보드, 디스플레이, 네트워크 등 여러 디바이스 드라이버를 통해 하드웨어 리소스(CPU, 메모리 등)를 컨트롤한다. 이것들은 모두 커널에서 독립적으로 존재하는데, 이 명령을 실행하는 방법이 꼭 병렬적이어야하는 건 아니다.
만약 CPU 하나에서 커널이 돌아간다고 해보자. 하나의 CPU에서는 하나의 작업 밖에 하지 못한다. 마우스 입력, 키보드 입력, 화면 조정 등 여러 가지 일을 동시에 처리하기 위해 여러 스레드를 두고 콘텍스트 스위칭을 하며 번갈아 작업한다. 이 작업은 아주 빠르기 때문에 유저는 그 차이를 알아차리지 못한다.
analogy1
내 아내는 교사다. 다른 교사들과 마찬가지로 그녀는 멀티태스킹에 능숙하다. 어느 한 시점에서 보면 그녀는 한 가지 일을 수행하지만, 언제나 여러 일을 한꺼번에 다루어야 한다. 한 학생이 책을 읽는 것을 듣는 동시에, 떠들썩한 교실을 진정시키거나 다른 학생의 질문에 답을 주는 식이다. 이것은 동시성이지 병렬성은 아니다. 즉, 내 아내는 한 명뿐이다. - 7가지 동시성 모델 p.26
음 조금 감이 오는 것 같다. 좀 더 예시를 통해 유추해보자.
analogy2
암살교실 | 출처: 나무위키
갑자기 노란 문어가 나와서 당혹스럽겠지만.. 좋은 예시가 될 것 같았다. 뒤로가기에서 손 떼고 일단 봐주세요.
암살교실이라는 만화에 대해 짧게 소개하자면, 정부에서 학생들을 모아놓고 괴생명체이자 선생님인 코로센세를 죽이면 엄청난 보상을 약속한다. 하여, 학생들은 공부하는 와중에 코로센세를 죽이려 하고 코로센세는 학생들의 암살을 피하는 동시에 학생들이 훌륭하게 성장할 수 있도록 공부를 가르친다.
아,, 나 너무 오덕같은가,,,
코로센세는 짧은 시간 내 학생들을 가르치기 위해 '동시적'으로 학생들을 가르친다. 마치 분신술을 쓴 것 같지만 코로센세는 마하 20(초속 약 6.8km/s)로 움직이기 때문에 몸뚱이는 하나지만 여러 학생들에게 맞춤형 강의를 동시에 할 수 있다. 그런 와중에 암살을 피하기도 한다. 한번에 여러 작업을 하는 것, 이런 것을 동시성이라고 한다.
병렬성
그렇다면 병렬성은 뭘까? 여러 CPU, 멀티 코어, 여러 인스턴스 등 어떤 작업을 실행할 수 있는 수행자가 여럿이고 그 작업을 동시에 실행하는 것을 말한다.
analogy
다시 암살교실을 보자. 암살교실에서의 병렬성은 다수의 학생들이 코로센세를 죽이려고 동시에 공격하는 것과 마찬가지이다.
암살교실 코로센세 | 출처 Yusei Matsui..?
요런 느낌
한편, 프로세서 또는 실행 인스턴스가 여러 개여도 병렬이라고는 할 수 없다. 여러 인스턴스에서 동시에 실행되어야 병렬적이라고 할 수 있지, 여러 인스턴스가 존재한다고 해서 병렬이라고는 할 수 없다.
병렬성 + 동시성
롭 파이크 영상 15분 이후에는 Gopher(Golang 마스코트)가 C# 매뉴얼을 정리하는 예시가 나온다. 동시성과 병렬성의 차이를 설명하는 동시에 동시성과 병렬성을 적절히 섞음으로써 수 십가지의 디자인이 나올 수 있다고 말한다.
병렬성 + 동시성
여러 CPU에서 멀티 스레드를 가지고 여러 작업을 실행하거나 하나의 큰 작업을 여러 개의 하위 작업으로 쪼갠 뒤 병렬적으로 동시 실행하거나... 병렬성과 동시성을 조합해 여러 디자인을 만들 수 있다.
어쨌든 두 속성에는 차이가 있지만 섞어서 사용해 효율적인 프로그램을 만들 수 있다.
'-'

References

7가지 동시성 모델