etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2023. 4. 30. 00:07
반응형

질문자 :StackUnderflow


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

예를 들어 주시면 감사하겠습니다.



동시성 은 두 개 이상의 작업이 겹치는 기간 에 시작, 실행 및 완료될 수 있는 경우입니다. 그것은 반드시 그들도 모두 같은 순간에 실행됩니다 것을 의미하지 않는다. 예를 들어, 단일 코어 시스템 에서 멀티태스킹.

병렬성 은 작업이 문자 그대로 동시에 실행되는 경우(예: 멀티코어 프로세서)입니다.


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

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

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


RichieHindle

혼란이 존재하는 이유

이 두 단어의 사전 의미가 거의 동일하기 때문에 혼동이 존재합니다.

  • Concurrent : 동시에 존재하거나, 발생하거나, 완료됨(dictionary.com)
  • Parallel : 매우 유사하며 동시에 발생하는 경우가 많습니다(merriam webster).

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

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

그렇다면 위의 정의는 무엇을 의미합니까?

나는 실제 세계의 비유로 명확히 할 것입니다. 하루에 2개의 매우 중요한 작업을 완료해야 한다고 가정해 보겠습니다.

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

이제 문제는 작업 1에서 여권을 받기 위해 줄을 4시간 동안 기다려야 하는 매우 관료적인 관공서에 가야 한다는 것입니다. 한편, task-2는 귀하의 사무실에서 요구하는 중요한 작업입니다. 둘 다 특정 날짜에 완료해야 합니다.

사례 1: 순차 실행

보통 운전을 해서 2시간 동안 여권 사무소에 가고, 4시간 동안 줄을 서서 일을 끝내고, 다시 2시간을 운전해서 집에 가고, 5시간 더 깨어 있고, 프레젠테이션을 마칩니다.

사례 2: 동시 실행

하지만 당신은 똑똑합니다. 당신은 미리 계획합니다. 노트북을 가지고 다니며 줄을 서서 기다리면서 프레젠테이션 작업을 시작합니다. 이렇게 하면 집에 돌아와서 5시간 대신 1시간만 더 일하면 됩니다.

이 경우 두 작업은 모두 사용자가 수행합니다. 줄을 서서 기다리는 동안 여권 작업을 중단하고 프레젠테이션 작업을 했습니다. 번호가 호출되면 프레젠테이션 작업을 중단하고 여권 작업으로 전환했습니다. 시간 절약은 본질적으로 두 작업의 중단 가능성으로 인해 가능했습니다.

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

사례 3: 병렬 실행

자, 당신은 똑똑한 친구이므로 분명히 상위 직급이고 조수가 있습니다. 따라서 여권 작업을 시작하기 위해 떠나기 전에 그에게 전화를 걸어 프레젠테이션의 첫 번째 초안을 준비하라고 합니다. 하루 종일 보내고 여권 작업을 마치고 돌아와서 메일을 보고 프레젠테이션 초안을 찾습니다. 그는 꽤 견고한 일을 해냈고 2시간 동안 몇 가지 편집을 하면 완성됩니다.

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

아직도 나와 함꼐? 괜찮은...

사례 4: 동시적이지만 병렬적이지 않음

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

사례 5: 병렬이지만 동시적이지 않음

관공서가 건물에 들어가기 위해 보안 검색을 한다고 가정해 봅시다. 여기에서 모든 전자 기기를 제거하고 경찰관에게 제출해야 하며 작업을 완료한 후에만 기기를 반환합니다.

이 경우 Passport 작업은 독립 가능 하지도 중단 가능 하지도 않습니다. 줄을 서서 기다려도 필요한 장비가 없기 때문에 다른 작업을 할 수 없습니다.

마찬가지로, 프레젠테이션이 본질적으로 매우 수학적이어서 최소 5시간 동안 100% 집중이 필요하다고 가정해 보겠습니다. 노트북을 가지고 있더라도 여권 작업을 위해 줄을 서서 기다리는 동안에는 할 수 없습니다.

