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


346

동시 프로그래밍과 병렬 프로그래밍의 차이점은 무엇입니까? 나는 Google에 물었지만 그 차이를 이해하는 데 도움이되는 것을 찾지 못했습니다. 둘 다에 대한 예를 들어 주시겠습니까?

지금은이 설명을 찾았습니다 : http://www.linux-mag.com/id/7411- 그러나 "동시성은 프로그램의 속성입니다"대 "병렬 실행은 기계의 속성입니다"라고 충분하지 않습니다. 그래도 나는 무엇을 말할 수 없습니다.


답변:


310

프로그램이 스레드를 사용하는 경우 (동시 프로그래밍), 머신이 여러 스레드를 처리 할 수 ​​있는지 여부에 따라 다르므로 반드시 병렬 실행으로 실행되는 것은 아닙니다.

다음은 시각적 예입니다. 스레드 되지 않은 머신의 스레드 :

        --  --  --
     /              \
>---- --  --  --  -- ---->>

스레드 머신 의 스레드 :

     ------
    /      \
>-------------->>

대시는 실행 된 코드를 나타냅니다. 보시다시피, 그것들은 분리되어 별도로 실행되지만 스레드 기계는 한 번에 여러 개의 개별 조각을 실행할 수 있습니다.


34
병렬 실행과 병렬 프로그래밍은 동일하지 않습니다. Jon Harrop의 답변이 정확합니다. 그러나 질문 자체가 병렬 실행과 병렬 프로그래밍을 혼동하는 것 같습니다.
Blaisorblade

3
스레드를 병렬로 실행할 수있는 능력은 기계 이상의 기능에 달려 있습니다. 예를 들어 OCaml (및 Python?)은 가비지 수집기의 전역 잠금으로 인해 스레드를 동시에 실행하지만 병렬로 실행하지는 않습니다.
Jon Harrop

1
이 블로그 에 따르면 병렬 프로그래밍은 동시 프로그래밍의 일부 가 아닙니다 . 당신은 대답을 고려하지 않습니다, 당신은이 진술에 대해 어떻게 생각하십니까?
케빈

1
@Kevin : "보다 일반적인"것은 수퍼 셋을 의미한다고 생각합니다. 나는 그것이 틀렸다는 것에 동의한다.
Jon Harrop

1
이 답변은 동시 실행과 병렬 실행의 차이점을 시각화하는 데 좋지만 프로그래밍에 대한 포스터의 원래 질문에는 해당되지 않습니다 .
Reorx

396

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

멀티 코어 프로그래밍병렬 프로그래밍의 특별한 경우입니다. 병렬 프로그래밍은 처리량 향상이라는 특정 목표를 위해 겹치는 작업과 관련이 있습니다. 제어 흐름을 결정 론적으로 만들어 동시 프로그래밍의 어려움을 피할 수 있습니다. 일반적으로 프로그램은 병렬로 실행되는 하위 작업 세트를 생성하고 상위 작업은 모든 하위 작업이 완료된 후에 만 ​​계속됩니다. 따라서 병렬 프로그램을 동시 프로그램보다 디버그하기가 훨씬 쉽습니다. 병렬 프로그래밍의 어려운 부분은 세분성 및 통신과 같은 문제와 관련된 성능 최적화입니다. 후자는 여전히 하나의 캐시에서 다른 캐시로 데이터를 전송하는 것과 관련된 상당한 비용이 있기 때문에 멀티 코어와 관련하여 여전히 문제가된다.Cilk 는 아마도 멀티 코어에서 고성능 병렬 프로그래밍을위한 가장 유망한 접근법 일 것입니다. Intel의 Threaded Building Blocks 와 Microsoft의 Task Parallel Library (.NET 4) 에 모두 채택되었습니다 .


18
"세분화 및 통신과 같은 병렬 프로그래밍의 어려운 부분입니다." 병렬 작업이 통신해야하는 경우 동시 작업이 아닙니까?
Justin M. Keyes

13
"병렬 작업이 의사 소통을해야한다면, 동시 작업이 아닌가?" 와, 좋은 질문입니다! 반드시 그런 것은 아닙니다. 수퍼 컴퓨터는 종종 대량 병렬 작업과 그에 따른 데이터의 글로벌 재배포 및보다 많은 대량 병렬 처리로 프로그래밍됩니다. 따라서 병행 성과 의사 소통이 있지만 말할 실제적인 동시성은 없습니다. 이러한 맥락에서 통신이 캐시 복잡성을 의미하는 멀티 코어 병렬 처리에 대해 더 많이 생각하고있었습니다 (예 : 캐시 일관성에 필요한 통신). 동시 적이지만 직접 표시되지는 않습니다.
Jon Harrop 2013

