"동시"와 "병렬"실행의 차이점은 무엇입니까?


107

동시 실행 과 병렬 실행 이라는 용어의 차이점은 무엇입니까 ? 나는 그 구별을 파악할 수 없었습니다.

이 태그는 동시성을 두 프로세스를 동시에 실행하는 방식으로 정의하지만 병렬 처리는 정확히 동일한 것, 즉 별도의 스레드 또는 별도의 프로세서에서 실행될 수있는 프로세스라고 생각했습니다.

또한 비동기 I / O와 같은 것을 고려하면 동시성 또는 병렬 처리를 다루고 있습니까?


27
한마디로-동시 : 한 번에 여러 가지 다른 작업이 발생합니다. 병렬 : 동일한 작업이 한 번에 작은 비트로 분리됩니다.
Oded

3
@Oded, 나는 단어의 의미를 이해하지만 그 의미를 이해하는 데 어려움을 겪고 있습니다. 구체적인 예가 있습니까?
blz

7
@Oded, 나는 당신에게 동의하지 않습니다. 그들의 정의 (일반 또는 프로그래밍에 적용되는)에서 "동시"와 "병렬"이라는 개념은 연산의 수 또는 "크기"에 대해 언급하지 않습니다.
Shivan Dragon

2
당신이 "작은 비트"라고 말할 때 @Oded.
Avner Shahar-Kashtan

2
@Oded : 그렇습니다. 그러나 이것은 당신과 ShivanDragon 사이의 오해의 근원 인 것 같습니다.
Avner Shahar-Kashtan

답변:


97

동시성과 병렬성은 두 가지 관련이 있지만 별개의 개념입니다.

동시성은 기본적으로 작업 A와 작업 B가 서로 독립적으로 발생해야하고 A가 실행을 시작한 다음 A가 완료되기 전에 B가 시작됨을 의미합니다.

동시성을 달성하는 다양한 방법이 있습니다. 그중 하나는 병렬 처리입니다. 여러 CPU가 동시에 다른 작업을 수행하게합니다. 그러나 이것이 유일한 방법은 아닙니다. 다른 하나는 작업 전환에 의한 것입니다 . 작업 A는 특정 지점까지 작동 한 다음 작업중인 CPU가 작업을 중지하고 작업 B로 전환 한 다음 잠시 동안 작업 한 다음 작업 A로 다시 전환합니다. 시간 조각이 충분히 작 으면 실제로 멀티 태스킹 CPU에 의해 직렬로 처리되는 경우에도 두 가지가 병렬로 실행되는 것처럼 보일 수 있습니다.


4
사례 B는 비동기 IO의 작동 방식입니다.
blz

6
@blz : 맞습니다. 또한 선점 형 멀티 태스킹이 작동하는 방식이기도합니다. 주요 차이점은 비동기 IO에서 프로그램이 시간을 포기하고 CPU에게 다른 것을 처리하도록 결정하는 반면 선점 멀티 태스킹에서는 실행중인 스레드가 오랫동안 CPU를 자발적으로 포기하지 않으면 OS가 선점 한다는 점입니다 그것.
메이슨 휠러

1
가장 좋은 설명은 아래로 손
콘라드

@MasonWheeler : CPU가 1 개만 있으면 병행 성은없고 동시성 만 가질 수 있습니다. 권리? 병렬 처리는 둘 이상의 CPU로 달성 할 수 있습니다. 권리? 그리고 그것이 옳고 CPU가 하나뿐이라면 Java 8의 Streams는 사용되지 않습니다.
Anish Mittal

1
처음 몇 가지 요점에 대해. 마지막으로 병렬 처리가 Streams에서 얻는 유일한 이점입니까? 저는 Java 개발자는 아니지만 Java Streams는 LINQ와 거의 동일하며 표현력과 개발 용이성에 실질적인 이점이 있습니다.
메이슨 휠러

37