이 경우 프레젠테이션 작업은 독립적 이지만(당신이나 당신의 조수가 5시간의 집중적인 노력을 기울일 수 있음) 방해 할 수는 없습니다.

사례 6: 동시 및 병렬 실행

이제 프레젠테이션에 조수를 지정하는 것 외에도 여권 작업에 랩톱을 휴대한다고 가정해 보겠습니다. 줄을 서서 기다리는 동안 보조자가 공유 자료에서 처음 10개의 슬라이드를 만든 것을 볼 수 있습니다. 당신은 약간의 수정과 함께 그의 작업에 대한 의견을 보냅니다. 나중에 집에 도착하면 드래프트를 완료하는 데 2시간이 아니라 15분이면 됩니다.

이것은 프레젠테이션 작업이 독립성 (둘 중 어느 쪽이든 할 수 있음)과 인터럽트 가능성 (중지하고 나중에 다시 시작할 수 있음)이 있기 때문에 가능했습니다. 따라서 두 작업을 동시에 실행하고 프레젠테이션 작업을 병렬로 실행했습니다.

지나치게 관료적일 뿐만 아니라 정부 기관이 부패했다고 가정해 봅시다. 따라서 신분증을 보여주고 입력하고 번호가 불릴 때까지 줄을 서서 기다리기 시작하고 경비원과 다른 사람에게 뇌물을 주어 줄을 서고 몰래 빠져 나와 번호가 불리기 전에 돌아와서 다시 대기할 수 있습니다. 당신 자신.

이 경우 여권 및 프레젠테이션 작업을 동시에 병렬로 수행할 수 있습니다. 당신은 몰래 빠져나갈 수 있고, 당신의 자리는 당신의 조수가 차지합니다. 그런 다음 둘 다 프레젠테이션 등의 작업을 할 수 있습니다.


컴퓨터 과학으로 돌아가기

컴퓨팅 세계에서 다음은 이러한 각 경우의 일반적인 예시 시나리오입니다.

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

동시성과 이동

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

go 키워드와 채널을 사용하여 이 깨기를 정말 쉽게 만드는 데 있습니다. 또한 이러한 고루틴을 예약하기 위해 런타임에 뛰어난 기본 지원이 있습니다.

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

사과가 오렌지보다 낫다?


Methos

나는 Rob Pike의 연설을 좋아합니다: 동시성은 병렬이 아닙니다(더 좋습니다!) (슬라이드) (토론)

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

과제: 쓸모없는 언어 매뉴얼 더미를 불태우자! 한번에 한!

일

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

고퍼

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


asfer

다른 사람들의 말에 덧붙이자면:

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


Thomas T

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

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

두 경우 모두 하나 이상의 스레드가 실행되고 있다는 단순한 사실에서 동시성이 있습니다.

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

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


Pithikos

동시성: 두 개 이상의 문제가 단일 프로세서로 해결되는 경우.대체 텍스트

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

대체 텍스트


Rajendra Uppal

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

이제 당신은 전문 프로그래머입니다. 그리고 코딩하는 동안 잔잔한 음악을 듣는 것을 즐깁니다. 병렬성입니다.

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

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

즐기다.


Ramy M. Mousa

흥미롭고 이해하기 쉬운 예를 들어 설명하겠습니다. :)

조직에서 10명의 플레이어( 동등한 체스 플레이 기술을 가진 )가 프로 챔피언 체스 플레이어에게 도전하는 체스 토너먼트를 조직한다고 가정합니다. 그리고 체스는 1:1 게임이기 때문에 주최측은 가능한 한 빨리 전체 이벤트를 마칠 수 있도록 10개의 게임을 시간 효율적으로 진행해야 합니다.

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