43
@BoppityBop 소설에서 그가 말한 것을 그림에서 말할 수 있다고해서 내 대답이 덜 정확하지는 않습니다. 실제로 답을 모르는 사람들은 쉽게 읽을 수 있습니다. 내가 여기에 오는 지점이라고 생각합니다. 이 게시물에서 사용하는 언어로 책을 쓸 수는 있지만, Jon이 쓴 것의 절반을 이미 알고 있다면 아마도이 질문을 Google에서 읽지 않았기 때문에 대부분의 독자에게 절대적으로 혼란 스러울 것입니다.
Tor Valamo

18
사진은 저에게 매우 도움이되었습니다. 누군가 주제에 대해 아주 새로운 사람이었고 @JonHarrop의 설명은 나에게도 유용했습니다. 기술적 인 언어라도 올바른 것이라도 감사합니다. 두 대답 모두 내가 좀 더 완벽하게 이해하는 데 기여했습니다. 우리 모두 이겼다! (병렬 실행과 병렬 프로그래밍의 차이점을 이해하기는하지만)
Sammaron

3
"얼랑은 아마도 가장 유망 ... 언어". Erlang은 ~ 30 세이고 1998 년에 오픈 소스
되었으므로

151

https://joearms.github.io/published/2013-04-05-concurrent-and-parallel-programming.html

동시 = 대기열 2 개 및 커피 머신 1 대.

병렬 = 2 개의 대기열 및 2 개의 커피 머신.


9
부정확하고 오도합니다. 동시 = 하나 이상의 대기열 허용 (비 결정적 구성). 병렬 = 비어 있지 않은 경우 원래 대기열보다 짧은 대기열을 만들기 위해 대기열이 두 개 이상 있습니다 (점근 효율).
FrankHB

동시 코드에는 둘 이상의 프로세서 (또는 "커피 머신")가 필요합니다. 따라서이 답변은 본질적으로 잘못되었습니다.
Geoffrey Anderson

6
@GeoffreyAnderson 아닙니다. 예를 들어 스레드와 프로세스는 단일 코어 시스템에서 동시에 실행됩니다.
Jon Harrop

@FrankHB는 - 봐 제발 stackoverflow.com/a/57223044/1406510를 소스 링크에 모습을 - 오라클 사이트에서 - 그것은 잘못 두지 만 우리의 이해가 될 수 있도록. 다시 생각할 시간입니다. 나는 그것을 읽은 후에 나의 견해를 바꾸었다.
nanosoft

@GeoffreyAnderson-stackoverflow.com/a/57223044/1406510을 참조하십시오. 오라클의 링크가 포함되어 있으며 무엇이 무엇인지 명확하게 설명합니다. 그러므로 우리 자신과 일치해야합니다.
nanosoft

40

원래 질문 을 프로그래밍 대신 병렬 / 동시 계산 으로 해석합니다 .

에서 두 연산 모두 동시 미리 계산 서로 독립적. 두 번째 계산은 첫 번째 계산이 완료 될 때까지 기다릴 필요가 없습니다. 그러나 이것이 어떻게 달성되는지 메커니즘은 밝히지 않았습니다. 단일 코어 설정에서는 스레드 간 일시 중단 및 교체가 필요합니다 ( 선점 형 멀티 스레딩 이라고도 함 ).

에서 병렬 계산을 동시에 2 미리 계산 모두 동시에 그대로이다 -. 단일 CPU에서는 불가능하며 대신 멀티 코어 설정이 필요합니다.

기사의 이미지 : "Parallel vs Concurrent in Node.js"

서스펜션 및 교대병렬 컴퓨팅



21

동시 프로그래밍은 프로그램이 하드웨어 세부 사항에서 추상화 된 여러 스레드를 실행하게하는 다중 스레드 프로그래밍을 의미한다고 생각합니다.

병렬 프로그래밍은 사용 가능한 병렬 실행을 활용하기 위해 프로그램 알고리즘을 구체적으로 설계하는 것을 말합니다. 예를 들어, 일부 알고리즘의 두 가지 분기를 병렬로 실행하여 첫 번째 분기를 처음 확인한 다음 두 번째 분기보다 결과가 더 빨리 (평균) 더 빨리 도달 할 것으로 예상 할 수 있습니다.


2
달리 말하면, 두 가지를 병렬로 실행하면 두 배 더 빠르게 완료 할 수 있습니다. 여전히 첫 번째를하고 같은 시간에 같은 양을 한 후 다른 규정 등, 두 번째의 비트 다음 제의 비트를 실행 사이에 하나의 CPU 시분할 뒤로하고있을 경우 수도 동시에 두 가지를 실행
사용자 189169

