병렬 프로그래밍과 동시 프로그래밍의 차이점은 무엇입니까?


44

동시 프로그래밍을 볼 때 일반적으로 동시 및 병렬이라는 두 가지 용어가 사용됩니다.

그리고 일부 프로그래밍 언어는 특히 Java 와 같은 병렬 프로그래밍 지원을 요구합니다 .

이것은 병렬 및 동시 프로그래밍이 실제로 다르다는 것을 의미합니까?


10
그렇습니다. 동시 프로그래밍과 병렬 프로그래밍은 다릅니다. 예를 들어, 컨텍스트 전환을 통해 동일한 코어에서 두 개의 스레드 (또는 프로세스)를 동시에 실행할 수 있습니다. 두 개의 스레드 (또는 프로세스)가 두 개의 다른 코어 (또는 프로세서)에서 실행되면 병렬 처리됩니다. 따라서 전자의 경우 (동시성) 병렬 처리는 "가상"일 뿐이며 후자의 경우에는 병렬 처리가 있습니다. 따라서 모든 병렬 프로그램이 동시에 이루어 지지만 그 반대는 아닙니다.
Massimo Cafaro

1
여기서 조심하십시오. 언어 지원 (예 : 새로운 구문으로 언어 확장) 또는 낮은 수준의 접근 방식 (예 : MPI 및 OpenMP의 경우와 같이 라이브러리 사용)을 통해 동일한 결과를 얻을 수 있습니다. 어쨌든, 현재 멀티 코어 프로세서와 SMP를 지원하는 운영 체제의 경우, OS가 다른 코어에서 프로그램 실행 스레드를 예약하면 이전 단일 코어 프로세서에서 실행되는 경우 동시에 실행되는 프로그램이 병렬로 실행될 수 있습니다. 따라서 오늘날의 구별은 약간 "흐리게"나타납니다.
Massimo Cafaro

3
가벼운 대기 시간 상수에 사용하는 것. 동시성에서는 빛의 대기 시간 속도가 한 클럭주기 인 것으로 가장합니다. 동시에 하나의 서버가 옆집에 있다고 가정하고 분산에서 하나의 서버가 화성에 있다고 가정합니다.


1
Robert Harper는 두 개의 블로그 게시물 "Parallelism is not concurrency""Parallelism and Concurrency, Revisited" 에서이 문제에 대해 설명합니다 .
바질

답변:


26

동시성 (공유 리소스에 대한 액세스 관리)에서 병렬 처리 (추가 계산 단위를 사용하여 단위 시간당 더 많은 작업 수행)를 구별하십시오. 병렬 처리가 가장 쉽고, 비 순차적 사고 방식을 수립하는 데 도움이되므로 가장 먼저 가르칩니다.

Dan Grossman의 "소포 모릭 * 공유 메모리 병렬 처리 및 동시성 소개"(2013 년 11 월 16 일 버전)


21

Nish의 답변 외에도 Haskell의 병렬 및 동시 프로그래밍에 대한 Simon Marlow의 저서 또는 더 짧은 자습서를 추천하겠습니다 . 하스켈의 관점에서 첫 번째 질문에 대답하므로 이론적으로 기울어 진 독자에게 더 적합 할 수 있습니다 (Haskell은 순수하게 기능적이고 게으른 프로그래밍 언어로 다른 언어보다 수학에 훨씬 더 가깝습니다).

거기에서 인용 :

많은 분야에서 병렬과 동시라는 단어는 동의어입니다. 기본적으로 다른 개념을 설명하는 데 사용되는 프로그래밍에서는 그렇지 않습니다.

병렬 프로그램은 계산을보다 빠르게 수행하기 위해 여러 계산 하드웨어 (예 : 여러 프로세서 코어)를 사용하는 프로그램입니다. 계산의 다른 부분은 동시에 (병렬로) 실행되는 다른 프로세서에 위임되므로 계산이 순차적으로 수행 된 경우보다 결과가 더 빨리 전달 될 수 있습니다.

반대로, 동시성은 다중 제어 스레드가있는 프로그램 구조화 기술입니다. 일반적으로 제어 스레드는 "동시"실행됩니다. 즉, 사용자는 자신의 효과가 인터리브 된 것을 볼 수 있습니다. 이들이 실제로 동시에 실행되는지 여부는 구현 세부 사항입니다. 동시 프로그램은 인터리브 된 실행을 통해 단일 프로세서 또는 여러 물리적 프로세서에서 실행될 수 있습니다.

튜토리얼 (p.4)의 나머지 부분을 읽는 것이 좋지만이 섹션의 나머지 부분은 효율성, 모듈성 및 결정 성과 같은 프로그램의 양적 및 질적 특성과 프로그래밍 패러다임을 연결하므로이 섹션의 나머지 부분을 인용하겠습니다.