두 가지 개념은 서로 관련되어 있지만 다릅니다.

동시성 은 두 개 이상의 계산이 동일한 시간 내에 발생한다는 것을 의미하며 일반적으로 그들 사이에 어떤 종류의 종속성이 있습니다.

병렬 처리는 둘 이상의 계산이 동시에 수행됨을 의미합니다.

대담하게 말하면 동시성은 문제를 설명하고 (두 가지 일이 함께 발생해야 함), 병렬 처리는 솔루션을 설명합니다 (두 개의 프로세서 코어가 두 가지를 동시에 실행하는 데 사용됨).

병렬 처리는 동시성을 구현하는 한 가지 방법이지만 유일한 방법은 아닙니다. 또 다른 널리 사용되는 솔루션은 인터리브 처리 (일명 코 루틴)입니다. 두 작업을 모두 원자 단계로 나누고 두 작업 사이를 전환합니다.

비 병렬 동시성에 대한 가장 잘 알려진 예는 JavaScript의 작동 방식입니다. 하나의 스레드 만 있으며 비동기 콜백은 이전 코드 조각이 실행을 마칠 때까지 기다려야합니다. 작성하는 모든 함수가 원자적임을 보장하므로 콜백이 반환 될 때까지 중단 할 수 없으므로 알아야합니다. 그러나 또한 "사용 중 루프"가 작동하지 않음을 의미합니다. 루프가 시간 초과 콜백을 실행하지 못하게하기 때문에 시간 초과를 설정 한 다음 실행될 때까지 반복 할 수 없습니다.


8
Concurrency means that two or more calculations happen within the same time frame, and there is usually some sort of dependency between them.그러나 당신은 그 대답을 쓴 사용자가 말합니다 Concurrency means, essentially, that task A and task B both need to happen independently of each other. 결론은 무엇입니까?
nbro

왜 JavaScript의 모델이 동시인지 설명 할 수 있습니까? 동시성 정의에서 두 개 이상의 계산이 동일한 시간 내에 발생해야합니다. 그러나 JavaScript에서는 단일 대기열을 사용하여 순차적으로 계산됩니다.
damluar

4
"동일한 시간 범위 내"라는 말은 필연적으로 "동시"라는 의미는 아니며, 전체 시간 프레임이 겹치는 것을 의미합니다. 이는 병렬로 달성 할 수 있지만 (예 : 각각 하나의 작업을 실행하는 2 개의 프로세서 코어), 실행을 완전히 직렬화하여 수행 할 수도 있습니다 (작업 1을 먼저 수행 한 후 결과를 기억 한 다음 작업 2를 수행 한 후 둘 다보고) 청크를 잘라내거나 인터리빙하여 후자는 JS가하는 일이다.
tdammers

9

이 답변이 기존 답변보다 더 정확하다고 생각하고 편집하면 본질이 바뀔 것입니다. 다른 출처 나 위키 백과 페이지에 링크를 시도하여 다른 사람들이 정확성을 확인할 수 있도록했습니다.


동시성 : 최종 결과에 영향을 미치지 않고 프로그램, 알고리즘 또는 문제의 단위를 순서가 없거나 부분적으로 실행할 수있는 시스템의 속성 1 2 .

이에 대한 간단한 예는 연속 추가입니다.

0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45

계산 의 가산 적 속성 으로 인해 이들의 순서는 정확성에 영향을 미치지 않고 재 배열 될 수 있습니다. 다음과 같은 배열로 같은 대답을 얻을 수 있습니다.

(1 + 9) + (2 + 8) + (3 + 7) + (4 + 6) + 5 + 0 = 45

여기에 숫자를 10으로 묶는 숫자로 그룹화하여 머리에 정확한 답을 얻기가 더 쉬워졌습니다.