14

일부 블로그에서이 콘텐츠를 찾았습니다. 유용하고 관련성이 있다고 생각했습니다.

동시성과 병렬성은 같은 것이 아닙니다. 두 작업이 제 시간에 실행되는 순서가 미리 결정되지 않은 경우 두 작업 T1과 T2는 동시에 수행됩니다.

T1이 T2 이전에 실행 및 종료 될 수 있음, T2가 T1 이전에 실행 및 완료 될 수 있음, T1 및 T2가 동일한 시간 인스턴스 (병렬)에서 동시에 실행될 수 있음, T1 및 T2가 대안 적으로 실행될 수 있음 ... 두 개의 동시 스레드 OS가 단일 코어 비 SMT 비 CMP 프로세서에서 실행되도록 예약 된 경우 동시성은 얻을 수 있지만 병렬 처리는 할 수 없습니다. 멀티 코어, 멀티 프로세서 또는 분산 시스템에서 병렬 처리가 가능합니다.

동시성은 종종 프로그램의 속성이라고하며 병렬 처리보다 더 일반적인 개념입니다.

출처 : https://blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming


9

그것들은 (매우) 다른 관점에서 같은 것을 묘사하는 두 구입니다. 병렬 프로그래밍은 하드웨어의 관점에서 상황을 설명합니다. 병렬로 문제를 처리하는 프로세서가 두 개 이상일 수 있습니다 (단일 물리적 패키지 내에있을 수 있음). 동시 프로그래밍은 소프트웨어의 관점에서 더 많은 것을 설명합니다. 두 개 이상의 동작이 정확히 동시에 (동시에) 발생할 수 있습니다.

여기서 문제는 사람들이 실제로 존재하지 않을 때 명확하게 구별하기 위해 두 구를 사용하려고한다는 것입니다. 현실은 그들이 그리는 분할 선이 수십 년 동안 흐릿하고 불분명했으며 시간이 지남에 따라 점점 더 불분명 해졌다는 것입니다.

그들이 논의하려는 것은 옛날 옛적에 대부분의 컴퓨터에는 단일 CPU 만 있다는 사실입니다. 단일 CPU에서 여러 프로세스 (또는 스레드)를 실행할 때 CPU는 실제로 한 번에 해당 스레드 중 하나에서 하나의 명령 만 실행했습니다. 동시성의 모양은 환상이었습니다. 즉, 다른 스레드에서 명령을 빠르게 실행하는 것 사이에서 CPU가 사람의 인식 (100ms 이하의 순간에 즉시 보이는 것처럼)으로 전환하면 한 번에 많은 일을하는 것처럼 보였습니다.

이에 대한 명백한 대조는 여러 개의 CPU가있는 컴퓨터 또는 여러 개의 코어가있는 CPU이므로 시스템은 여러 스레드 및 / 또는 프로세스에서 정확히 동시에 명령을 실행합니다. 하나를 실행하는 코드는 다른 코드를 실행하는 코드에 영향을 줄 수 없습니다.

이제 문제 : 그러한 깨끗한 구별은 거의 존재하지 않았습니다. 컴퓨터 디자이너는 실제로 상당히 지능적이므로 오랫동안 예를 들어 디스크와 같은 I / O 장치에서 일부 데이터를 읽어야 할 때 CPU주기와 관련하여 시간 이 오래 걸렸습니다. 끝. CPU는 유휴 상태를 유지하는 대신 하나의 프로세스 / 스레드가 I / O 요청을 수행하고 I / O 요청이 완료되는 동안 다른 프로세스 / 스레드의 코드가 CPU에서 실행되도록하는 다양한 방법을 알아 냈습니다.

따라서 멀티 코어 CPU가 표준이되기 오래 전에 여러 스레드에서 병렬로 작업을 수행했습니다.

빙산의 일각에 불과합니다. 수십 년 전, 컴퓨터는 또 다른 수준의 병렬 처리를 제공하기 시작했습니다. 다시 말하지만, 상당히 지능적인 사람들이기 때문에 컴퓨터 디자이너들은 많은 경우에 서로 영향을 미치지 않는 명령을 가지고 있다는 것을 알았으므로 같은 스트림에서 동시에 두 개 이상의 명령을 실행할 수있었습니다. 꽤 잘 알려진 초기 예 중 하나는 Control Data 6600입니다. 이것은 1964 년에 출시되었을 때 지구상에서 가장 빠른 컴퓨터였으며 오늘날에도 여전히 동일한 기본 아키텍처가 많이 사용되고 있습니다. 각 명령에서 사용하는 리소스를 추적했으며, 최신 Intel / AMD 프로세서의 설계와 매우 유사하게, 종속 된 리소스를 사용할 수있게 되 자마자 명령을 실행하는 일련의 실행 단위를 가졌습니다.