병렬 프로그래밍은 효율성과 관련이 있지만 동시 프로그래밍은 여러 독립 외부 에이전트 (예 : 사용자, 데이터베이스 서버 및 일부 외부 클라이언트)와 상호 작용해야하는 프로그램을 구성하는 것과 관련이 있습니다. 동시성은 이러한 프로그램을 모듈화 할 수있게합니다. 사용자와 상호 작용하는 스레드는 데이터베이스와 통신하는 스레드와 다릅니다. 동시성이 없으면 이러한 프로그램은 이벤트 루프 및 콜백으로 작성해야합니다. 실제로 많은 언어에서 동시성이 너무 비싸거나 너무 어렵 기 때문에 동시성이 사용 가능한 경우에도 이벤트 루프 및 콜백이 종종 사용됩니다. 사용하다.

"제어 스레드"라는 개념은 순전히 기능적인 프로그램에서 의미가 없습니다. 관찰 할 효과가없고 평가 순서가 관련이 없기 때문입니다. 따라서 동시성은 효과적인 코드를위한 구조화 기술입니다. Haskell에서는 IO 모나드의 코드를 의미합니다.

결정 론적 프로그래밍 모델과 비결정론 적 프로그래밍 모델 사이의 관련 차이점이 있습니다. 결정 론적 프로그래밍 모델은 각 프로그램이 하나의 결과 만 제공 할 수있는 모델이지만 비결정론 적 프로그래밍 모델은 실행의 일부 측면에 따라 다른 결과를 가질 수있는 프로그램을 허용합니다. 동시 프로그래밍 모델은 예상 할 수없는 시간에 이벤트를 발생시키는 외부 에이전트와 상호 작용해야하므로 반드시 비 결정적입니다. 그러나 비결정론은 몇 가지 주목할만한 결점을 가지고있다.

병렬 프로그래밍의 경우 가능하면 결정적 프로그래밍 모델을 사용하고 싶습니다. 목표는 응답에 더 빨리 도달하는 것이므로 프로세스에서 프로그램을 디버그하기 어렵게 만들지는 않습니다. 결정적 병렬 프로그래밍은 두 가지 측면에서 최고입니다. 테스트, 디버깅 및 추론은 순차 프로그램에서 수행 될 수 있지만 프로세서가 추가되면 프로그램이 더 빨리 실행됩니다. 실제로 대부분의 컴퓨터 프로세서 자체는 파이프 라이닝 및 여러 실행 단위의 형태로 결정 론적 병렬 처리를 구현합니다.

동시성을 사용하여 병렬 프로그래밍을 수행하는 것이 가능하지만 동시성이 sacriffices 결정론 때문에 선택이 좋지 않은 경우가 많습니다. Haskell에서 병렬 프로그래밍 모델은 결정 론적입니다. 그러나 결정 론적 프로그래밍 모델이 모든 종류의 병렬 알고리즘을 표현하기에는 충분하지 않다는 점에 유의해야합니다. 내부 비결정론, 특히 솔루션 공간 검색과 관련된 문제에 의존하는 알고리즘이 있습니다. Haskell에서이 클래스의 알고리즘은 동시성을 사용해서 만 표현할 수 있습니다.


20

동시성과 병렬 처리는 해결하고 야기하는 문제가 다르지만 독립적이지 않습니다.

동시성

두 작업을 동시에 실행 한다는 것은 두 작업의 개별 단계가 인터리브 방식으로 실행됨을 의미합니다. 병렬 처리를 무시하면 특정 시점에서 하나의 명령문 만 실행된다고 가정 할 수 있지만 다음 단계에서 어떤 태스크가 실행되는지 보장 할 수는 없습니다.

이것은 몇 가지 측면에서 유용합니다.

  • 한 프로그램에서 독립적 인 작업을보다 명확하게 프로그래밍 할 수 있습니다.
  • 컴퓨팅하는 동안 IO를 처리 할 수 ​​있습니다 (예 : GUI).
  • 한 번에 둘 이상의 프로그램을 실행할 수 있습니다 (OS 수준의 동시성).

주요 과제 중 일부는 다음과 같습니다.

  • 데이터 일관성을 유지하십시오.
  • 교착 상태라이브 록을 피하십시오 .
  • 동시 프로세스의 정확한 의미를 결정합니다.
  • 정확성을 보장하는 정적 속성을 결정하십시오.

병행

두 개의 태스크 를 동시에 실행 한다는 것은 명령문이 동시에 실행됨을 의미합니다 . 이것은 주로 다음에 유용합니다.

  • 프로그램을 병렬로 실행하여 (예 : 멀티 코어 시스템) 시스템 처리량을 향상시킵니다.
  • 한 번에 여러 CPU를 활용하여 개별 프로그램의 런타임을 향상시킵니다.
  • 많은 컴퓨터 (예 : 분산 데이터베이스)에서 IO를 활용하십시오.

