티스토리 뷰

운영체제

Concurrency vs Parallelism

Bennett Kim 2018. 5. 2. 00:09

오늘은 동시성(Concurrency)과 병렬성(Parallelism)의 개념적 차이를 알아보겠습니다.


겉으로 보면 이 두 단어는 모두 뭔가가 동시에, 같이 일어나는 성질을 뜻한다는 것을 알 수 있습니다. 그렇다면 이 둘은 같은 의미를 가진 단어 일까요?


아닙니다.


동시성과 병렬성은 어느정도 관련은 있지만 본질적으로 같지 않습니다.


하드웨어적 관점에서는 이 둘을 어느정도 의미적으로 혼용해서 쓰는 경우도 종종 있습니다만, 소프트웨어적 관점에서는 엄연히 이 둘을 구분 짓습니다.


그렇다면 어떤 차이가 있을까요? 예를 한번 들어보겠습니다.


연구원 Bennett은 연구를 위한 툴을 제작하는 도중에 예상치 못한 memory leak이 발생하여 매우 난감해 하고 있었습니다. 그렇게 힘든 와중에 배가 고파졌습니다. Bennett은 엉킨 머리를 refresh할겸 밥을 먹으러 식당에 갔습니다. Bennett은 무척 배가 고팠기 때문에 얼른 식사를 하고 싶었습니다. 


식사를 하기 위해 Bennett은 젓가락으로 반찬을 집고, 반찬을 밥에 올리고, 숟가락으로 밥을 퍼서 입에다 넣고, 충분히 씹다가 삼켰습니다.


식사를 하던 도중 Bennett은 자신이 동시성과 병렬성의 관점에서 식사를 진행했다는 것을 깨닫고 매우 놀랐습니다. 


자 그럼 Bennett은 여기서 어떻게 동시성과 병렬성을 발견했을까요?

우리가 식사를 하기 위해서는 앞서서 말씀드렸듯이 [1] 젓가락으로 반찬을 집고, [2] 반찬을 밥에 올리고, [3] 숟가락으로 밥을 퍼서 입에다 넣고, [4] 충분히 씹다가 삼켰습니다.(이를 좀 더 세분화 할 수 있지만 글이 너무 verbose해질까봐 삼가하겠습니다.)


식사라는 행위는 [1], [2], [3], [4]를 통해서 이루어졌습니다.

이렇듯 식사를 위해 [1], [2], [3], [4]가 모두 이루어져야 됩니다. 이를 동시성이라 합니다. 여러 동작들이 서로 연결되어 하나의 행위를 만들어내고 있죠. 하지만 이들은 동시에 일어나진 않았습니다. [2]반찬을 밥에 올리고 [4](입에 아무것도 없는 상태에서) 충분히 씹다가 삼키는 것을 동시에 한다고 해서 식사를 한다고 말할 수 없기 때문입니다.


그럼 이제 어느 부분에서 병렬성이 일어났을까요? 

[1]에서 젓가락으로 반찬을 집는데 오른쪽 손의 손가락 5개를 동시에 이용했습니다. 그리고 [3]에서 오른쪽 손의 손가락 5개를 동시에 이용하여 숟가락을 집었습니다. [4]에서는 윗 턱과 아랫턱을 동시에 사용하여 음식을 씹었습니다. 


제가 전달하고 싶은 의미를 아시겠나요? 병렬성은 어떤 동작을 좀 더 빠르게 하기 위해 사용하는 기법입니다. 만약 숟가락과 젓가락을 집는데 두개의 손가락만 쓴다면, 윗 턱만 가지고 음식을 씹으려고 한다면 어떻게 될까요?

아 그럼 굉장히 불편하고 밥을 먹는 속도가 엄청 느려질 것입니다. 


자 그럼 위의 예시를 컴퓨터 공학적으로 다시 정리해보겠습니다.

동시성은 최소 두 개의 스레드가 하나의 프로그램를 구성할 때를 의미합니다. 그리고 이 동시성은 프로그램을 좀 더 용이하게 만들기 위해 사용합니다. 위 예시에서 [1], [2] 동작을 빼서 [3], [4] 동작으로 밥만 먹어도 식사는 됩니다. 그러나 그 식사는 영양가 있는 좋은 식사는 될 수 없겠죠.


병렬성은 최소 두 개의 스레드가 동시에 실행되는 것을 의미합니다. 그리고 이 병렬성은 프로그램의 속도를 높이기 위해 사용합니다. 


추가적인 예로 다음과 같은 각각 2분이 걸리는 연산을 하고자 합니다.

1. C = A + B

2. E = C+ D

두 번째 연산을 진행하기 위해서는 C라는 값을 알아야하는데 C는 첫 번째 연산에 의존합니다. 이를 Data dependency라고 하며 이렇게 되면 두 번째 연산을 하고 싶어도 첫 번째 연산이 C에 값을 write해야만 실행될 수 있습니다. 즉 모든 연산을 위해서 드는 총 소요시간은 2분이 걸립니다.


그런데 다음과 같은 연산으로 바꿔버린다면요?

1. C = A + B

2. E = D1 + D2

이렇게 되면 첫 번째 연산과 두 번째 연산을 동시에 실행할 수 있습니다. Data dependency를 제거했기 때문이죠! 즉 모든 연산을 위해서 드는 총 소요시간은 1분입니다. 


이렇듯 병렬성은 프로그램을 좀 더 빠르게 하기 위한 기법이고, 동시성은 프로그램을 좀 더 용이하게 하기 위함입니다.


언뜻보기엔 같아보였지만 이렇게 예시를 들어보니 그 차이가 명확해졌습니다.

감사합니다.

댓글