그러나 (광고가 말했듯이) 기다림은 아닙니다. 여전히 혼란을 더할 또 다른 디자인 요소가 있습니다. "Hyperthreading", "SMT", "CMP"와 같이 상당히 다른 이름이 주어졌지만 모두 동일한 기본 아이디어, 즉 여러 리소스를 조합하여 여러 스레드를 동시에 실행할 수있는 CPU를 나타냅니다 각 스레드와 스레드간에 공유되는 일부 리소스에 대해 독립적입니다. 일반적인 경우에는 위에서 설명한 명령어 수준 병렬 처리와 결합됩니다. 이를 위해 두 개 이상의 아키텍처 레지스터 세트가 있습니다. 그런 다음 필요한 리소스를 사용할 수있게되면 명령을 실행할 수있는 일련의 실행 단위가 있습니다.

그런 다음 여러 코어가있는 최신 시스템을 사용할 수 있습니다. 여기에 분명한 것이 있습니까? 우리는 동시에 명령을 실행할 수있는 N (현재 2에서 256 정도 정도)의 개별 코어를 가지고 있으므로 실제 병렬 처리의 명확한 사례를 가지고 있습니다. 한 프로세스 / 스레드에서 명령을 실행하면 ' 다른 명령 실행에 영향을 미치지 않습니다.

글쎄요. 여기에도 독립적 인 리소스 (레지스터, 실행 단위, 하나 이상의 캐시 수준) 및 일부 공유 리소스 (일반적으로 최소한 가장 낮은 캐시 수준, 메모리 컨트롤러 및 메모리 대역폭)가 있습니다.

요약 : 사람들이 공유 자원과 독립 자원 사이의 대조를 원하는 단순한 시나리오는 실제 생활에서는 거의 발생하지 않습니다. 모든 리소스가 공유되면 MS-DOS와 같은 것으로 끝납니다. 여기서는 한 번에 하나의 프로그램 만 실행할 수 있으며 다른 프로그램을 전혀 실행하기 전에 하나의 프로그램을 중지해야합니다. 완전히 독립적 인 리소스를 사용하면 MS-DOS를 실행하는 N 개의 컴퓨터 (네트워크를 연결하지 않아도)가 서로간에 아무 것도 공유 할 수 없으며 파일을 공유 할 수있는 경우 공유 리소스이므로 공유되지 않는 기본 전제에 대한 위반).

흥미로운 모든 사례에는 독립적 인 리소스와 공유 리소스의 조합이 포함됩니다. 합리적으로 현대의 모든 컴퓨터 (그리고 현대가 아닌 많은 컴퓨터)는 최소한 몇 개의 독립적 인 작업을 동시에 수행 할 수있는 능력이 적어도 있으며, MS-DOS보다 더 정교한 것은 적어도 그것을 이용했습니다. 어느 정도.

사람들이 그리는 것을 좋아하는 "동시"와 "병렬"사이의 훌륭하고 깔끔한 구분은 존재하지 않으며 거의 ​​존재하지 않습니다. 사람들이 "동시"로 분류하는 것은 여전히 ​​적어도 하나 이상의 종종 다른 유형의 병렬 실행을 포함합니다. 그들이 "병렬"로 분류하고 싶은 것은 종종 자원을 공유하는 것, 예를 들어 두 프로세스간에 공유되는 자원을 사용하는 동안 한 프로세스가 다른 프로세스의 실행을 차단하는 것입니다.

"병렬"과 "동시"를 명확하게 구분하려는 사람들은 실제로 존재하지 않는 컴퓨터의 환상 속에 살고 있습니다.


6
  • Concurrent programming일반적으로 정의한 작업이 어떤 순서로든 발생할 수있는 환경을 의미합니다. 하나의 작업이 다른 작업 전후에 발생할 수 있으며 일부 또는 모든 작업을 동시에 수행 할 수 있습니다.

  • Parallel programming다른 프로세서에서 동시 작업을 동시에 실행하는 것을 구체적으로 말합니다. 따라서 모든 병렬 프로그래밍은 동시이지만 모든 동시 프로그래밍이 병렬 인 것은 아닙니다.

