동시성과 병렬 처리의 차이점은 무엇입니까?


1075

동시성과 병렬 처리의 차이점은 무엇입니까?

예가 이해된다.


41
짧은 대답 : 동시성은 단일 계산원으로부터 주문하는 두 라인의 고객입니다 (라인은 순서를 바꿉니다). 병렬 처리는 두 계산원으로부터 주문하는 두 줄의 고객입니다 (각 줄은 자체 계산원을 얻습니다).
chharvey

@ chharvey : 나는 이것이 이것이 대답이어야한다고 생각합니다. 짧게 (두 줄의 텍스트, "짧은 답"을 벗어난 경우), 요점까지는 즉시 이해할 수 있습니다. 잘 했어요!
Mike Maxwell

답변:


1269

동시성 은 두 개 이상의 작업이 겹치는 기간에 시작, 실행 및 완료 될 수있는 시점입니다. 반드시 둘 다 같은 순간에 실행된다는 의미는 아닙니다. 예를 들어, 단일 코어 시스템에서의 멀티 태스킹 .

병렬 처리 는 작업이 문자 그대로 동시에 (예 : 멀티 코어 프로세서에서) 실행될 때 입니다.


Sun의 다중 스레드 프로그래밍 안내서 인용 :

  • 동시성 : 둘 이상의 스레드가 진행 중일 때 존재하는 조건입니다. 가상 병렬 처리의 형태로 시간 분할을 포함 할 수있는보다 일반적인 형태의 병렬 처리.

  • 병렬 처리 : 두 개 이상의 스레드가 동시에 실행될 때 발생하는 조건입니다.


169
나는이 답변을 좋아하지만, 더 나아가서 동시성을 프로그램이나 시스템의 속성 (및 여러 작업을 동시에 실행하는 런타임 동작과 병렬 처리)으로 특성화 할 것입니다.
Adrian Mouat

24
나는 Adrian Mouat의 의견을 매우 좋아합니다. :이 우수한 설명을 참조하십시오 haskell.org/haskellwiki/Parallelism_vs._Concurrency
jberryman

9
@Raj : 단일 코어 프로세서에서는 올바른 병렬 처리 (멀티 스레딩의 의미)가 불가능합니다.
RichieHindle

5
열거 형과 병렬 형이 모두 열거 형의 값인 경우 해당 열거 형의 이름은 무엇입니까?
toddmo

11
: 동시성 주어진 기간 동안 때, 존재 조건 : -이를 위해, 일의 인용은 다음과 같이 재 진술 할 수있는 기간 때, 특정 주어진 발생 조건 : - 병렬 처리 시간, 두 스레드가 진전이 시점 시간에, 두 개의 스레드를 동시에 실행
필립

494

혼란이 존재하는 이유

이 두 단어의 사전 의미가 거의 동일하기 때문에 혼란이 있습니다.

  • 동시 : 기존, 발생 또는 동시에 수행 (dictionary.com)
  • 병렬 : 매우 유사하고 종종 동시에 발생합니다 (merriam webster).

그러나 컴퓨터 과학과 프로그래밍에 사용되는 방식은 상당히 다릅니다. 내 해석은 다음과 같습니다.

  • 동시성 : 인터럽트 가능성
  • 병렬성 : 독립성

위의 정의는 무엇을 의미합니까?

나는 실제 비유로 분명히 할 것이다. 하루에 두 가지 매우 중요한 작업을 수행해야한다고 가정 해 봅시다.

  1. 여권 받기
  2. 프리젠 테이션 완료

문제는 과제 1이 여권을 얻기 위해 줄을 서서 4 시간 동안 기다리게하는 매우 관료적 인 정부 관청에 가야한다는 것입니다. 한편, 작업 2는 사무실에서 필요하며 중요한 작업입니다. 둘 다 특정 날짜에 완료해야합니다.

사례 1 : 순차적 실행

보통, 당신은 2 시간 동안 여권 사무실로 운전하고, 4 시간 동안 줄을 서서 기다리며, 과제를 끝내고, 2 시간 뒤로 운전하고, 집으로 돌아가고, 5 시간 더 깨어 있고 프리젠 테이션을합니다.

사례 2 : 동시 실행

그러나 당신은 똑똑합니다. 당신은 미리 계획합니다. 랩탑을 가지고 다니며 전화를 기다리는 동안 프리젠 테이션 작업을 시작합니다. 이렇게하면 집에 돌아와서 5 시간 대신 1 시간 만 더 일하면됩니다.

이 경우 두 가지 작업을 모두 직접 수행합니다. 줄을 기다리는 동안 여권 작업을 중단하고 프리젠 테이션 작업을했습니다. 전화를 걸면 프리젠 테이션 작업이 중단되고 패스포트 작업으로 전환되었습니다. 두 작업의 중단 가능성으로 인해 시간을 절약 할 수있었습니다.

동시성, IMO는 ACID 의 "격리"속성으로 이해 될 수 있습니다 . 하위 트랜잭션을 각각 인터리브 방식으로 수행 할 수 있고 최종 결과가 두 작업이 순차적으로 수행 된 것과 동일한 경우 두 데이터베이스 트랜잭션이 분리 된 것으로 간주됩니다. 여권과 프리젠 테이션 작업 모두 귀하가 유일한 사형 집행 인임을 기억하십시오 .

사례 3 : 병렬 실행

자, 당신은 똑똑한 친구이기 때문에 분명히 당신은 고상하고 조수가 있습니다. 따라서 여권 업무를 시작하기 전에 떠나서 프리젠 테이션 초안을 준비하도록 지시하십시오. 하루 종일 보내고 여권 업무를 마치고 돌아와서 메일을보고 프레젠테이션 초안을 찾습니다. 그는 꽤 탄탄한 일을했으며 2 시간 후에 약간의 편집 작업을 마쳤습니다.

이제 조수는 당신만큼 똑똑하기 때문에 끊임없이 설명을 요구하지 않고도 독립적 으로 작업 할 수있었습니다 . 따라서 작업의 독립성으로 인해 두 명의 다른 실행자가 동시에 수행했습니다 .

아직도 나와 함꼐? 좋구나...

사례 4 : 동시이지만 병렬이 아님

줄을 서서 기다려야하는 여권 작업을 기억하십니까? 이 때문에 귀하의 여권, 비서는 당신을 위해 줄을 기다릴 수 없습니다. 따라서 여권 작업에는 인터럽트 가능성이 있지만 (전화를 기다리는 동안 중지하고 나중에 전화를 걸 때 다시 시작할 수 있음) 독립성 은 없습니다 (보조자가 대신 기다릴 수 없음).

사례 5 : 병렬이지만 동시에는 아님

관공서에 건물 출입을위한 보안 점검이 있다고 가정합니다. 여기에서 모든 전자 장치를 제거하고 관리자에게 제출해야하며 작업을 완료 한 후에 만 ​​장치를 반환해야합니다.