1) SERIAL - 프로가 1인 1조로 게임을 한다고 가정해 봅시다. 즉, 한 사람과 게임을 시작하고 끝내고 다음 사람과 다음 게임을 시작하는 식입니다. 즉, 게임을 순차적으로 진행하기로 했습니다. 따라서 한 게임을 완료하는 데 10분이 걸린다면 10개의 게임은 100분이 걸리고 한 게임에서 다른 게임으로 전환하는 데 6초가 걸리고 10개 게임의 경우 54초(약 1분)가 걸린다고 가정합니다.

전체 이벤트는 대략 101분 안에 완료됩니다( 최악의 접근 방식 ).

2) CONCURRENT - 프로가 자신의 턴을 플레이하고 다음 플레이어로 이동하여 10명의 플레이어가 모두 동시에 플레이하지만 프로 플레이어가 한 번에 두 사람과 함께 플레이하지 않고 자신의 턴을 플레이하고 다음 플레이어로 이동한다고 가정해 보겠습니다. . 이제 프로 선수가 자신의 턴을 플레이하는 데 6초가 걸리고 프로 선수가 2명인 경우 전환 시간이 6초라고 가정하면 첫 번째 플레이어로 돌아가는 총 전환 시간은 1분(10x6초)이 됩니다. 따라서 이벤트가 시작된 첫 번째 사람에게 돌아갈 때는 2분이 경과했습니다(10xtime_per_turn_by_champion + 10xtransition_time=2mins).

모든 플레이어가 자신의 차례를 완료하는 데 45초가 걸린다고 가정하면 SERIAL 이벤트에서 게임당 10분을 기준으로 합니다. 게임이 끝나기 전 라운드 수는 600/(45+6) = 11 라운드(약)

따라서 전체 이벤트는 대략 11xtime_per_turn_by_player_&_champion + 11xtransition_time_across_10_players = 11x51 + 11x60sec= 561 + 660 = 1221sec = 20.35mins(약) 후에 완료됩니다.

개선 사항을 101분에서 20.35분으로 확인하십시오( 더 나은 접근 )

3) 병렬 - 주최측이 추가 자금을 확보하여 두 명의 프로 챔피언 선수 (둘 다 동일한 능력)를 초대하고 동일한 10명의 선수(챌린저) 세트를 각각 5명씩 두 그룹으로 나누어 두 명의 챔피언(예: 한 명)에게 할당했다고 가정해 보겠습니다. 각각 그룹화합니다. 이제 이벤트는 이 두 세트에서 병렬로 진행됩니다. 즉, 최소 두 명의 선수(각 그룹에 한 명)가 해당 그룹의 두 명의 프로 선수와 대결합니다.

그러나 그룹 내에서 프로 선수는 한 번에 한 명의 선수를 선택하므로(즉, 순차적으로) 계산 없이 전체 이벤트가 완료하는 데 대략 101/2=50.5분 안에 완료될 것이라고 쉽게 추론할 수 있습니다.

101분에서 50.5분으로 개선 사항 확인( 좋은 접근 )

4) CONCURRENT + PARALLEL - 위의 시나리오에서 두 명의 챔피언 플레이어가 각각의 그룹에 속한 5명의 플레이어와 동시에 플레이한다고 가정해 보겠습니다. 동시에.

따라서 한 그룹의 게임은 대략 11xtime_per_turn_by_player_&_champion + 11xtransition_time_across_5_players = 11x51 + 11x30 = 600 + 330 = 930sec = 15.5mins(대략)에 완료됩니다.

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

개선 사항을 101분에서 15.5분으로 확인하십시오( 최상의 접근 )

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

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

(참고: 이 순서는 작업의 상호 의존성, 작업 간의 통신 요구 사항 및 작업 간의 전환 오버헤드에 크게 의존하므로 다른 시나리오에서는 이 순서가 변경될 수 있습니다.)


sactiw

간단한 예:

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

병렬은 "두 개의 대기열과 두 개의 ATM 기계"입니다.


Saurabh Pakhare

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

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

단위:

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

nabster

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