출처 : PThreads 프로그래밍-더 나은 멀티 프로세싱을위한 POSIX 표준, Buttlar, Farrell, Nichols


5

프로그래밍에서 동시성은 프로세스를 독립적으로 실행하는 구성이며, 병렬 처리는 (가능하게 관련된) 계산의 동시 실행입니다.
-앤드류 거 란드-

동시성은 계산을 독립적으로 실행하는 구성입니다. 동시성은 특히 실제 세계와 잘 상호 작용하는 깨끗한 코드를 작성하는 방법으로 소프트웨어를 구성하는 방법입니다. 병렬 처리가 아닙니다.

동시성은 병렬 처리가 가능하지만 병렬 처리는 아닙니다. 프로세서가 하나 뿐인 경우 프로그램은 여전히 ​​동시 적이지만 병렬적일 수는 없습니다. 반면, 잘 작성된 동시 프로그램은 멀티 프로세서에서 효율적으로 병렬로 실행될 수 있습니다. 그 속성은 중요 할 수 있습니다 ...-
Rob Pike-

차이점을 이해하려면이 Rob Pike (Golang 제작자 중 하나)의 비디오를 보는 것이 좋습니다. 동시성은 병렬 처리가 아닙니다


메오 링크가 여기에 작동하지 않는 것은 유튜브 링크입니다 youtube.com/watch?v=cN_DpYBzKso
Shivprasad 코이 랄라

5

병렬 프로그래밍은 코드가 동시에 실행되고 각 실행이 서로 독립적 일 때 발생합니다. 따라서 일반적으로 공유 변수에 대한 선입견이 없으며 그럴 가능성이 없기 때문입니다.

그러나 동시 프로그래밍은 변수를 공유하는 다른 프로세스 / 스레드에서 실행되는 코드로 구성되므로 동시 프로그래밍에서는 먼저 어떤 프로세스 / 스레드를 실행할지 결정하는 규칙을 설정해야합니다. 일관성이 될 것이며 앞으로 일어날 일을 확실하게 알 수 있습니다. 제어가없고 모든 스레드가 동시에 계산하고 동일한 변수에 물건을 저장하면 결국 어떻게해야하는지 알 수 있습니까? 어쩌면 스레드가 다른 스레드보다 빠를 수도 있고, 스레드 중 하나가 실행 중에 중지되고 다른 스레드가 손상 (아직 계산되지 않은) 변수로 다른 계산을 계속했을 가능성은 무한합니다. 이러한 상황에서 우리는 일반적으로 병렬 대신 동시 프로그래밍을 사용합니다.


5

작업의 클래식 예약은 직렬 , 병렬 또는 동시 일 수 있습니다 .

  • Serial : 작업을 알려진 속임수 순서대로 실행해야합니다. 그렇지 않으면 작동하지 않습니다. 충분히 쉽다.

  • 병렬 : 작업을 동시에 실행해야합니다. 그렇지 않으면 작동하지 않습니다.

    • 기능상 또는 시간에 모든 작업이 실패하면 전체 시스템 오류가 발생합니다.
    • 모든 작업에는 공통의 안정적인 시간 감각이 있어야합니다.

    이것을 피하려고 노력하면 티타임으로 눈물이 날 것입니다.

  • 동시 : 우리는 상관하지 않습니다. 그러나 우리는 부주의하지 않습니다. 우리는 그것을 분석했으며 중요하지 않습니다. 따라서 언제든지 사용 가능한 시설을 사용하여 모든 작업을 실행할 수 있습니다. 행복한 날들.

알려진 일정에서 사용 가능한 일정이 변경되는 경우가 종종 있는데,이를 상태 변경이라고합니다.

사람들은 종종 이것이 소프트웨어에 관한 것이라고 생각하지만 실제로는 컴퓨터 이전의 시스템 설계 개념입니다. 소프트웨어 시스템의 도입 속도가 약간 느 렸으며 심지어 소프트웨어 언어로도 문제를 해결하려고 시도한 사람은 거의 없었습니다. 트랜스 포터 언어 occam을 찾아 볼 수도 있습니다.관심이 있으시면 .

간결하게 시스템 설계는 다음을 해결합니다.

  • 동사-당신이하고있는 일 (작업 또는 알고리즘)
  • 명사-무엇을하고 있는가 (데이터 또는 인터페이스)
  • 언제-시작, 일정, 상태 변경
  • 방법-직렬, 병렬, 동시
  • 어디서-일이 언제 발생하는지 알면 이전이 아니라 어디서 일어날 수 있는지 말할 수 있습니다.
  • 왜-이것이 방법입니까? 더 중요한 것은 다른 방법이 있고, 더 나은 방법은? 당신이하지 않으면 어떻게됩니까?