이 경우 여권 작업이 독립적 이거나 중단 되지 않습니다 . 전화를 기다리고 있더라도 필요한 장비가 없기 때문에 다른 작업을 할 수 없습니다.

마찬가지로 프레젠테이션의 특성이 매우 수학적이라고 말하면 5 시간 이상 동안 100 % 농도가 필요합니다. 노트북을 가지고 있어도 여권 작업을 기다리는 동안에는 할 수 없습니다.

이 경우 프레젠테이션 작업은 독립적 이지만 (귀하 또는 보조자가 5 시간 동안 집중적으로 노력할 수 있음) 중단 할 수는 없습니다 .

사례 6 : 동시 및 병렬 실행

이제 조수를 프리젠 테이션에 배정하는 것 외에도 여권 업무를 위해 랩탑을 가지고 다니십시오. 전화를 기다리는 동안 보조자가 공유 데크에서 처음 10 개의 슬라이드를 만들었 음을 알 수 있습니다. 당신은 그의 수정에 대해 그의 작품에 대한 의견을 보냅니다. 나중에 집에 돌아 왔을 때 초안을 완성하는 데 2 ​​시간이 아니라 15 분이면됩니다.

프리젠 테이션 태스크에는 독립성 (둘 중 하나가 할 수 있음)과 인터럽트 가능성 (중지하고 나중에 다시 시작할 수 있음 ) 이 있기 때문에 가능 했습니다. 따라서 작업 을 동시에 실행 하고 프레젠테이션 작업을 동시에 실행했습니다.

지나치게 관료적이면서 정부 관청이 부패했다고 가정 해 봅시다. 따라서, 당신은 당신의 신분증을 보여주고, 입력하고, 전화를 걸기 위해 줄을 서기 시작하고, 경비원과 다른 사람이 그 줄에서 당신의 위치를 ​​잡고, 몰래 빠져 나오고, 전화하기 전에 다시 와서 기다릴 수 있습니다. 당신 자신.

이 경우 여권 및 프리젠 테이션 작업을 동시에 동시에 수행 할 수 있습니다. 몰래 빠져 나올 수 있으며 조수는 자신의 위치를 ​​유지합니다. 그런 다음 둘 다 프레젠테이션 등을 수행 할 수 있습니다.


컴퓨터 과학으로 돌아 가기

컴퓨팅 세계에서 다음은 각각의 경우에 전형적인 시나리오 예입니다.

  • 사례 1 : 인터럽트 처리.
  • 사례 2 : 프로세서가 하나만 있지만 모든 실행 작업에 I / O로 인해 대기 시간이있는 경우
  • 사례 3 : 지도 축소 또는 하둡 클러스터에 대해 이야기 할 때 종종 나타납니다.
  • 사례 4 : 사례 4가 드문 것 같습니다. 작업이 동시에 수행되지만 병렬이 아닌 경우는 드 common니다. 그러나 일. 예를 들어, 작업에 프로세서 1만을 통해 액세스 할 수있는 특수 연산 칩에 액세스해야한다고 가정하십시오. 따라서 프로세서 2가 비어 있고 프로세서 1이 다른 작업을 수행하더라도 특수 계산 작업은 프로세서 2에서 진행할 수 없습니다.
  • 사례 5 : 사례 4만큼 드물지만 드문 일이 아닙니다. 비 동시 코드는 뮤텍스로 보호되는 중요한 영역 일 수 있습니다. 시작되면 실행을 완료 해야합니다 . 그러나 두 개의 다른 중요 영역이 두 개의 다른 프로세서에서 동시에 진행될 수 있습니다.
  • 사례 6 : IMO, 병렬 또는 동시 프로그래밍에 대한 대부분의 논의는 기본적으로 사례 6에 관한 것입니다. 이는 병렬 및 동시 실행의 혼합 및 일치입니다.

동시성 및 이동

Rob Pike가 동시성이 더 좋다고 말하는 이유를 보면 그 이유가 무엇인지 이해해야합니다. 파일 읽기, 네트워크 다운로드와 같은 외부 작업을 기다리는 대기 시간이 여러 개인 매우 긴 작업이 있습니다. 그의 강의에서, "길들이는 동안 유용한 무언가를 할 수 있도록이 긴 연속 작업을 중단하십시오." 그래서 그는 다양한 고퍼를 가진 다른 조직에 대해 이야기합니다.

이제 Go의 강점은 go키워드와 채널을 사용하여 이러한 문제를 쉽게 해결하는 데 있습니다. 또한 런타임에서 이러한 goroutines을 예약하는 데 탁월한 기본 지원이 있습니다.

그러나 본질적으로 동시성은 병렬 처리보다 낫습니까?

사과가 오렌지보다 낫습니까?


사례 5에 감사드립니다. 나는 종종 병렬 내재적 의미가 동시성을 의미한다고 생각합니다.
hqt

2
Node.js 이벤트 루프는 사례 4의 좋은 예입니다. 프로세서 B에 사용 가능한 자원이 있지만 요청 X는 Y를 처리중인 프로세서 A가 처리해야합니다. Y에 대해 setTimeout이 호출되면 X를 처리 할 수 ​​있습니다. 타임 아웃 후 Y도 처리가 종료됩니다.
Lucas Janon

허용되는 답변에 포함 된 "동시성"이라는 단어의 두 가지 정의를 주목할 가치가 있으며,이 용어는 매우 뚜렷합니다. 합니다. 첫 번째는 겹치는 기간에 여러 작업을 실행하는 개념을 의미합니다 (즉, 병렬 처리는 def에 의한 동시성을 의미 함). 두 번째는 한 작업이 다른 작업을 실행하도록 중단하는 개념을 나타냅니다.
Mergasov

위의 주석과 유사하게-멀티 스레드 파이썬은 사례 4의 예입니다. 나는이 사례가 드문 것이라고 생각하지 않습니다. 전역 인터프리터 잠금은 케이스 4가됩니다 (동시성을 허용하는 경우).
chub500

245

나는 Rob Pike의 이야기를 좋아합니다 : 동시성은 병렬 처리가 아닙니다 (더 좋습니다!) (슬라이드) (말)

Rob은 일반적으로 Go에 대해 이야기하고 시각적이고 직관적 인 설명으로 동시성 대 병렬 처리 문제를 해결합니다. 다음은 간단한 요약입니다.

작업 : 더 이상 사용되지 않는 언어 매뉴얼을 구워 봅시다! 한번에 한!

직무

동시성 : 작업의 동시 분해가 많이 있습니다! 한 가지 예 :

고퍼

병렬 처리 : 두 개 이상의 고퍼가 동시에 작동하는지 여부에 따라 이전 구성이 병렬로 발생합니다.



15
죄송합니다. "더 낫습니다"비트를 위해 공감해야했습니다. 정답은 다르다는 것입니다. 동시성은 문제의 일부입니다. 병렬 처리는 솔루션의 일부입니다.
pyon