병렬 계산 : 계산의 형태는 많은 계산 또는 프로세스의 실행이 동시에 수행되는 3 4 . 따라서 병렬 컴퓨팅은 동시성 속성을 활용하여 프로그램, 알고리즘 또는 문제의 여러 단위를 동시에 실행합니다.

연속 덧셈의 예를 계속해서 합의 다른 부분을 병렬로 실행할 수 있습니다.

Execution unit 1:  0 + 1 + 2 + 3 + 4 = 10
Execution unit 2:  5 + 6 + 7 + 8 + 9 = 35

그런 다음 끝에 각 작업자의 결과를 합하여 얻습니다 10 + 35 = 45.

이 병렬 처리는 연속적인 추가가 동시성의 속성을 가지기 때문에 가능했습니다.

병행 성은 단순한 병렬 처리 이상으로 활용 될 수 있습니다. 단일 코어 시스템에서 선점 을 고려하십시오 . 일정 기간 동안 시스템은 여러 개의 실행중인 프로세스가 완료되지 않고 진행될 수 있습니다. 실제로 비동기 I / O의 예는 병렬 처리가 필요없는 동시성의 일반적인 예입니다.


혼동

위의 내용은 비교적 간단합니다. 사전 정의가 위에서 설명한 내용과 반드시 ​​일치하지 않기 때문에 사람들이 혼란스러워하는 것 같습니다.

  • 동시 : 발생 또는 측면에 의해 동시에 또는 측면 기존 5 .
  • 동시성 : 동시에 발생하거나 존재하는 둘 이상의 이벤트 또는 상황의 사실 Google 검색에서 : "define : concurrency" .

사전은 "동시성"을 발생 사실로 정의하는 반면, 컴퓨팅 언어의 정의는 프로그램, 속성 또는 시스템의 잠재 속성입니다. 관련이 있지만 동일하지 않습니다.


개인 추천

동시 실행이 보장되거나 예상되는 경우 "병렬"이라는 용어를 사용하고 동시 실행을 사용할지 확실하지 않거나 관련이없는 경우 "동시"라는 용어를 사용하는 것이 좋습니다.

따라서 여러 코어에서 제트 엔진 시뮬레이션을 병렬로 설명합니다.

Makefile을 동시성의 예로 설명하겠습니다. Makefile은 각 대상의 종속성을 나타냅니다. 대상이 다른 대상에 의존하는 경우 부분 순서가 생성됩니다. 관계와 레시피가 포괄적이고 올바르게 정의되면 동시성의 속성이 설정됩니다. 결과에 영향을주지 않고 특정 작업의 순서를 재정렬 할 수있는 부분적인 순서가 있습니다. 다시 한번,이 동시성을 이용하여 여러 규칙을 동시에 구축 할 수 있지만 동시성은 병렬 처리 사용 여부에 관계없이 Makefile의 속성입니다.


6

동시 실행은 일반화 된 병렬 실행 형식입니다. 예를 들어 병렬 프로그램을 동시에 호출 할 수도 있지만 역순이 아닙니다.

  1. 단일 프로세서 (스케줄러가 관리하는 다중 스레드)에서 동시 실행 가능
  2. 단일 프로세서가 아니라 여러 프로세서에서 병렬 실행이 가능합니다. (프로세서 당 하나의 프로세스)

자세한 내용은이 연구 논문 동시 프로그래밍의 개념을 읽으십시오


1
"단일 프로세서에서는 불가능하지만 다중 프로세서에서는 병렬 실행이 가능합니다."물론 프로세서 내에 병렬 실행 경로가있는 경우 (예 : 명령어 수준 병렬 처리를 사용하는 시스템 (일명 "슈퍼 스칼라"아키텍처, 예 : 인텔 프로세서) Pentium, ARM Cortex 및 대부분의 다른 고급 프로세서) 및 단일 명령 다중 데이터 (데이터 병렬 아키텍처라고도 함) (예 : MMX / SSE / etc). 데이터 흐름 프로세서 등과 같은 이국적인 배열은 말할 것도 없습니다.
Jules