병렬 처리는 충분한 작업과 적절한 작업(올바르게 분할될 수 있는 작업)을 찾아 풍부한 CPU 리소스에 배포하는 문제를 해결합니다. 병렬화는 물론 항상 주변에 있었지만 멀티 코어 프로세서가 너무 저렴하기 때문에 전면에 등장하고 있습니다.


JP Alioto

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

예: I/O 포트를 놓고 경쟁하는 두 스레드.

병렬성: 문제를 유사한 여러 청크로 분할합니다.

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


Mihai Toader

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

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

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


Apurva Thorat

동시성 => 여러 작업이 공유 리소스와 겹치는 기간에 수행되는 경우(잠재적으로 리소스 활용도를 최대화).

병렬 => 단일 작업이 동시에 수행될 수 있는 여러 개의 단순 독립 하위 작업으로 분할되는 경우.


MBK

동시성 대 병렬성

'동시성은 병렬이 아니다'의 롭 파이크

동시성은 한 번에 많은 것을 처리하는 것입니다.

병렬화는 한 번에 많은 작업을 수행하는 것입니다.

[동시성 이론]

동시성 - 한 번에 여러 작업을 처리합니다.
병렬 처리 - 한 번에 여러 스레드를 처리합니다.

동시성과 병렬성에 대한 나의 비전

[동기화 vs 비동기화]


yoAlex5

서버가 대기열의 첫 번째 작업만 제공할 수 있는 서비스 대기열로 생각하십시오.

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

1개의 서버, 2개 이상의 다른 대기열(대기열당 5개의 작업 포함) -> 동시성(서버가 대기열의 모든 첫 번째 작업과 시간을 동일하게 또는 가중으로 공유하기 때문에), 어느 순간에 하나의 유일한 작업이 있기 때문에 여전히 병렬 처리가 없습니다. 서비스 중인 작업.

2개 이상의 서버, 하나의 대기열 -> 병렬 처리(동시에 수행되는 2개의 작업) 그러나 동시성 없음(서버가 시간을 공유하지 않고 세 번째 작업은 서버 중 하나가 완료될 때까지 기다려야 함)

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

즉, 동시성은 작업을 완료하는 데 시간을 공유하고 작업을 완료하는 데 같은 시간이 걸릴 수 있지만 적어도 일찍 시작됩니다. 중요한 것은 작업을 더 작은 작업으로 분할할 수 있어 인터리빙이 가능하다는 것입니다.

병렬 처리는 병렬로 실행되는 더 많은 CPU, 서버, 사람 등으로 달성됩니다.

리소스가 공유되는 경우 순수한 병렬 처리를 달성할 수 없지만 이것이 바로 동시성이 가장 실용적으로 사용되는 곳이므로 해당 리소스가 필요하지 않은 다른 작업을 차지합니다.


Rahul

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

병렬성과 상호 작용성은 거의 완전히 독립적인 동시성의 차원입니다. 특정 프로젝트의 경우 개발자는 둘 중 하나 또는 둘 다에 대해 관심을 가질 수 있습니다. 그것들은 융합되는 경향이 있습니다. 특히 스레드인 혐오스러운 것이 둘 모두를 수행할 수 있는 합리적으로 편리한 기본 요소를 제공하기 때문입니다.

병렬 처리에 대한 자세한 정보 :

병렬 처리는 매우 작은 규모(예: 프로세서의 명령 수준 병렬 처리), 중간 규모(예: 멀티코어 프로세서) 및 대규모(예: 고성능 컴퓨팅 클러스터)에 존재합니다. 멀티코어 프로세서의 성장으로 인해 최근 몇 년 동안 더 많은 스레드 수준 병렬 처리를 노출해야 하는 소프트웨어 개발자의 압력이 높아졌습니다. 병렬성은 의존성 개념과 밀접하게 연결되어 있습니다. 종속성은 병렬 처리를 달성할 수 있는 범위를 제한합니다. 하나가 다른 작업에 종속되어 있으면 두 작업을 병렬로 실행할 수 없습니다(추측 무시).

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

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