@ EduardoLeón 당신은 분명히 대화의 이름을 확인하지 않았습니다. 동시성은 문제가 아니라 문제 / 작업을 생각하는 방법 일뿐입니다.
asfer

5
@asfer Concurrency는 문제 구조의 일부입니다. 그런데 "동시성"(문제)과 "동시성 제어"(종종 병렬 처리와 함께 사용되는 솔루션)를 혼동하지 마십시오.
pyon

1
나는 그것을보고 정직하게 그것을 좋아하지 않았다. 그것은 훨씬 더 간단한 방법으로 설명해야 할 것에 불필요한 합병증과 nerdyness를 추가합니다 (여기서 답변을 확인하십시오).
jj_

146

다른 사람들의 말을 더하려면 :

동시성은 요술쟁이가 많은 공을 저글링하는 것과 같습니다. 어떻게 보이는지에 관계없이, 요술쟁이는 한 번에 한 손에 공 하나만 잡거나 던집니다. 병렬 처리는 여러 개의 저글러가 동시에 공을 저글링합니다.


2
나는 까다 롭지 만, 당신이 한 쌍의 공으로 저글링하는 경우, 동시에 두 공을 가질 수 있습니다 (저글링 방법에 따라 다름).
thebugfinder

52
@thebugfinder, Thomas의 예제에서 더 이상 오류가 없어야합니다. 동시성은 한 손으로 저글링하는 사람과 같습니다. 그것이 어떻게 보이는지에 관계없이 그 사람은 한 번에 최대 하나의 공만 들고 있습니다. 병렬 처리는 저글러가 양손을 사용할 때입니다.
bigtunacan

내가 실제로 "페어 수의 볼"이라고 말한 것은 "짝수의 볼"이었습니다
thebugfinder

1
매우 영리한 답변. 버그 파인더의 요점을 확실히 볼 수 있지만 한 번에 하나의 동작을 고려하고 동의하면이 답변이 많이 좋습니다.
BK

2
"병렬주의는 각 공마다 한 사람 씩 가지고있다"는 것이 더 좋다고 생각합니다. 볼의 수가 증가하면 (웹 요청을 상상) 사람들이 저글링을 시작하여 실행을 동시에 병렬로 수행 할 수 있습니다. 또한 누군가가 저글러 예제로 원자로 패턴을 설명 할 수 있기를 바랍니다.
jj_

120

두 개의 스레드가있는 프로그램이 있다고 가정하십시오. 이 프로그램은 두 가지 방법으로 실행될 수 있습니다.

Concurrency                 Concurrency + parallelism
(Single-Core CPU)           (Multi-Core CPU)
 ___                         ___ ___
|th1|                       |th1|th2|
|   |                       |   |___|
|___|___                    |   |___
    |th2|                   |___|th2|
 ___|___|                    ___|___|
|th1|                       |th1|
|___|___                    |   |___
    |th2|                   |   |th2|

두 경우 모두 하나 이상의 스레드가 실행되고 있다는 사실만으로 동시성이 있습니다.

단일 CPU 코어가있는 컴퓨터에서이 프로그램을 실행하면 OS가 두 스레드 사이를 전환하여 한 번에 하나의 스레드를 실행할 수 있습니다.

멀티 코어 CPU가 장착 된 컴퓨터에서이 프로그램을 실행하면 두 개의 스레드를 동시에 동시에 병렬 로 실행할 수 있습니다 .


4
스레드 블록이 마음에 들었습니다. 간단하면서도 완벽합니다! 놀라운 답변에 감사드립니다.
bozzmob

53

동시성 : 단일 프로세서로 둘 이상의 문제가 해결 된 경우 대체 텍스트

병렬 처리 : 하나의 문제가 여러 프로세서로 해결되는 경우.

대체 텍스트


55
나는 이것에 동의하지 않는다-동시 적으로 설계된 프로그램은 병렬로 실행되거나 실행되지 않을 수있다. 동시성은 프로그램의 속성이며, 병렬화는 실행될 때 발생할 수 있습니다.
Adrian Mouat

36

흥미롭고 이해하기 쉬운 예제로 설명하려고 노력할 것입니다. :)

한 조직에서 10 명의 플레이어 ( 동일한 체스 게임 기술 )가 프로 챔피언 체스 선수 에게 도전 할 체스 토너먼트를 조직 한다고 가정 합니다 . 체스는 1 : 1 게임이므로 주최측은 가능한 한 빨리 전체 이벤트를 완료 할 수 있도록 10 개의 게임을 시간 효율적인 방식으로 수행해야합니다.

다음 시나리오에서 이러한 10 가지 게임을 수행하는 여러 가지 방법을 쉽게 설명 할 수 있기를 바랍니다.

1) SERIAL- 전문가가 한 사람 씩 하나씩 게임을 시작합니다. 즉 한 사람과 게임을 시작하고 마치고 다음 사람과 다음 게임을 시작한다고합니다. 즉, 게임을 순차적으로 수행하기로 결정했습니다. 따라서 한 게임을 완료하는 데 10 분이 걸리면 10 개의 게임은 100 분이 걸리고 한 게임에서 다른 게임으로 전환하는 데 6 초가 걸리고 10 개의 게임에서는 54 초 (약 1 분)라고 가정합니다.

전체 이벤트가 약 101 분 안에 완료됩니다 ( WORST APPROACH )

2) 동시 동시-프로가 자신의 차례를 플레이하고 다음 플레이어로 넘어 가서 10 명의 플레이어가 동시에 플레이하고 있지만 프로 플레이어는 한 번에 두 사람과 함께 있지 않은 경우 차례를 플레이하고 다음 사람으로 넘어갑니다. 이제 프로 선수가 자신의 턴을 플레이하는 데 6 초가 걸리고 프로 선수의 전이 시간도 6 초라고 가정하면 첫 선수로 돌아가는 총 전환 시간은 1 분 (10x6 초)이됩니다. 따라서 이벤트가 시작된 첫 사람에게 돌아올 때까지 2 분이 지났습니다 (10xtime_per_turn_by_champion + 10xtransition_time = 2mins).

모든 플레이어가 SERIAL 이벤트에서 게임 당 10 분을 기준으로 45 초 동안 턴을 완료한다고 가정합니다. 게임이 끝나기 전 라운드 수는 600 / (45 + 6) = 11 라운드 (약)

따라서 전체 이벤트는 약 11xtime_per_turn_by_player _ & _ champion + 11xtransition_time_across_10_players = 11x51 + 11x60sec = 561 + 660 = 1221sec = 20.35 분 (약)

101 분에서 20.35 분 사이에 개선을보십시오 ( 더 나은 접근 방식 )

3) PARALLEL- 주최측이 추가 자금을 확보하여 두 명의 전문 챔피언 플레이어 (동등한 능력) 를 초대하기로 결정하고 5 명의 두 그룹으로 동일한 10 명의 플레이어 (챌린저) 세트를 나누어 두 명의 챔피언 즉, 하나에 할당 각 그룹. 이제 이벤트는이 두 세트에서 동시에 진행됩니다. 즉, 각 그룹에서 두 명의 선수 (각 그룹에서 한 명)가 두 명의 프로 선수와 대결하고 있습니다.

