[language-agnostic] 동시성과 병렬 처리의 차이점은 무엇입니까?

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

예가 이해된다.



답변

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

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


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

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

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


답변

혼란이 존재하는 이유

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

  • 동시 : 기존, 발생 또는 동시에 수행 (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을 예약하는 데 탁월한 기본 지원이 있습니다.

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

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


답변

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

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

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

직무

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

고퍼

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


답변

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

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


답변

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

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

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

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

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


답변

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

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

대체 텍스트


답변

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

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

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

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

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

2) 동시 동시-프로가 자신의 차례를 플레이하고 다음 플레이어로 넘어 가서 10 명의 플레이어가 동시에 플레이하고 있지만 프로 플레이어는 한 번에 두 사람과 함께 있지 않은 경우 차례를 플레이하고 다음 사람으로 넘어갑니다. 이제 프로 선수가 자신의 턴을 플레이하는 데 6 초가 걸리고 프로 선수의 전이 시간도 6 초라고 가정하면 첫 선수로 돌아가는 총 전환 시간은 1 분 (10×6 초)이됩니다. 따라서 이벤트가 시작된 첫 사람에게 돌아올 때까지 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 = 11×51 + 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 = 11×51 + 11×30 = 600 + 330 = 930 초 = 15.5 분 (대략)에 완료됩니다

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

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

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

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

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