행운을 빕니다.


8
나는 사방 모자를 참조
브루노 Penteado에게

10
이 답변은 동시성과 병렬 처리의 주제보다 더 복잡합니다.
Kai Sellgren

3

차이점을 이해했습니다.

1) 동시-공유 리소스를 사용하여 동시에 실행 2) 병렬-다른 리소스를 사용하여 병렬로 실행

따라서 두 지점이 지점 (2)에 모이더라도 두 개의 작업이 서로 독립적으로 동시에 발생할 수 있습니다 (2).


3

병렬 용어 와 동시 용어의 차이점에 대한 완전한 합의는 없지만 많은 저자는 다음과 같이 구별합니다.

  • 동시 컴퓨팅에서 프로그램은 여러 작업을 한 순간에 진행할 수있는 프로그램입니다.
  • 병렬 컴퓨팅에서 프로그램은 여러 작업이 밀접하게 협력하여 문제를 해결하는 프로그램입니다.

따라서 병렬 프로그램은 동시에 수행되지만 멀티 태스킹 운영 체제와 같은 프로그램은 하나의 코어 만있는 머신에서 실행되는 경우에도 동시에 수행됩니다. 여러 작업을 동시에 진행할 수 있기 때문입니다.

출처 : 병렬 프로그래밍 소개, Peter Pacheco


1

동시성 및 병렬 처리 소스

단일 프로세서의 다중 스레드 프로세스에서 프로세서는 스레드간에 실행 리소스를 전환하여 동시 실행을 수행 할 수 있습니다. 있습니다.

공유 메모리 멀티 프로세서 환경의 동일한 멀티 스레드 프로세스에서 프로세스의 각 스레드는 동시에 별도의 프로세서에서 실행될 수 있으므로 병렬 실행 합니다.

프로세스에 프로세서가있는 스레드 수가 적거나 많으면 스레드는 운영 환경과 함께 시스템을 지원하여 각 스레드가 다른 프로세서에서 실행되도록합니다.

예를 들어, 동일한 수의 스레드와 프로세서를 갖는 행렬 곱셈에서 각 스레드 (및 각 프로세서)는 결과 행을 계산합니다.


이 소스 만의 특별한 경우이다 구현 멀티 스레딩의 전문 양식을 -. 예, M : N 사용자 공간 스레딩 모델 및 스레드 스케줄링의 역할과 같은 멀티 스레딩에 대한 전체 스토리는 다루지 않습니다. 스레딩은 시스템 아키텍처 (OS, VM, HT가 활성화 된 CPU 등) 및 / 또는 프로그래밍 인터페이스의 관점에서 구현 된 특수한 방법입니다. 프로그래밍 인터페이스를 제공하지 않고 스레드와 관련이없는 최신 CPU 구현의 명령어 수준 병렬 처리와 같은 것이 더 있습니다.
FrankHB

@FrankHB : 콘텐츠에 대한 정통 링크를 공유 할 수 있으면 감사하겠습니다. 더 많은 것이 있는지 탐구하고 싶습니다. 내 현재 이해는 매우 간단합니다-주어진 스레드 스케줄링 메커니즘을 사용하여 주어진 OS 아키텍처에서 멀티 스레드 응용 프로그램을 실행하는 것이 병렬입니까, 아니면 동시입니까? M : N 사용자 공간을 주었어도-RUN은 병렬 또는 동시입니까?
nanosoft

다른 추상화의 문제를 논의하기 위한 답변 을 작성 했습니다 .
FrankHB

"실행"은 많은 추상화에 적합한 일반적인 동작이므로 멀티 스레드 응용 프로그램을 실행하는 것은 기본 추상화와 비교하여 실제로 매우 복잡합니다. 구현시 스레딩 모델 (일반적으로 앱을 프로그래밍하는 데 사용되는 언어 사양 및 언어 런타임 구현)이 기본 추상화에 보완 된 많은 세부 정보가 있어야합니다.
FrankHB

0

많은 사람들이 서로 다른 특정 사례에서 서로 다른 종류의 동시성 및 병렬 처리에 대해 이야기하므로 공통된 특성을 다루는 추상화가 필요합니다.

기본 추상화는 동시성과 병렬 처리가 모두 프로그램 의 속성에 기인하는 컴퓨터 과학에서 수행됩니다. . 여기에서 프로그램은 공식적인 컴퓨팅 설명입니다. 이러한 프로그램은 특정 언어 또는 인코딩 일 필요는 없으며 구현에 따라 다릅니다. API / ABI / ISA / OS의 존재는 이러한 추상화 수준과 관련이 없습니다. 구체적인 프로그래밍 작업을 수행하려면보다 구체적인 구현 관련 지식 (스레딩 모델 등)이 필요하지만 기본 추상화의 기본 개념은 바뀌지 않습니다.

