Concurrent와 Parallel의 차이 by object

Concurrency(병행성)와 parallelim(병렬성), 또는 concurrent programming(병행 프로그래밍)과 parallel programming(병렬 프로그래밍)의 차이를 지금까지 깊게 생각해본 적이 없었다. 막연히 concurrent programming은 예전 운영체제 시간에 뮤텍스와 데드락을 배울 때 봤었고, 병렬 프로그래밍은 OpenMP, MPI를 배울 때 자주 봤었다. 그런데 이 둘은 생각보다 구분이 뚜렷이 되고 있었다. 그걸 지금까지 제대로 몰랐다.

참고 글: Concurrent and Parallel Are Not The Same

위의 글을 보면 concurrent와 parallel이 같지 않다고 명확히 말하고 있다. 사실 이 둘은 경계가 모호하게 느껴져 아무렇게나 사용되었다. 일단 한 줄로 요약하면:

Concurrency는 프로그램의 성질이고 parallel execution은 기계의 성질이다.
Concurrenty is a property of the prgoram and parallel execution is a property of the machine.

이것만 가지고는 여전히 긴가민가 한다. 먼저 concurrency부터 이야기를 하면, 어떤 프로그램이나 알고리즘이 순서에 상관없이 동시에 수행될 수 있다면 concurrent하다고 말한다. 예를 들어, 1부터 100까지 숫자를 더하는 과정을 생각해보면 숫자 100개를 여러 부분 집합으로 나눈 뒤 동시에 부분합을 구한다. 그리고 이 부분합을 다시 더하면 원래 얻고자 하는 값을 얻을 수 있다. 이 때 이 알고리즘은 concurrent하다라고 말한다.

그런데 이 알고리즘이 정말 물리적으로 병렬로 돌아갈지 아닐지는 이 알고리즘이 어떤 하드웨어 위에서 돌아갈지 알아야만 확답할 수 있다. 방금 이야기한 알고리즘이 멀티 프로세서 머신에서 돌아가야 병렬 실행된다라고 말한다. Parallel execution은 따라서 프로그램의 성질보다는 하드웨어의 성질이다.

Concurrent한 프로그램은 싱글코어 머신에서도 분명 돌아간다. 뮤텍스, 데드락은 싱글코어에서도 얼마든지 그 의미를 갖는다. 멀티스레드 프로그램이 비록 물리적인 제약으로 싱글코어에서 시분할 형태로 돌아가지만 겉으로는 concurrent하게 작동한다고 속일 수 있다. 반대로 아무리 멀티스레드로 작성된 프로그램이라 하더라도 멀티코어가 아니면 병렬로 작동한다고 말하지 못한다.

대충 이 정도면 병행과 병렬, concurrent와 parallel의 차이가 다소 이해가 되었을 것이다. 몇 가지 실제 예를 적용해보면:

  • OpenMP, MPI, CUDA 같은 프로그래밍 방법론은 병행 프로그래밍 보다는 병렬 프로그래밍이 옳은 표현이다. 언급한 세 방법론은 모두 물리적으로 제공되는 다양한 병렬 하드웨어를 활용하니까 말이 된다.
  • 멀티스레드 프로그램에서 벌어지는 각종 버그를 concurrency bug라고 부르는데, 굳이 하드웨어가 반드시 병렬성을 지원하지 않더라도 논리적으로 발생하니까 concurrency라는 말이 옳다.
  • 보통 프로그램에서 병렬성(parallelism)을 찾는다고 하지 병행성을 찾는다고는 말 안 한다. 약간 모호하기는 하나 결국 물리적으로 병렬 실행이 가능한 코드를 찾는 것이니 병렬성이 더 합리적으로 보인다.
  • 어떤 함수에 락을 무식하게 크게 걸면 병행성(concurrency)가 나빠진다고 말한다. 병렬성이 나빠진다고는 말 안 한다.