상호 작용을 수행하는 가장 기본적이고 일반적인 방법은 이벤트(예: 이벤트 루프 및 핸들러/콜백)를 사용하는 것입니다. 간단한 작업의 경우 이벤트가 좋습니다. 이벤트로 더 복잡한 작업을 수행하려고 하면 스택 리핑(일명 콜백 지옥, 일명 제어 반전)이 발생합니다. 이벤트에 싫증이 나면 생성기, 코루틴(Async/Await라고도 함) 또는 협력 스레드와 같은 좀 더 이국적인 것을 시도할 수 있습니다.

신뢰할 수 있는 소프트웨어에 대한 사랑을 위해 대화형 기능을 사용하려는 경우 스레드를 사용하지 마십시오.

검소함

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


Ben Ylvisaker

전자 제품에서 직렬병렬 은 회로의 실제 동작을 결정하는 일종의 정적 토폴로지를 나타냅니다. 동시성이 없을 때 병렬 처리는 결정적 입니다.

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

직렬/병렬 및 순차/동시 특성화는 직교합니다. 디지털 커뮤니케이션이 그 예입니다. 직렬 어댑터 에서 디지털 메시지는 동일한 통신 라인(예: 하나의 와이어)을 따라 시간적으로(즉, 순차적으로) 배포됩니다. 병렬 어댑터 에서 이것은 병렬 통신 라인(예: 많은 전선)에서도 분할된 다음 수신 측에서 재구성됩니다.

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 > ....

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

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

귀하와 동시에 첫 번째 자녀와 대화하는 다른 사람이 있는 경우 동시 처리가 이루어 집니다. 인프라에서 어떤 프로세스를 고려할지 모르기 때문에 최종 결과는 미리 결정되지 않습니다.


s1l3n0

나는 이 질문에대한 Paul Butcher의 대답을 정말 좋아합니다(그는 Seven Weeks의 Seven Concurrency Models 의 작가입니다).

종종 혼동되기는 하지만 병렬 처리와 동시성은 다른 것입니다. 동시성은 문제 영역의 한 측면입니다. 코드는 여러 동시(또는 거의 동시) 이벤트 를 처리해야 합니다. 대조적으로 병렬화는 솔루션 영역의 한 측면입니다. 즉 , 문제의 다른 부분을 병렬로 처리하여 프로그램을 더 빠르게 실행 하려는 것입니다. 일부 접근 방식은 동시성에 적용할 수 있고 일부는 병렬 처리에 적용할 수 있으며 일부는 둘 다에 적용할 수 있습니다. 어떤 문제에 직면했는지 이해하고 작업에 적합한 도구를 선택하십시오.


dangom

동시성은 병렬 처리의 일반화된 형태입니다. 예를 들어 병렬 프로그램은 동시 호출도 가능하지만 반대는 사실이 아닙니다.

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

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

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

자세한 내용은 이 연구 문서를 읽으십시오. Concepts of Concurrent Programming


user4774371

다른 답변의 이 그래픽 표현이 정말 마음에 들었습니다. 위의 많은 답변보다 질문에 훨씬 더 잘 답변한다고 생각합니다.

병렬성 대 동시성 두 스레드가 병렬로 실행될 때 둘 다 동시에 실행됩니다. 예를 들어, A와 B라는 두 개의 스레드가 있는 경우 병렬 실행은 다음과 같습니다.

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

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

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

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

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

출처 : 여기에 또 다른 답변

도움이 되기를 바랍니다.


HopeKing

Robert Love의 Linux System Programming 책에서:

동시성, 병렬성 및 인종