두 번째로 중요한 사실은 일반적인 속성으로서 동시성과 병렬 처리는 많은 다른 추상화에서 공존 할 수 있다는 것입니다 .

일반적인 차이점 은 동시성 대 병렬 처리의 기본 관점에 대한 관련 답변참조하십시오 .(추가 소스가 포함 된 링크도 있습니다.)

동시 프로그래밍 및 병렬 프로그래밍은 프로그래밍 기능을 제공하는 일부 시스템으로 이러한 일반적인 속성을 구현하는 기술입니다. 시스템은 일반적으로 프로그래밍 언어 및 구현입니다.

프로그래밍 언어는 내장 된 의미 규칙에 의해 의도 된 속성을 노출 할 수 있습니다. 대부분의 경우 이러한 규칙은 특정 언어 구조 (예 : 표현식)의 평가를 지정하여 계산을 효과적으로 동시에 또는 병렬로 수행합니다. (더 구체적으로, 평가에 의해 암시 된 계산 효과는 이러한 특성을 완벽하게 반영 할 수 있습니다.) 동시 / 병렬 언어 시맨틱은 본질적으로 복잡하며 실제 작업에 필요하지 않습니다 (현실적인 문제의 해결책으로 효율적인 동시 / 병렬 알고리즘을 구현하기 위해) ). 따라서 대부분의 전통적인 언어는보다 보수적이고 간단한 접근 방식을 취합니다. 평가의 의미론이 완전히 순차적이고 연속적이라고 가정 한 다음 선택적 기본 요소를 제공하여 일부 를 허용 합니다.동시 계산과 병렬 계산 중 이 기본 요소는 언어가 지원하는 키워드 또는 절차 적 구성 ( "함수") 일 수 있습니다. 이들은 호스트 환경 (OS 또는 "베어 메탈 (bare metal)"하드웨어 인터페이스)과의 상호 작용을 기반으로 구현되며 일반적으로 언어에 대해 불투명 (언어를 사용하여 파생 될 수 없음)입니다. 따라서, 프로그래머가 본 이러한 종류의 고급 추상화에서, 이러한 "매직"프리미티브 및 이러한 프리미티브에 의존하는 프로그램 외에는 동시 / 병렬이 없다. 그러면 동시성 / 병렬 특성에 관심이없는 경우 프로그래머는 오류가 발생하기 쉬운 프로그래밍 경험을 즐길 수 있습니다.

프리미티브는 가장 높은 수준의 추상화에서 복잡한 것을 추상화하지만 구현에는 여전히 언어 기능에 의해 노출되지 않는 추가 복잡성이 있습니다. 따라서 일부 중간 수준 추상화가 필요합니다. 하나의 전형적인 예는 스레딩 입니다. 스레딩은 언어 구현 (런타임)에 의해 지원되는 하나 이상의 실행 스레드 (또는 단순히 스레드 ; 때때로 프로세스 라고도 함 )를 허용합니다 (OS에서 예약 된 작업의 개념은 아닙니다). 스레드는 일반적으로 런타임에 의해 미리 예약되므로 스레드는 다른 스레드에 대해 알 필요가 없습니다. 따라서 스레드는 아무것도 공유하지 않는 한 병렬 처리를 구현하는 것이 당연합니다. 중요한 자원) : 다른 스레드에서 계산을 분해하면 기본 구현이 실행 중에 계산 리소스가 겹치도록 허용하면 작동합니다. 스레드는 또한 공유 리소스의 동시 액세스에 종속됩니다. 어떤 순서로든 리소스에 액세스하기 만하면 알고리즘에 필요한 최소 제약 조건이 충족되므로 구현시 액세스시기가 결정됩니다. 이러한 경우 일부 동기화 작업이 필요할 수 있습니다. 일부 언어는 스레딩 및 동기화 작업을 고급 추상화의 일부로 처리하고이를 기본 형식으로 표시하는 반면, 다른 언어는 상대적으로 더 높은 수준의 기본 형식 (예 : 미래 / 약속 ) 만 권장합니다 .