3

병렬 처리는 동시 처리의 하위 집합입니다.

동시 처리는 비동기 적으로 발생하는 두 가지 작업을 설명합니다. 즉, 작업이 실행되는 순서가 미리 결정되지 않았습니다. 실행 가능한 명령어를 인터리빙하여 동일한 프로세서 코어에서 두 개의 스레드를 동시에 실행할 수 있습니다. 예를 들어, 스레드 1은 10ms 동안 실행되고 스레드 2는 10ms 동안 실행됩니다.

병렬 처리는 둘 이상의 명령어 세트가 동시에 실행되는 동시 처리 유형입니다. 분산 컴퓨팅에서와 같이 공통 문제로 작동하는 여러 시스템 또는 동일한 시스템의 여러 코어 일 수 있습니다.


0

tdammer의 진술이 다가오고 나머지는 모두 요점을 벗어납니다. 그는 말한다 :

"대담하게도 동시성은 문제 (두 가지 일이 함께 발생해야 함)를 설명하는 반면, 병렬 처리는 솔루션을 설명합니다 (두 개의 프로세서 코어가 두 가지를 동시에 실행하는 데 사용됨)"

단어를 분석해 봅시다.

현재는 현재, 실제로, 현재 관련이 있음을 의미합니다. 죄수는 반대하지 않고 반대하는 것을 의미합니다.

평행은 서로의 방식으로 교차하지 않고 교차하지 않고 같은 방향을 의미합니다.

따라서 동시성은 동일한 리소스에 대한 경쟁을 의미합니다. 병렬 처리는 그렇지 않습니다. 병렬 프로세스가 동일한 리소스를 사용하고있을 수 있지만 문제로 간주되지 않으며 문제가 아닙니다. 동시성으로 처리해야 할 문제입니다.


"현재는 현재, 실제로, 관련이 있음을 의미합니다. 사기는 반대에 맞지 않는 것을 의미합니다." -인용이 필요했습니다. 나는이 두 가지 진술을 모두 의심한다. "현재"는 영어로 여기에 언급 된 의미를 가질 수 있지만, "동시"라는 단어에 사용 된 의미는 아닙니다.
Hulk

1
라틴어에서 동시 번역 이 "함께 실행된다" 고 생각합니다 . 접두사 '사기꾼'자주 뜻 을 함께 (함께 호흡하는) 결과 (결과 함께 또는 다음) (가깝게) 체결 등을 그것은 뭔가 반대 의미를 가질 수 언어의 성가신면이다 음모처럼, 제재는 내가 가장 좋아하는 예입니다 .

@no comprende이 경우 (동시) 함께 실행하는 의미가 더 적합합니다. 네덜란드어에서 동시성은 명사를 의미하는 경쟁자입니다. Courant는 일반적이며 주변을 이동합니다. 신문이기도합니다. 지금 활성화 된 것. "쿠 켄트 회수"는 운영 계정입니다. 동시성이 con (!) 충돌을 의미한다고 생각합니다. 같은 자원에 대한 싸움. 같은 공간에서 달리기. 아마도 네덜란드의 의미 (경쟁자) 때문일 수 있습니다.
Martin Maat

Dijkstra는 무엇이라고 말합니까?

-1

분명히, 용어는 다른 문화에서 다르게 사용됩니다.

내 이해는 다음과 같습니다.

병렬 처리는 처리 속도를 높이는 방법입니다. 단일 코어, 다중 코어 또는 GPU에서 행렬 곱셈을 수행하더라도 결과는 동일합니다 (또는 프로그램이 손상됨). 일부 프로그램에는 새로운 기능을 추가하지 않고 속도 만 제공합니다.