그러나 그룹 내에서 프로 선수는 한 번에 한 명씩 (즉, 순차적으로) 가져 가므로 계산없이 전체 이벤트가 거의 101/2 = 50.5 분 안에 완료된다고 쉽게 추론 할 수 있습니다

101 분에서 50.5 분 사이에 개선을보십시오 ( GOOD APPROACH )

4) CONCURRENT + PARALLEL- 위 시나리오에서, 두 챔피언 플레이어가 각 그룹의 5 명의 플레이어와 동시에 플레이 (2 포인트 읽기)하여 그룹 간 게임이 동시에 실행되지만 그룹 내에서 동시에 실행된다고 가정합니다.

따라서 한 그룹의 게임은 대략 11xtime_per_turn_by_player _ & _ champion + 11xtransition_time_across_5_players = 11x51 + 11x30 = 600 + 330 = 930 초 = 15.5 분 (대략)에 완료됩니다

따라서 두 개의 병렬 실행 그룹을 포함하는 전체 이벤트는 약 15.5 분 후에 완료됩니다.

101 분에서 15.5 분 사이에 개선을보십시오 ( 최고의 접근 방식 )

참고 : 위 시나리오에서 10 명의 플레이어를 10 개의 유사한 작업으로 교체하고 2 명의 프로페셔널 플레이어를 2 개의 CPU 코어로 교체하면 다음 순서가 다시 유지됩니다.

직렬> 병렬> 동시> 동시 + 병렬

(참고 :이 순서는 작업의 상호 종속성, 통신 작업 흑백 작업 및 전환 오버 헤드 흑백 작업에 따라 크게 달라 지므로 다른 시나리오에서는 변경 될 수 있습니다)


2
좋은 설명입니다. 한 가지 추가 사항이 있습니다. 두 번째 경우 (프로 플레이어가 흑백 플레이어를 움직일 때)에 대한 동시 모델은 플레이어가 45 초 안에 자신의 차례를 수행하는 경우에만 개선됩니다. 다시 말해 전체 프로세스에서 I / O를 대기해야합니다. 일반 플레이어가 45 초 (5 초 또는 10 초) 미만으로 돌릴 수있는 경우 향상은 줄어 듭니다. 따라서 작업에서 I / O 대기 시간이 없으면 동시성은 직렬 실행과 거의 같습니다.
Psylone

33

간단한 예 :

동시 : "하나의 ATM 기계에 액세스하는 두 개의 큐"

병렬 : "두 개의 대기열과 두 개의 ATM 기계"


그리고 멀티 스레딩? 멀티 스레딩이라는 용어가 위 시나리오에서 어떻게 적용되는지 생각하면됩니다. 이 경우, 각 대기열에서 하나와 같이 Concurrent == 멀티 스레딩이 매 순간마다 ATM을 사용합니까?
KhoPhi

31

비디오 자습서를보고 새로운 프로그래밍 언어를 배우는 것을 상상해보십시오. 비디오를 일시 중지하고 코드에서 말한 내용을 적용한 다음 계속 시청해야합니다. 동시성입니다.

이제 당신은 전문 프로그래머입니다. 그리고 코딩하는 동안 차분한 음악을들을 수 있습니다. 그것은 평행입니다.

Andrew Gerrand가 GoLang 블로그 에서 말했듯이

동시성은 많은 것들을 한 번에 처리하는 것입니다. 병렬 처리는 한 번에 많은 작업을 수행하는 것입니다.

즐겨.


29

그들은 다른 문제를 해결합니다. 동시성은 CPU 리소스 부족과 많은 작업 문제를 해결합니다. 따라서 부족한 리소스에 대한 시간을 공유하기 위해 코드를 통해 스레드 또는 독립적 인 실행 경로를 만듭니다. 최근까지 CPU 가용성으로 인해 동시성이 논의를 지배했습니다.

병렬 처리는 충분한 작업과 적절한 작업 (정확하게 분리 될 수있는 작업)을 찾아서 많은 CPU 리소스에 분산시키는 문제를 해결합니다. 병렬 처리는 항상 진행되어 왔지만 멀티 코어 프로세서가 너무 저렴하기 때문에 앞으로 나아갈 것입니다.


28

동시성 : 리소스를 공유 할 수있는 가능성이있는 여러 실행 흐름

예 : I / O 포트를 위해 경쟁하는 두 개의 스레드.

병렬화 (paralelism) : 여러 개의 유사한 청크로 문제를 나누기.

예 : 파일의 절반마다 두 개의 프로세스를 실행하여 큰 파일을 구문 분석합니다.


21

동시 프로그래밍 실행에는 비 병렬 동시 프로그래밍과 병렬 동시 프로그래밍 (병렬 처리라고도 함)의 두 가지 유형이 있습니다.

가장 큰 차이점은 사람의 눈에는 평행하지 않은 동시성 스레드가 동시에 실행되는 것처럼 보이지만 실제로는 그렇지 않다는 것입니다. 비 병렬 동시성 스레드에서는 시간 분할을 통해 프로세서를 빠르게 전환하고 교체합니다. 병렬 처리에는 여러 개의 프로세서가 있으므로 여러 개의 스레드가 동시에 다른 프로세서에서 실행될 수 있습니다. 여기에 이미지 설명을 입력하십시오

참조 : 프로그래밍 언어의 동시성 소개


8
천 단어의 가치
senseiwu

21

병렬 처리는 multiple cores per CPU또는 에서 프로세스를 동시에 실행하는 것입니다 multiple CPUs (on a single motherboard).

동시성 은 CPU 시간 (시간 분할)을 나누는 스케줄링 알고리즘 을 사용하여 병렬 처리 를 달성 할 때 입니다. 프로세스가 인터리브 됩니다.single core/CPU

단위 :

  • 단일 CPU에 1 개 또는 많은 코어 (대부분의 최신 프로세서)
  • 마더 보드에 1 개 이상의 CPU (구식 서버 생각)
  • 1 응용 프로그램은 1 프로그램입니다 (Chrome 브라우저를 생각하십시오)
  • 1 개의 프로그램은 하나 이상의 프로세스를 가질 수 있습니다 (각 Chrome 브라우저 탭은 프로세스라고 생각)
  • 하나의 프로세스는 하나의 프로그램에서 하나 이상의 스레드를 가질 수 있습니다 (크롬 탭은 하나의 스레드에서 유튜브 비디오를 재생합니다. 다른 스레드는 주석 섹션을 위해 생성되고 다른 스레드는 사용자 로그인 정보를 위해 생성됩니다)
  • 따라서 하나의 프로그램은 하나 또는 여러 개의 실행 스레드를 가질 수 있습니다.
  • 1 프로세스는 thread(s)+allocated memory resources by OS (힙, 레지스터, 스택, 클래스 메모리)