이제 위키 설명에서 이러한 미묘한 차이를 느낄 수 있다 (영어 번역은 귀찮아서 안 했음 죄송..)

  • Parallel computing is a form of computation in which many calculations are carried out simultaneously, operating on the principle that large problems can often be divided into smaller ones, which are then solved concurrently ("in parallel"). => 역시 병렬로 실행됨이 강조된다.
  • Concurrent computing is a form of computing in which programs are designed as collections of interacting computational processes that may be executed in parallel. => 동시에 실행 될 수도 있음을 강조. 이에 뒤 따르는 설명을 보면
    • Concurrent programs can be executed sequentially on a single processor by interleaving the execution steps of each computational process, or executed in parallel by assigning each computational process to one of a set of processors that may be close or distributed across a network. => 병행 프로그램은 싱글코어 머신에서는 시분할 방법으로, 겉으로는 동시에 실행되는 것처럼 보이지만, 결국 순차적으로 실행되고, 물리적인 병렬 머신에서는 계산 작업을 분배해 동시에 실행됨을 말하고 있다.

핑백

덧글

  • fromnil 2010/01/12 13:15 # 답글

    오묘한 차이가 느껴집니다! 잘 읽고 갑니다. ^^
  • NoSyu 2010/01/12 13:48 # 삭제 답글

    이번 학기에 프로그래밍 언어론 시간에 그 둘의 차이에 대해 배우고 정리를 하였습니다.
    그렇지만 블로그에 적지 않아서 잠시 제목만 보고 헷갈리고 말았습니다.OTL
    정리글 고맙습니다.
  • sloth 2010/01/12 14:05 # 삭제 답글

    Concurrenty is a property of the prgoram and parallel execution is a property of the machine.
    이 한문장으로도 핵심을 푹 쑤셔주시는것 같읍니다..........
  • kernel0 2010/01/13 01:15 # 삭제 답글

    Programming With Posix Threads 책 1.2챕터를 보셔도 도움이 될 겁니다.
  • object 2010/01/13 13:25 #

    책이 없어서... 목차를 보고 약간 미리 보기를 보니 잘 쓰여있을 것 같군요.
  • tomowind 2010/01/13 03:27 # 답글

    형의 연구분야는 parallelism, 제 연구분야는 concurrency네요. ㅎㅎ
  • tomowind 2010/01/13 04:49 # 답글

    예전 글 중에 PIN 소개하는 글이 있지 않았어요? 거기서 static and dynamic instrumentation 관련해서 설명한거 같은데 그 글을 못찾겠어요.

    저는 요즘 static and dynamic instrumentation의 차이가 뭘까 고민하다가 얼마전에 stack overflow에 질문을 했는데 전혀 답이 없네요. 이 내용을 좀 다뤄주시면 고마울듯... -.-;

    http://stackoverflow.com/questions/2038625/pros-cons-of-static-and-dynamic-instrumentation
  • object 2010/01/13 08:51 #

    흠... 좋은 질문이로군.. 개별적으로 얘기하자고 ㅎㅎ 아마 그 글은 지금 비공개로 해놓았을거야. 좀 오류가 있어서;;
  • Lyn 2010/01/14 15:37 # 삭제 답글

    호.. 미묘한 차이가 있었군요
  • corona 2011/04/05 13:29 # 삭제 답글

    이번에 OS강의 중 concurrent 와 parallel의 차이에 대해 궁금해 찾아보다 좋은글 보고 갑니다.
    OS강의는 처음이라 많은것들이 새롭고 어렵고 한데 ㅎㅎ 개념이해에 도움이 된것 같아요.^^
  • steadyslow 2011/06/16 12:43 # 삭제 답글

    Concurrency(병행성)와 parallelim(병렬성) -> 에서 Parallelism. s가 빠졌네요.
  • 쏭섭 2011/11/23 13:12 # 삭제 답글

    글이 좋아서 제 블로그에 담고 싶네요. 실시간 임베디드 시스템 공부하는데 의미 구분에 좋은 글이네요
  • Allier 2015/03/25 18:33 # 삭제 답글

    좋은 글 감사합니다. 이해하는데 많은 도움이 되었어요.
  • Allier 2015/03/25 18:33 # 삭제 답글

    좋은 글 감사합니다. 이해하는데 많은 도움이 되었어요.
  • zumer 2017/03/21 11:10 # 삭제 답글

    좋은 글 감사합니다~~!!
댓글 입력 영역