주요 과제는 다음과 같습니다.

  • 병렬 처리를 사용할 수있는 알고리즘을 허용하고 개발하는 파티션 문제.
  • 계산 장치 간의 종속성 및 통신을 최소화하십시오.
  • 동시성으로 인한 모든 문제 : 적어도 메모리의 관점에서 볼 때 병렬 프로그램은 메모리 액세스의 직렬화로 인해 동시 프로그램처럼 보입니다.
  • 최적의 하드웨어 지원을 다루지 마십시오.

병렬 컴퓨팅과 분산 컴퓨팅을 구별하려면 이 질문 을 참조하십시오 .


4

약간 이상적인 답변, 아마도 ...

  • 동시성 은 프로그램 작성 방법의 속성입니다 . 포크 / 조인, 잠금, 트랜잭션, 원자 비교 및 ​​스왑 작업 등과 같은 구성을 사용하여 프로그램을 작성하면 동시에 수행됩니다.

  • 병렬 처리 는 프로그램 실행 방법의 속성입니다 . 프로그램이 둘 이상의 계산 단위에서 동시에 실행되면 병렬로 실행됩니다.


1

이에 대한 답변이 많이 있지만 혼란 스러울 수 있습니다. 나는 이런 식으로 생각하고 도움이 될 수 있습니까? :

동시 프로그래밍 은 실행 순서를 신경 쓰지 않는 코드입니다. Java는 동시 프로그래밍에는 좋지 않은 언어이지만 도움이되는 라이브러리와 프레임 워크가 있습니다. JavaScript는 동시 프로그래밍을위한 훌륭한 언어이며, 동시성 이 아닌 것을 작성하려고 할 때(예를 들어, 실행 순서를 강요하려는 경우)종종 어려운 경우가 있습니다. 동시 프로그래밍은 이벤트 중심 프로그래밍에 적합합니다 (실행 순서는 버튼을 클릭하거나 상자에 입력 할 때 작동하는 브라우저에서 실행되는 코드와 같은 이벤트 리스너에 의해 결정됨).

예를 들어 수백 개의 HTTP 요청을 작성하는 것이 있습니다. NodeJS에서 가장 간단한 해결책은 콜백 메소드를 사용하여 한 번에 100 개의 요청을 모두 여는 것입니다. 응답이 다시 올 때마다 메소드가 실행됩니다. 동시 프로그래밍입니다. Ruby에서 가장 간단한 (가장 일반적인) 솔루션은 요청을 열고 응답을 처리하고 다음 요청을 열고 응답을 처리하는 등입니다. 많은 요청의 경우 NodeJS가 적시에 수행하는 것이 더 쉽습니다. 서버를 망치거나 아웃 바운드 연결을 최대한 사용하지 않도록주의하십시오 (실수로 쉽게 수행 할 수 있음). 루비를 동시에 쓸 수는 있지만, 대부분의 루비 코드가 작성되는 방식이 아니기 때문에 조금 해가됩니다.

병렬 프로그래밍여러 스레드 또는 프로세스에서 동시에 실행할 수있는 코드입니다. 이를 통해 여러 CPU에서 코드를 실행하여 성능을 최적화 할 수 있습니다 (Akka와 같은 여러 시스템 포함). NodeJS는 멀티 스레드가 아니며 병렬 실행이 없으므로 스레드 안전 코드 작성에 대해 걱정할 필요가 없습니다 (그리고 내가 본 대부분의 JavaScript 코드는 스레드 안전하지 않습니다). Java에서는 언어가 동시 프로그래밍을 일반적인 패턴으로 만들지 않더라도 병렬 프로그래밍은 매우 기본적으로 제공되며 스레드 안전성에 대해 걱정해야하는 경우가 많습니다. 웹 사이트를 Java로 작성하는 경우 일반적으로 웹 사이트는 각 요청을 동일한 메모리의 별도 스레드에서 실행하는 컨테이너에서 실행됩니다.


위의 내용 중 일부는 당신이 말하는 범위와 경계에 달려 있습니다. 나는 웹 사이트에서 일합니다. 내가 보는 대부분의 Java 코드는 동시 프로그래밍이 아닙니다. 물론 충분히 축소하면 고객 요청이 들어오는 순서는 중요하지 않지만 그 이상으로 확대하면 코드에 따라 실행 순서가 결정됩니다. 그러나이 코드는 요청이 스레드로부터 안전해야하는 많은 공유 객체와 병렬로 실행될 수 있도록 작성되었습니다.

한편, 내가 보는 대부분의 JavaScript 코드는 동시 적입니다. 실행 순서가 여러 수준에서 중요하지 않은 방식으로 작성되었습니다. 그러나 공유 메모리에서 병렬 실행을 지원하도록 작성되지 않았습니다. 물론 여러 프로세스에서 동일한 코드를 병렬로 실행할 수는 있지만 객체는 공유되지 않으므로 의미가있는 병렬 프로그래밍이 아닙니다.

추가 독서를 위해, 나는이 질문에 대한 최상위 답변의 그림을 정말로 좋아합니다 : https://www.quora.com/What-are-the-differences-between-parallel-concurrent-and-asynchronous-programming

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.