2
이것이 컴퓨터 과학 세계에서 완벽한 해답이라고 생각합니다.
sofs1

1
이 답변은 위와 아래의 철학이 아닌 수용된 답변이어야합니다.
Eugen Sunic

10

동시성 => 여러 작업이 공유 리소스와 겹치는 기간에 수행되는 경우 (자원 활용도를 최대화 할 수 있음).

병렬 => 단일 작업이 여러 개의 간단한 독립적 인 하위 작업으로 나누어 져 동시에 수행 될 수 있습니다.


겹치는 처리의 모양을 제공하기 위해 멀티 태스킹 (타임 슬라이스)을하는 단일 코어 프로세서 시스템을 어떻게 설명 하시겠습니까? 동시성이 겹치는 시간에 실행으로 정의되면이 처리가 포함됩니다. 동시성 정의에서 제외되는 동시 실행에 대해 설명했습니다.
acarlon

9

서버가 대기열의 첫 번째 작업 만 처리 할 수있는 서비스 대기열이라고 생각하십시오.

서버 1 개, 작업 큐 1 개 (작업 5 개)-> 동시성 없음, 병렬 처리 없음 (하나의 작업 만 완료되도록 서비스되고 큐의 다음 작업은 서비스 된 작업이 완료 될 때까지 기다려야하며 다른 서버가 없습니다. 그것을 서비스)

하나의 서버, 두 개 이상의 다른 큐 (큐당 5 개의 작업 포함)-> 동시성 (서버가 큐의 모든 첫 번째 작업과 동일 또는 가중치를 공유하므로 시간이 동일하므로) 서비스되고있는 직업.

2 개 이상의 서버, 하나의 큐-> 병렬 처리 (동시에 2 개의 작업이 완료 됨), 동시성 없음 (서버가 시간을 공유하지 않음, 3 번째 작업은 서버 중 하나가 완료 될 때까지 기다려야 함)

2 개 이상의 서버, 2 개 이상의 다른 큐-> 동시성 및 병렬 처리

다시 말해, 동시성은 작업을 완료하는 데 시간을 공유하는 것입니다. 작업을 완료하는 데는 같은 시간이 걸리지 만 최소한 일찍 시작됩니다. 중요한 것은 작업을 더 작은 작업으로 분할하여 인터리빙 할 수 있다는 것입니다.

병렬 처리는 병렬로 실행되는 더 많은 CPU, 서버, 사람 등으로 이루어집니다.

리소스가 공유되면 순수한 병렬 처리를 수행 할 수 없지만 동시성이 가장 실용적으로 사용되어 해당 리소스가 필요없는 다른 작업을 수행하게됩니다.


7

나는 여기에 인기있는 답변 중 일부와 약간 충돌하는 답변을 제공 할 것입니다. 제 생각에는 동시성은 병렬 처리를 포함하는 일반적인 용어입니다. 동시성 은 개별 작업 또는 작업 단위가 시간이 겹치는 모든 상황에 적용됩니다. 병렬 처리 는 별도의 작업 단위가 동일한 물리적 시간에 평가 / 실행되는 상황에보다 구체적으로 적용됩니다. 병렬 처리의 장점은 여러 물리적 컴퓨팅 리소스를 활용할 수있는 소프트웨어 속도를 높이는 것입니다. 동시성에 맞는 다른 주요 개념은 상호 작용입니다. 상호 작용업무의 중복이 외부 세계에서 관찰 될 때 적용됩니다. 상호 작용의 요충은 사용자, 네트워크 피어, 하드웨어 주변 장치 등과 같은 실제 엔티티에 응답하는 소프트웨어를 만드는 것입니다.

병렬성과 상호 작용은 거의 전적으로 독립적 인 동시성 차원입니다. 특정 프로젝트의 경우 개발자는 둘 다 또는 둘 다 신경 쓰지 않을 수 있습니다. 스레드의 가증 성이 두 가지를 모두 수행하기에 상당히 편리한 기본 요소를 제공하기 때문에, 특히 혼란스러운 경향이 있습니다.

병렬 처리에 대한 좀 더 자세한 내용 :

병렬 처리는 매우 작은 규모 (예 : 프로세서의 명령어 수준 병렬 처리), 중간 규모 (예 : 멀티 코어 프로세서) 및 대규모 (예 : 고성능 컴퓨팅 클러스터)로 존재합니다. 최근 멀티 코어 프로세서의 성장으로 인해 소프트웨어 개발자들이 더 많은 스레드 수준의 병렬 처리를 요구하는 압력이 증가하고 있습니다. 병렬화는 의존성 이라는 개념과 밀접한 관련이 있습니다. 의존성은 병렬화가 달성 될 수있는 정도를 제한합니다. 한 작업이 다른 작업에 의존하는 경우 두 가지 작업을 병렬로 실행할 수 없습니다 (추론 무시).

프로그래머가 병렬성을 표현하기 위해 사용하는 많은 패턴과 프레임 워크가 있습니다 : 파이프 라인, 작업 풀, 데이터 구조에 대한 집계 작업 ( "병렬 배열").

상호 작용에 대한 좀 더 자세한 내용 :

대화 형 작업을 수행하는 가장 기본적이고 일반적인 방법은 이벤트를 사용하는 것입니다 (예 : 이벤트 루프 및 처리기 / 콜백). 간단한 작업에는 이벤트가 좋습니다. 이벤트로 더 복잡한 작업을 시도하면 스택 리핑이 발생합니다 (일명 콜백 지옥, 일명 제어 역전). 이벤트가 발생하면 생성기, 코 루틴 (일명 Async / Await) 또는 협업 스레드와 같은 이국적인 작업을 시도 할 수 있습니다.

신뢰할 수있는 소프트웨어를 좋아한다면 대화 형 작업 인 경우 스레드를 사용하지 마십시오.

Curmudgeonliness

나는 Rob Pike의 "동시성은 병렬 처리가 아니라 더 낫다"라는 슬로건을 싫어한다. 동시성은 병렬 처리보다 낫지도 나쁘지도 않습니다. 동시성은 병렬 처리와 비교하여 더 나은 / 더 나쁜 방법으로 비교할 수없는 상호 작용을 포함합니다. "제어 흐름이 데이터보다 낫다"고 말하는 것과 같습니다.


6

전자 장치에서 직렬병렬 은 회로의 실제 동작을 결정하는 정적 토폴로지 유형을 나타냅니다. 동시성이없는 경우 병렬 처리는 결정적 입니다.