스레드는 두 가지 관련되지만 별개의 현상인 동시성과 병렬성을 생성합니다. 둘 다 씁쓸하고 스레딩 비용과 이점을 만납니다. 동시성 은 두 개 이상의 스레드가 겹치는 기간 에 실행할 수 있는 기능입니다. 병렬 처리 는 두 개 이상의 스레드를 동시에 실행할 수 있는 기능입니다. 동시성은 병렬 처리 없이 발생할 수 있습니다(예: 단일 프로세서 시스템에서 멀티태스킹). 병렬 처리(때때로 진정한 병렬 처리 로 강조됨)는 다중 프로세서(또는 GPU와 같은 다중 실행 엔진이 가능한 단일 프로세서)가 필요한 특정 형태의 동시성입니다. 동시성을 사용하면 여러 스레드가 앞으로 진행되지만 반드시 동시에 진행되는 것은 아닙니다. 병렬 처리를 사용하면 스레드가 말 그대로 병렬로 실행되므로 다중 스레드 프로그램이 여러 프로세서를 사용할 수 있습니다.

동시성은 프로그래밍 패턴이며 문제에 접근하는 방법입니다. 병렬 처리는 동시성을 통해 달성할 수 있는 하드웨어 기능입니다. 둘 다 유용합니다.

이 설명은 허용된 답변과 일치합니다. 사실 개념은 우리가 생각하는 것보다 훨씬 간단합니다. 그것들을 마법이라고 생각하지 마십시오. 병렬 처리가 동시에 약 정확히 동안 동시성 동시에, 일정 기간에 관한 것입니다.


Rick

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

병렬성은 그러한 것들이 실제로 병렬인 경우입니다. 위의 예에서 비디오 처리 코드가 단일 코어에서 실행되고 있고 Word 응용 프로그램이 다른 코어에서 실행되고 있음을 알 수 있습니다. 이것은 동시 프로그램도 병렬일 수 있음을 의미합니다! 스레드와 프로세스로 애플리케이션을 구조화하면 프로그램이 기본 하드웨어를 활용하고 잠재적으로 병렬로 수행할 수 있습니다.

그렇다면 왜 모든 것이 평행하지 않습니까? 한 가지 이유는 동시성이 프로그램을 구조화 하는 방법이고 관심사의 분리를 용이하게 하기 위한 설계 결정인 반면 병렬성은 종종 성능이라는 이름으로 사용되기 때문입니다. 또 다른 하나는 어떤 것들은 근본적으로 완전히 병렬로 수행될 수 없다는 것입니다. 이에 대한 예는 대기열 뒤에 두 가지를 추가하는 것입니다. 두 가지를 동시에 삽입할 수는 없습니다. 무언가가 먼저 가고 다른 것이 뒤에 있어야 합니다. 그렇지 않으면 대기열이 엉망이 됩니다. 이러한 실행을 인터리브할 수 있지만(따라서 동시 대기열을 얻음) 병렬로 가질 수 없습니다.

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


Daniel Soutar

동시성 은 동시에 실행되거나 실행되지 않는 작업을 포함할 수 있습니다(실제로 별도의 프로세서/코어에서 실행할 수 있지만 "틱"으로 실행할 수도 있음). 중요한 것은 동시성은 항상 하나의 더 큰 작업 을 수행하는 것을 의미한다는 것입니다. 따라서 기본적으로 일부 계산의 일부입니다. 동시에 할 수 있는 것과 하지 말아야 할 것, 동기화하는 방법에 대해 현명해야 합니다.

병렬 처리는 몇 가지 작업을 동시에 수행하는 것을 의미합니다. 그들은 하나의 문제를 해결하는 데 일부가 될 필요는 없습니다. 예를 들어 스레드는 각각 하나의 문제를 해결할 수 있습니다. 물론 동기화 항목도 적용되지만 다른 관점에서 볼 수 있습니다.


kboom

"동시성"은 여러 일 이 진행 중인 경우 입니다.

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


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

  • 단일 코어에 여러 스레드.
  • Win32 메시지 대기열의 여러 메시지.
  • MARS 연결의 여러 SqlDataReader
  • 브라우저 탭의 여러 JavaScript 약속.

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