언어 별 스레드 수준에서 기본 호스팅 환경 (일반적으로 OS)의 멀티 태스킹이 제공됩니다. OS 수준의 선점 형 멀티 태스킹은 (선점 형) 멀티 스레딩을 구현하는 데 사용됩니다. Windows NT와 같은 일부 환경에서는 기본 예약 단위 (작업)도 "스레드"입니다. 위에서 언급 한 스레드의 사용자 공간 구현과 구별하기 위해이를 커널 스레드라고합니다. 여기서 "커널"은 OS의 커널을 의미합니다 (그러나 엄밀히 말하면 Windows NT의 경우에는 사실이 아닙니다. "실제"커널은 NT입니다. 임원) . 커널 스레드는 항상 사용자 공간 스레드에 1 : 1로 매핑되는 것은 아니지만 1 : 1 매핑은 매핑의 오버 헤드를 대부분 줄입니다. 커널 스레드는 시스템 호출을 생성하고 파괴 / 통신하기에 무겁기 때문에녹색 실매핑 오버 헤드 비용으로 오버 헤드 문제를 극복하기 위해 사용자 공간에서 높은 수준의 추상화에서 예상되는 프로그래밍 패러다임에 따라 매핑 선택. 예를 들어, Erlang 과 같이 많은 수의 사용자 공간 스레드가 동시에 실행될 것으로 예상되는 경우 , 1 : 1 매핑은 불가능합니다.

OS 멀티 태스킹의 기본은 프로세서의 논리 코어에서 제공하는 ISA 레벨 멀티 태스킹입니다. 이것은 일반적으로 프로그래머를위한 가장 낮은 수준의 공용 인터페이스입니다. 이 레벨 아래에 SMT 가있을 수 있습니다 . 이것은 하드웨어에 의해 구현 된보다 낮은 수준의 멀티 스레딩의 한 형태이지만, 여전히 다소 프로그래밍이 가능하지만 일반적으로 프로세서 제조업체에서만 액세스 할 수 있습니다. 하드웨어 설계는 분명히 병렬 처리를 반영하지만 내부 하드웨어 리소스를 효율적으로 사용하기위한 동시 예약 메커니즘도 있습니다.

위에서 언급 한 "스레딩"의 각 수준에는 동시성과 병렬 처리가 모두 관련됩니다. 프로그래밍 인터페이스는 크게 다르지만 모든 인터페이스는 처음에 기본 추상화에 의해 드러난 속성에 종속됩니다.


0

차이점을 강조하는 데 도움이되는 예를 공유하십시오.

병렬 프로그래밍 : 병합 정렬 알고리즘 을 구현한다고 가정합니다 . . 문제를 두 개의 하위 문제로 나눌 때마다이를 해결하는 두 개의 스레드가있을 수 있습니다. 그러나 병합 단계를 수행하려면 병합에 두 하위 솔루션이 필요하므로이 두 스레드가 완료 될 때까지 기다려야합니다. 이 "필수 대기"는 이것을 병렬 프로그램으로 만듭니다.

동시 프로그램 : n 개의 텍스트 파일압축 하고 각각에 대해 압축 파일을 생성 한다고 가정하십시오 . 파일의 서브 세트를 압축하는 각각을 처리하는 2 개에서 최대 n 개의 스레드를 가질 수 있습니다. 각 스레드가 완료되면 방금 완료된 것이므로 기다릴 필요가 없습니다. 따라서 "임의의 임의의 순서"로 서로 다른 작업이 인터리브 방식으로 수행되므로 프로그램은 동시에 진행되지만 병렬은 아닙니다.

다른 사람이 언급했듯이 모든 병렬 프로그램은 동시에 수행되지만 실제로는 그렇지 않습니다.


0

나는 그것을 내 자신의 스타일로 설명하려고 노력할 것이다. 그것은 컴퓨터 용어가 아닐 수도 있지만 일반적인 아이디어를 제공한다.

예를 들어, 가사일 : 요리 청소, 쓰레기 제거, 잔디 깎기 등 3 명 (스레드) A, B, C가 있습니다.

동시 : 세 개인은 서로 다른 작업을 독립적으로 시작합니다.

A --> cleaning dishes
B --> taking out trash 
C --> mowing the lawn 

여기서 작업 순서는 결정적이지 않으며 응답은 작업량에 따라 다릅니다.

병렬 처리 : 여기에서 처리량을 향상 시키려면 여러 사람을 단일 작업에 할당 할 수 있습니다 (예 : 두 사람에게 할당 된 식기 세척, A는 식기를 비누 칠하고 B는 식기를 세척 하여 처리량을 향상시킬 수 있음) .

설거지하기 :

A --> soaping the dishes
B --> washing the dishes

이것이 아이디어를 제공하기를 바랍니다! 이제 다른 답변에 설명 된 기술 용어로 이동하십시오.)

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