동적 인 시간 관련 현상 을 설명하기 위해 순차적동시 라는 용어를 사용합니다 . 예를 들어, 특정 결과는 특정 순서 의 작업 (예 : 레시피)을 통해 얻을 수 있습니다 . 우리가 누군가와 이야기 할 때, 우리는 일련의 단어를 생성합니다. 그러나 실제로 많은 다른 프로세스가 동시에 발생하므로 특정 작업의 실제 결과와 일치 합니다. 많은 사람들이 동시에 이야기하는 경우 동시 대화가 시퀀스를 방해 할 수 있지만이 간섭의 결과는 미리 알려져 있지 않습니다. 동시성은 불확실성을 도입 합니다.

직렬 / 병렬 및 순차 / 동시 특성은 직교입니다. 이에 대한 예는 디지털 통신입니다. (A)에 직렬 어댑터 , 디지털 메시지 (즉 시간적 순차적 같은 통신 라인 (예. 한 선)를 따라 분포). (A)에 평행 어댑터 이 병렬 통신 라인 (예. 많은 와이어)에서도 분할하고, 그 수신 측에서 재구성.

어린이 9 명과 함께 게임 이미지를 만들어 봅시다. 우리가 그것들을 체인으로 처분하고, 처음에 메시지를주고, 마지막에 그것을 받으면, 우리는 직렬 통신을 할 것입니다. 더 많은 단어가 일련의 커뮤니케이션 단합으로 구성된 메시지를 구성합니다.

I like ice-cream so much. > X > X > X > X > X > X > X > X > X > ....

이것은 직렬 인프라 에서 재생 되는 순차적 프로세스 입니다.

이제 아이들을 3 그룹으로 나누는 이미지를 만들어 봅시다. 우리는 문구를 세 부분으로 나누고, 첫 번째 줄은 왼쪽 줄의 자식에게, 두 번째 줄은 중심선의 자식에게 줄 것입니다.

I like ice-cream so much. > I like    > X > X > X > .... > ....
                          > ice-cream > X > X > X > ....
                          > so much   > X > X > X > ....

이것은 병렬 인프라 에서 재생 되는 순차적 프로세스입니다 (여전히 부분적으로 직렬화 됨).

두 경우 모두, 어린이들 사이에 완벽한 의사 소통이 있다고 가정하면 결과는 미리 결정 됩니다.

귀하와 동시에 첫 번째 자녀와 대화하는 다른 사람이있는 경우, 우리는 동시 절차 를 갖습니다 . 우리는 인프라가 어떤 프로세스를 고려해야할지 모릅니다. 따라서 최종 결과는 미리 결정되지 않습니다 .


흥미로운 +1. 하나의 정의를 계산할 때, 현재 받아 들여진 답변에 따라 동시는 반드시 동시에 (필수) 병렬 시간이 아닌 겹치는 시간주기에서의 실행을 의미합니다. 전자 공학에서는 동시에 일어나는 일의 모양을 제공하도록 설계되었지만 매우 빠르게 전환되는 회로를 어떻게 설명합니까? 아이스크림 비유를 계속하려면 : 나는 아이스크림을 너무 좋아합니다> 아이 A1을 좋아합니다> 아이 B1 아이스크림을> 아이 C1을 너무 많이> 아이 A2를 좋아합니다> 아이 B2 아이스크림을 <아이 C2 너무 ...
acarlon

나는 이것을 s1l3n0.blogspot.com/2013/04/… 에서 처음 보았다 .
FrankHB

예, 개인 블로그 노트 중 하나에 대한 답변을 수정 / 확장했습니다. ;)
s1l3n0

5

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

  1. 단일 프로세서 (스케줄러 또는 스레드 풀에서 관리하는 다중 스레드)에서 동시 실행 가능

  2. 단일 프로세서가 아니라 여러 프로세서에서 병렬 실행이 가능합니다. (프로세서 당 하나의 프로세스)

  3. 분산 컴퓨팅은 또한 관련 주제이며 동시 컴퓨팅이라고도 할 수 있지만 병렬 처리와 같이 역방향은 사실이 아닙니다.

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


5

나는 다른 답변 에서이 그래픽 표현을 정말로 좋아했습니다. 위의 많은 답변보다 질문에 훨씬 잘 대답합니다.

병렬 처리와 동시성 두 스레드가 동시에 실행되면 동시에 실행됩니다. 예를 들어 A와 B라는 두 개의 스레드가 있으면 병렬 실행은 다음과 같습니다.

CPU 1 : A ------------------------->

CPU 2 : B ------------------------->

두 개의 스레드가 동시에 실행되면 실행이 겹칩니다. 겹치는 것은 다음 두 가지 방법 중 하나로 발생할 수 있습니다. 스레드가 동시에 실행 중이거나 (위와 같이 병렬로 수행되거나) 실행이 프로세서에서 인터리브되고 있습니다.

CPU 1 : A -----------> B ----------> A -----------> B -------- ->

따라서 병렬 처리는 동시성의 특별한 경우로 생각할 수 있습니다.

출처 : 또 다른 대답

희망이 도움이됩니다.


4

이 질문에 대한 Paul Butcher의 답변 이 정말 마음에 듭니다 ( 7 주 동안 7 개의 동시성 모델을 작성했습니다 ).

그것들은 종종 혼란 스럽지만, 병렬성과 동시성은 서로 다릅니다. 동시성은 문제 영역의 한 측면입니다. 코드는 여러 동시 (또는 거의 동시) 이벤트처리 해야 합니다 . 이와 대조적으로 병렬 처리는 솔루션 도메인의 한 측면입니다 . 문제의 다른 부분을 병렬로 처리하여 프로그램을 더 빠르게 실행 하려고합니다 . 일부 접근 방식은 동시성, 일부 병렬 처리 및 두 가지 모두에 적용 할 수 있습니다. 당신이 직면하고있는 것을 이해하고 작업에 적합한 도구를 선택하십시오.


3

동시성 은 작업이 동시에 실행되거나 실행되지 않을 수 있습니다 (실제로 별도의 프로세서 / 코어에서 실행될 수 있지만 "틱"으로 실행될 수도 있음). 무엇 중요한 것은 그 동시성은 항상 참조입니다 하나의 큰 작업의 조각을하고 . 기본적으로 일부 계산의 일부입니다. 동시에 할 수있는 것과하지 말아야 할 것과 동기화 방법에 대해 똑똑해야합니다.

병렬 처리는 몇 가지 작업을 동시에 수행하고 있음을 의미합니다. 그들은 하나의 문제를 해결하는 데 참여할 필요가 없습니다. 예를 들어 스레드는 각각 하나의 문제를 해결할 수 있습니다. 물론 동기화는 다른 관점에서 적용됩니다.


3

"동시성"은 진행중인 여러 항목이 있는 경우 입니다.

"병렬"은 동시 작업이 진행되는 시점입니다 동시에 .


병렬 처리가없는 동시성의 예 :

  • 단일 코어에 여러 스레드가 있습니다.
  • Win32 메시지 큐에 여러 메시지가 있습니다.
  • MARSSqlDataReader 에 여러 개의 연결 .
  • 브라우저 탭에서 여러 JavaScript 약속 .