동시성은 사용자가 순차적으로 할 수없는 일에 관한 것입니다. 예를 들어 다음 요청을 기다리는 동안 3 개의 다른 웹 페이지를 동시에 3 개의 클라이언트에 게재합니다. (이것은 초창기처럼 인터리빙을 통해 어느 정도 시뮬레이션 할 수 있습니다.) 동시 프로그램의 동작은 비 결정적입니다. 예를 들어, 3 명의 클라이언트 중 어느 것이 먼저 완전하게 서비스 될 것인지는 명확하지 않습니다. 요청이 완료되는 순서와 관련하여 꽤 많은 테스트를 실행하고 매번 다른 결과를 얻을 수 있습니다. 런타임 시스템은 a) 모든 고객에게 서비스를 제공하고 b) 합리적인 시간 내에 서비스를 보장해야합니다.

일반적으로 병렬 계산의 작업 말은 병렬 처리를 인식하지 못하거나 신경 쓰지 않습니다. 동시 작업은 종종 블로킹 큐, 동기화 및 잠금 메커니즘과 같은 프로세스 간 또는 스레드 간 통신을 명시 적으로 사용합니다.


-1

내 생각에, 응용 프로그래밍 관점에서 볼 때이 두 개념 사이에는 차이가 없으며 두 단어를 갖는 것은 혼란을 혼란스럽게합니다. 멀티 코어가 불가능했던 시절에 스레드 인터리빙이 멀티 코어 처리를 시뮬레이션하기 시작했다고 생각합니다. 왜이 오래된 사고 방식에 대한 단어가 있습니까?

메이슨 휠러와 펭귄도 같은 대답을했다. 작업 전환 및 / 또는 멀티 코어가있는 하나의 코어는 동시에 멀티 코어 = 병렬입니다.

제 의견은이 두 용어를 하나로 묶어야하며 "동시"라고 말하는 것을 피하려고 노력한다는 것입니다. OS 프로그래밍 수준에서는 구별이 중요하다고 생각하지만 응용 프로그램 프로그래머의 관점에서는 그다지 중요하지 않습니다. mapReduce, Spark, MPI, cuda, openCL 및 다중 스레드 c ++를 작성했으며 작업이 인터리브 스레드 또는 다중 코어로 실행 중인지 중지하고 생각할 필요가 없었습니다.

예를 들어, 멀티 스레드 C ++을 작성할 때 때때로 얻을 수있는 코어 수를 확실하지 않지만 여기에 설명 된대로 코어 수를 요구하는 방법이 있습니다 https : //.com/questions/2166425/ how-to-structure-ac-application-to-use-a- 멀티 코어 프로세서 . 스파크에서 나는 단지 맵을 만들고 작업을 줄이고 jvm이 하드웨어 수준에서 어떻게 처리하는지 모릅니다. GPU에서 나는 생각모든 스레드는 자체 간단한 프로세서에 할당되지만 문제가 발생할 때마다 항상 스레드를 동기화합니다. MPI를 사용하면 시스템 간 통신이 명시 적으로 지정되지만 단일 코어의 여러 시스템에서 실행되는 기능을 인터리브하고 적절한 단일 스레드 기능을 통해 결과를 결합 할 수 있습니다. 그리고 MPI를 사용하여 각각 멀티 스레딩이있는 여러 개의 단일 코어 시스템을 조정하면 어떻게됩니까? 어떤 차이가 있습니까? 나는 아무 말도하지 않았다. 모두 "병렬"이라고 부르고 완료하십시오.


2
구별은 오늘날에도 여전히 관련이 있습니다. 하드웨어가 보유한 CPU 코어 수까지만 병렬 처리를 수행 할 수 있지만 많은 프로그램은 하드웨어가 보유한 코어 수보다 훨씬 많은 수백 개의 동시 계산을 동시에 수행합니다. 이 차이점을 이해하지 못하면 프로그래머가 병렬화 된 프로그램이 단일 스레드 버전 (또는 적은 수의 스레드)보다 느리게 실행되는 이유를 이해하지 못할 수 있습니다.
Lie Ryan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.