그래서 당신은 간다. 세상은 언제나처럼 어지럽습니다 ;)


Branko Dimitrijevic

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

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

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


J D

(이런 근본적인 질문이 몇 년 동안 정확하고 깔끔하게 해결되지 않아 상당히 놀랐습니다...)

요컨대, 동시성과 병렬성은 모두 컴퓨팅의 속성입니다.

차이점과 관련하여 다음은 Robert Harper의 설명입니다 .

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

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

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

또 하나의 하이라이트: (물리적) "시간"은 여기서 논의된 속성과 거의 관련이 없습니다. 시간은 속성의 중요성을 보여주기 위해 측정을 구현하는 방법일 뿐 본질과는 거리가 멉니다. 시간 복잡도 에서 "시간"의 역할을 두 번 생각하십시오. 이는 다소 유사하며 이 경우 측정이 더 중요한 경우가 많습니다.


FrankHB

"동시"는 모든 일을 동시에 수행하는 것입니다. 그것들은 다른 것일 수도 있고 같은 것일 수도 있습니다. 부족한 답변에도 불구하고 "동시에 있는 것처럼 보이는" 문제가 아닙니다. 정말 동시에입니다. 동시 코드를 실행하려면 한 호스트 내에서 공유 메모리를 사용하거나 다른 호스트에서 분산 메모리를 사용하는 여러 CPU 코어가 필요합니다. 동시에 동시에 실행되는 3개의 개별 작업 파이프라인이 예입니다. 작업 수준-2. 또 다른 예는 1-생산자와 1-소비자의 동시성입니다. 또는 다수의 생산자와 1명의 소비자; 독자와 작가; et al.

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

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

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

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

Gregory Andrews의 작업은 이에 대한 최고의 교과서인 다중 스레드, 병렬 및 분산 프로그래밍입니다.


Geoffrey Anderson

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

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


Sudip Bhandari

이 출처의 설명이 저에게 도움이 되었습니다.

동시성은 응용 프로그램이 작동하는 여러 작업을 처리하는 방법과 관련이 있습니다. 응용 프로그램은 한 번에 하나의 작업(순차적으로)을 처리하거나 동시에(동시에) 여러 작업을 처리할 수 있습니다.

반면에 병렬성은 응용 프로그램이 각 개별 작업을 처리하는 방법과 관련이 있습니다. 응용 프로그램은 작업을 처음부터 끝까지 순차적으로 처리하거나 작업을 병렬로 완료할 수 있는 하위 작업으로 분할할 수 있습니다.

보시다시피, 애플리케이션은 동시적일 수 있지만 병렬일 수는 없습니다. 이는 동시에 둘 이상의 작업을 처리하지만 작업이 하위 작업으로 분류되지 않음을 의미합니다.

응용 프로그램은 병렬일 수도 있지만 동시는 아닙니다. 이것은 응용 프로그램이 한 번에 하나의 작업에서만 작동한다는 것을 의미하며 이 작업은 병렬로 처리될 수 있는 하위 작업으로 나뉩니다.

또한 응용 프로그램은 동시 또는 병렬이 될 수 없습니다. 즉, 한 번에 하나의 작업에서만 작동하며 작업이 병렬 실행을 위해 하위 작업으로 분해되지 않습니다.

마지막으로 애플리케이션은 동시에 여러 작업에서 작동하고 병렬 실행을 위해 각 작업을 하위 작업으로 나눕니다. 그러나 이 시나리오에서는 컴퓨터의 CPU가 동시성 또는 병렬성만으로 충분히 바쁘게 유지되기 때문에 동시성 및 병렬성의 일부 이점이 손실될 수 있습니다. 이를 결합하면 약간의 성능 향상 또는 심지어 성능 손실이 발생할 수 있습니다.


Boolean_Type

출처 : http:www.stackoverflow.com/questions/1050222/what-is-the-difference-between-concurrency-and-parallelism

반응형