그러나 동시성과 병렬 처리의 차이점은 종종 관점의 문제입니다. 위의 예제는 코드 실행 (관측 가능한 효과)의 관점에서 평행하지 않습니다. 그러나 단일 코어 내에서도 명령 수준 병렬 처리가 있습니다. CPU와 병렬로 작업을 수행하고 완료되면 CPU를 중단시키는 하드웨어가 있습니다. 윈도우 프로 시저 또는 이벤트 핸들러가 실행되는 동안 GPU가 화면에 그려 질 수 있습니다 . DBMS가 이전 쿼리의 결과를 계속 가져 오는 동안 다음 쿼리에 대해 B-Tree를 통과 할 수 있습니다. 실행 중 브라우저가 레이아웃 또는 네트워킹을 수행 중일 수 있습니다 Promise.resolve(). 등

그래서 당신은 간다. 세상은 언제나처럼 지저분합니다.)


3

내 의견으로는 둘을 이해하는 가장 간단하고 가장 우아한 방법은 이것입니다. 동시성은 실행 인터리빙을 허용하므로 병렬 처리 의 환영 을 줄 수 있습니다 . 즉, 동시 시스템은 예를 들어 Word로 문서를 작성하는 동시에 Youtube 비디오를 실행할 수 있습니다. 동시 시스템 인 기본 OS를 사용하면 해당 작업이 실행을 인터리브 할 수 있습니다. 컴퓨터는 명령을 너무 빨리 실행하기 때문에 한 번에 두 가지 작업을 수행하는 것처럼 보입니다.

그런 일이 정말 때 병렬 처리는 있다병렬성 병렬 입니다. 위의 예에서 비디오 처리 코드가 단일 코어에서 실행되고 Word 응용 프로그램이 다른 코어에서 실행되고 있음을 알 수 있습니다. 이것은 동시 프로그램도 병렬로 진행될 수 있음을 의미합니다! 스레드와 프로세스를 사용하여 응용 프로그램을 구조화하면 프로그램이 기본 하드웨어를 이용하고 잠재적으로 병렬로 수행 할 수 있습니다.

왜 모든 것이 평행하지 않습니까? 한 가지 이유는 동시성은 프로그램 을 구성 하는 방법 이고 문제를 쉽게 분리 할 수있는 설계 결정 이기 때문입니다. 반면 병렬 처리는 종종 성능 이름으로 사용됩니다. 다른 하나는 기본적으로 일부 작업을 완전히 병렬로 수행 할 수 없다는 것입니다. 예를 들어 대기열 뒤에 두 가지를 추가하는 것이 있습니다. 두 가지를 동시에 삽입 할 수는 없습니다. 무엇인가가 뒤쳐 져야하고 그렇지 않으면 큐를 엉망으로 만듭니다. 우리는 그러한 실행을 인터리브 할 수 있지만 동시 큐를 얻을 수는 있지만 병렬로 가질 수는 없습니다.

도움이 되었기를 바랍니다!


3

동시 프로그래밍은 겹치는 것처럼 보이고 주로 비 결정적 제어 흐름으로 인해 발생하는 복잡성과 관련된 작업을 고려합니다. 동시 프로그램과 관련된 양적 비용은 일반적으로 처리량과 대기 시간입니다. 동시 프로그램은 종종 IO 바인딩이지만 항상 그런 것은 아닙니다. 예를 들어 동시 가비지 수집기는 전적으로 CPU에 있습니다. 동시 프로그램의 교육적 예는 웹 크롤러입니다. 이 프로그램은 웹 페이지에 대한 요청을 시작하고 다운로드 결과가 나오면 동시에 응답을 수락하여 이미 방문한 페이지 세트를 누적합니다. 프로그램이 실행될 때마다 응답이 반드시 동일한 순서로 수신 될 필요는 없기 때문에 제어 흐름은 비 결정적입니다. 이 특성으로 인해 동시 프로그램을 디버깅하기가 매우 어려울 수 있습니다. 일부 응용 프로그램은 기본적으로 동시성입니다. 예를 들어 웹 서버는 클라이언트 연결을 동시에 처리해야합니다. Erlang은 아마도 동시 프로그래밍에있어 가장 유망한 언어 일 것입니다.

병렬 프로그래밍은 처리량 향상이라는 특정 목표를 위해 겹치는 작업과 관련이 있습니다. 제어 흐름을 결정 론적으로 만들어 동시 프로그래밍의 어려움을 피할 수 있습니다. 일반적으로 프로그램은 병렬로 실행되는 하위 작업 세트를 생성하고 상위 작업은 모든 하위 작업이 완료된 후에 만 ​​계속됩니다. 따라서 병렬 프로그램을 훨씬 쉽게 디버깅 할 수 있습니다. 병렬 프로그래밍의 어려운 부분은 세분성 및 통신과 같은 문제와 관련된 성능 최적화입니다. 후자는 여전히 한 캐시에서 다른 캐시로 데이터를 전송하는 데 상당한 비용이 들기 때문에 멀티 코어와 관련하여 여전히 문제가됩니다. 고밀도 매트릭스-행렬 곱셈은 병렬 프로그래밍의 교육적 예이며 Straasen을 사용하여 효율적으로 해결할 수 있습니다. 분할 및 정복 알고리즘과 하위 문제를 동시에 공격합니다. Cilk는 아마도 공유 메모리 컴퓨터 (멀티 코어 포함)에서 고성능 병렬 프로그래밍을위한 가장 유망한 언어 일 것입니다.

내 답변에서 복사 : https : //.com/a/3982782


2

병렬 처리 : 여러 스레드가 비슷한 작업을 수행하여 데이터 및 리소스 측면에서 서로 독립적 인 작업을 수행합니다. 예 : Google 크롤러는 수천 개의 스레드를 생성 할 수 있으며 각 스레드는 독립적으로 작업을 수행 할 수 있습니다.

동시성 : 스레드간에 데이터를 공유하고 공유하는 리소스가 있으면 동시성이 나타납니다. 트랜잭션 시스템에서 이것은 잠금, 세마포어 등과 같은 기술을 사용하여 코드의 중요 섹션을 동기화해야 함을 의미합니다.


이것은 두 용어의 본질을 포착하므로 허용되는 답변 IMO 여야합니다.
michid

2

(나는 그러한 근본적인 질문이 수년 동안 정확하고 깔끔하게 해결되지 않은 것에 놀랐습니다 ...)

요컨대, 동시성과 병렬 처리는 컴퓨팅의 속성입니다 .

차이점 은 Robert Harper의 설명입니다 .

가장 먼저 이해해야 할 것은 병렬 처리는 동시성과 관련이 없다는 것입니다 . 동시성은 프로그램 (또는 그 구성 요소)의 비 결정적 구성 과 관련이 있습니다. 병렬 처리는 결정 론적 행동 을하는 프로그램의 점근 적 효율성 과 관련이 있습니다. 동시성은 관리 할 수없는 관리에 관한 것입니다. 이벤트는 제어 할 수없는 이유로 도착하며 이에 대응해야합니다. 사용자가 마우스를 클릭하면 디스플레이에주의가 필요하더라도 창 관리자가 응답해야합니다. 이러한 상황은 본질적으로 비 결정적이지만 우리는 또한 예측을 사용합니다구성 요소가 이벤트를 임의의 순서로 신호한다고 가정하고 결정에 따라 응답해야한다고 결정함으로써 결정 론적 설정에서의 비결정론. 비 결정적 구성은 강력한 프로그램 구조화 아이디어입니다. 반면에 병렬 처리는 결정 론적 계산의 하위 계산 간의 종속성에 관한 것입니다. 그 결과는 의심의 여지가 없지만이를 달성 할 수있는 많은 방법이 있습니다. 우리는 이러한 기회를 우리의 이점으로 활용하고자합니다.

그것들은 프로그램에서 일종의 직교 속성이 될 수 있습니다. 추가 그림을 보려면 이 블로그 게시물 을 읽으십시오 . 그리고 이것은 스레드와 같은 프로그래밍의 구성 요소에 대한 차이점에 대해 약간 더 논의했습니다 .

스레딩 또는 멀티 태스킹은 모두보다 구체적인 목적을 제공하는 컴퓨팅의 구현입니다. 병렬 처리 및 동시성과 관련 될 수 있지만 필수적인 방식은 아닙니다. 따라서 그들은 설명을 시작하기에 좋은 항목이 아닙니다.

또 하나의 하이라이트 : (물리적) "시간"은 여기서 논의 된 속성과 거의 관련이 없습니다. 시간은 속성의 중요성을 보여주기 위해 측정을 구현하는 방법 일뿐 본질과는 거리가 멀다. 시간 복잡성 에서 "시간"의 역할을 두 번 생각하십시오. 다소 비슷하지만 측정이 종종 중요합니다.


2

"동시"는 동시에 무엇이든하고 있습니다. 그것들은 다른 것들이거나 같은 것일 수 있습니다. 받아 들여지지 않은 대답에도 불구하고 "동시에 나타나는 것"은 아닙니다. 정말 동시에입니다. 동시 코드를 실행하려면 한 호스트 내에서 공유 메모리를 사용하거나 다른 호스트에서 분산 메모리를 사용하여 여러 개의 CPU 코어가 필요합니다. 동시에 동시에 실행되는 3 가지 개별 작업의 파이프 라인은 예입니다. 작업 수준 -2는 작업 수준 1에 의해 완료된 단위를 기다려야하고 작업 수준 3은 완료된 작업 단위를 기다려야합니다. 작업 수준 -2. 다른 예는 1- 생산자와 1- 소비자의 동시성입니다. 또는 많은 생산자 및 1 소비자; 독자와 작가; et al.

"병렬"은 동시에 같은 일을하고 있습니다. 동시에 수행되지만, 동시에 동시에 발생하는 동일한 동작이며, 일반적으로 다른 데이터에서 발생합니다. 동일한 연산이 반복적으로 실행되기 때문에 행렬 대수를 병렬화하는 경우가 종종 있습니다. 예를 들어 행렬의 열 합계는 모두 동일한 동작 (sum)을 사용하지만 다른 열에서 동시에 계산할 수 있습니다. 사용 가능한 프로세서 코어간에 열을 분할 (분할)하는 것이 일반적인 전략이므로 각 프로세서 코어에서 처리하는 것과 동일한 작업량 (열 수)에 가깝습니다. 작업을 분리하는 또 다른 방법은 작업을 완료 한 작업자가 작업을 수행하는 관리자에게 다시 작업을 수행하고 모든 작업이 완료 될 때까지 더 많은 작업을 동적으로 수행하는 작업 백입니다. 발권 알고리즘은 또 다른 것입니다.

숫자 코드 만 병렬화 할 수는 없습니다. 파일을 너무 자주 병렬 ​​처리 할 수 ​​있습니다. 자연어 처리 응용 프로그램에서 수백만 개의 문서 파일 각각에 대해 문서의 토큰 수를 계산해야 할 수 있습니다. 모든 파일에 대해 동일한 동작 인 토큰을 계산하기 때문에 이는 병렬입니다.

다시 말해, 병렬 처리는 동일한 동작이 동시에 수행되는 경우입니다. 동시에 의미하지만 반드시 같은 동작은 아닙니다. 병렬은 같은 일이 동시에 발생하는 특정 종류의 동시성입니다.

예를 들어, 원자 명령어, 중요 섹션, 상호 배제, 스핀 대기, 세마포어, 모니터, 장벽, 메시지 전달, 맵 감소, 하트 비트, 링, 티켓 알고리즘, 스레드, MPI, OpenMP 등의 용어가 포함됩니다.

Gregory Andrews의 연구는 멀티 스레드, 병렬 및 분산 프로그래밍이라는 최고의 교과서입니다.


1

좋아, 내가 이해 한 것을 보여주는 시나리오를 보자. A, B, C라는 3 명의 아이들이 있다고 가정 해 봅시다. A와 B 이야기, C 듣기. A와 B의 경우에는 평행입니다. A : 저는 A입니다. B : 나는 B입니다.

그러나 C의 경우, 그의 뇌는 A와 B를 듣기 위해 동시 과정을 밟아야합니다.


1

동시성 단순이란 둘 이상의 작업이 실행 중임을 의미합니다 (병렬로 필요하지 않음). 예를 들어 어떤 시점에서든 3 개의 작업이 있다고 가정합니다. 둘 이상의 작업이 실행 중이거나 모두 동시에 실행 중일 수 있습니다.

병렬 처리는 문자 그대로 병렬로 실행됨을 의미합니다. 따라서이 경우 세 개 모두 동시에 실행되어야합니다.


1

파이크의 "동시성"개념은 의도적 인 디자인 및 구현 결정입니다. 동시 가능 프로그램 설계는 행동 "병렬"을 나타내거나 나타내지 않을 수 있습니다. 런타임 환경에 따라 다릅니다.

동시성을 위해 설계되지 않은 프로그램에 의해 병렬 처리가 표시되는 것을 원하지 않습니다. :-) 그러나 관련 요소 (전력 소비, 성능 등)에 대한 순 이득 인 경우, 가능한 한 호스트 시스템이 실행을 병렬화 할 수 있도록 최대 동시 설계를 원합니다.

Pike의 Go 프로그래밍 언어는이를 극단으로 설명합니다. 그의 함수는 동시에 동시에 올바르게 실행될 수있는 모든 스레드입니다. 즉, 함수를 호출하면 시스템에서 가능한 경우 호출자와 동시에 실행되는 스레드가 생성됩니다. 수백 또는 수천 개의 스레드가있는 응용 프로그램은 그의 세계에서 완벽하게 평범합니다. (나는 Go 전문가가 아니에요, 그것은 단지 내가 맡은 것입니다.)

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