[multithreading] 비동기 프로그래밍과 병렬 프로그래밍의 차이점을 분명히 표현하는 방법은 무엇입니까?

많은 플랫폼이 응답 성을 향상시키기위한 수단으로 비동기 및 병렬 처리를 촉진합니다. 나는 그 차이를 일반적으로 이해하지만, 종종 내 자신의 마음과 다른 사람들에게 분명히 표현하기가 어렵다는 것을 알게됩니다.

나는 임시 프로그래머이며 비동기 및 콜백을 상당히 자주 사용합니다. 병렬성은 이국적이다.

그러나 나는 특히 언어 디자인 수준에서 쉽게 혼란스러워하는 것처럼 느낍니다. 그들이 어떻게 관련이 있는지 (또는 관련이 없는지), 그리고 각각이 가장 잘 적용되는 프로그램 클래스에 대한 명확한 설명을 좋아할 것입니다.



답변

비동기식으로 무언가를 실행할 때 그것은 비 차단임을 의미하며, 그것이 완료 될 때까지 기다리지 않고 다른 것들을 계속 수행합니다. 병렬 처리는 동시에 여러 가지를 동시에 실행하는 것을 의미합니다. 병렬 처리는 작업을 독립적 인 작업으로 분리 할 때 효과적입니다.

3D 애니메이션의 프레임 렌더링을 예로 들어 보겠습니다. 애니메이션을 렌더링하는 데 시간이 오래 걸리므로 애니메이션 편집 소프트웨어에서 해당 렌더링을 시작하는 경우 UI가 잠기지 않고 다른 작업을 계속할 수 있도록 비동기식 으로 실행되고 있는지 확인해야합니다 . 이제 해당 애니메이션의 각 프레임을 개별 작업으로 간주 할 수도 있습니다. 여러 개의 CPU / 코어 또는 여러 머신을 사용할 수있는 경우 여러 프레임을 병렬 로 렌더링 하여 전체 워크로드 속도를 높일 수 있습니다.


답변

나는 주요한 차이점은 동시성병렬성 사이에 있다고 믿는다 .

비동기콜백 은 일반적으로 동시성을 표현하는 방법 (도구 또는 메커니즘)입니다. 즉, 서로 대화하고 리소스를 공유 할 수있는 일련의 엔티티입니다. 비동기 또는 콜백 통신의 경우에는 리소스 공유가 선택 사항 인 반면 (원격 시스템에서 결과가 계산되는 RMI 고려) 암시 적 통신입니다. 올바르게 언급했듯이 이것은 일반적으로 반응을 염두에두고 수행됩니다. 대기 시간 이 긴 이벤트를 기다리지 않습니다 .

병렬 프로그래밍은 일반적으로 처리량을 주요 목표로 삼는 반면 대기 시간, 즉 단일 요소의 완료 시간은 동등한 순차 프로그램보다 나쁠 수 있습니다.

동시성과 병렬성의 차이점을 더 잘 이해하기 위해 Daniele Varacca의 동시성대한 확률 모델 에서 인용 할 것입니다. 이는 동시성 이론에 대한 훌륭한 참고 사항입니다.

계산 모델은 시스템이 독립적 인 자율 구성 요소로 구성되어 서로 통신 할 수있는 동시성을위한 모델입니다. 동시성의 개념을 병렬 처리의 개념과 혼동해서는 안됩니다. 병렬 계산에는 일반적으로 여러 프로세서간에 작업을 분산시키는 중앙 제어가 포함됩니다. 동시성에서 구성 요소의 독립성과 서로 통신한다는 사실을 강조합니다. 병렬화는 바로가 결정하고 노예들이 일하는 고대 이집트와 같습니다. 동시성은 모든 사람이 원하는대로하고 휴대 전화를 사용하는 현대 이탈리아와 같습니다.

결론적 으로 병렬 프로그래밍은 별도의 엔터티가 협업하여 고성능 및 처리량 (일반적으로)을 얻는 특별한 동시성 사례입니다.

비동기 및 콜백은 프로그래머가 동시성을 표현할 수있는 메커니즘 일뿐입니다. 마스터 / 작업자 또는지도 / 축소와 같은 잘 알려진 병렬 프로그래밍 디자인 패턴은보다 복잡한 중앙 집중식 상호 작용 을 구현하기 위해 이러한 낮은 수준의 메커니즘 (비동기식)을 사용하는 프레임 워크에 의해 구현됩니다 .


답변

이 기사는 그것을 잘 설명합니다 : http://urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming

비동기 프로그래밍에 대한 내용은 다음과 같습니다.

비동기 호출은 응용 프로그램 내에서 “차단”을 방지하는 데 사용됩니다. [이러한] 호출은 기존 스레드 (예 : I / O 스레드)에서 분리되고 가능한 경우 작업을 수행합니다.

병렬 프로그래밍에 대한 이것 :

병렬 프로그래밍에서는 여전히 작업이나 작업을 분리하지만 주요 차이점은 각 작업 덩어리에 대해 새 스레드를 가동한다는 것입니다

그리고 이것을 요약하면 :

비동기 호출시스템에서 이미 사용중인 스레드를 사용 하며 병렬 프로그래밍을 위해서는 개발자가 필요한 작업, 스핀 업 및 분리 스레드를 분리해야합니다 .


답변

내 기본 이해는 :

비동기 프로그래밍은 다른 작업을 수행하기 전에 값 비싼 작업이 완료되기를 기다리는 문제를 해결합니다. 작업이 완료되기를 기다리는 동안 다른 작업을 수행 할 수 있다면 좋은 것입니다. 예 : 웹 서비스에서 더 많은 데이터를 검색하고 검색하는 동안 UI를 계속 실행합니다.

병렬 프로그래밍은 관련이 있지만 큰 작업을 동시에 계산할 수있는 더 작은 청크로 나누는 데 더 관심이 있습니다. 작은 청크의 결과를 결합하여 전체 결과를 생성 할 수 있습니다. 예 : 개별 픽셀의 색상이 본질적으로 독립적 인 광선 추적.

아마도 그보다 더 복잡 할 수도 있지만 이것이 기본적인 차이점이라고 생각합니다.


답변

나는이 용어의 차이점을 생각하는 경향이 있습니다.

비동기 : 돌아가서이 작업을 수행하십시오. 완료되면 다시 나와 결과를 가져 오십시오. 나는 그동안 다른 것들에 착수 할 것입니다.

병렬 :이 작업을 수행하고 싶습니다. 그것이 더 쉬워지면 도움을 청하십시오. 이것은 긴급한 일이므로 결과가 나올 때까지 기다립니다. 당신이 돌아 오기 전까지는 아무것도 할 수 없습니다.

물론 비동기 작업은 병렬 처리를 사용할 수 있지만 최소한 차별화는 작업이 수행되는 동안 다른 작업을 수행하거나 결과가 나올 때까지 모든 것을 완전히 중단하는지 여부입니다.


답변

async : 다른 곳 에서 직접 수행 하고 완료되면 콜백하십시오. 그때까지 나는 내 일을 계속할 수 있습니다.

여기에 이미지 설명을 입력하십시오

병렬 : 원하는 수의 녀석 (스레드)을 고용하고 작업을 분할하여 더 빨리 완료하고 완료되면 알려주십시오 (콜백). 그때까지 나는 다른 일을 계속할 수도 있습니다 .

여기에 이미지 설명을 입력하십시오

가장 큰 차이점은 병렬 처리는 대부분 하드웨어에 달려 있습니다.


답변

실행 순서의 문제입니다.

A가 B와 비동기이면 B의 하위 부분과 관련하여 A의 하위 부분이 언제 발생하는지 미리 예측할 수 없습니다.

A가 B와 병렬 인 경우 A의 작업은 B의 작업과 동시에 발생하지만 실행 순서는 여전히 정의 될 수 있습니다.

아마도 어려움은 비동기라는 단어가 모호하다는 것입니다.

버틀러에게 더 많은 와인과 치즈를 얻기 위해 가게에 달려가라고 말하고 비동기식 작업을 실행 한 다음 그를 잊고 연구실에서 다시 문을 두 드릴 때까지 소설에서 작업합니다. 병렬화가 여기서 일어나고 있지만 집사와 저는 근본적으로 다른 과제와 다른 사회 계급에 종사하고 있으므로 여기서는 그 레이블을 적용하지 않습니다.

각 하녀 팀이 서로 다른 창을 씻을 때 병행하여 일하고 있습니다.

내 경주 용 자동차 지원 팀은 각 팀이 서로 다른 타이어에서 작동하므로 업무를 수행하는 동안 서로 통신하거나 공유 리소스를 관리 할 필요가 없다는 점에서 비동기식으로 병렬 처리됩니다.

내 축구 (일명 축구) 팀은 각 플레이어가 필드에 대한 정보를 독립적으로 처리하고 그에 대한 정보를 이동함에 따라 병렬 작업을 수행하지만 다른 사람들의 의사 소통에 의사 소통하고 이에 대응해야하기 때문에 완전히 비동기 적이지는 않습니다.

각 플레이어가 음악을 읽고 악기를 제어함에 따라 내 행진 밴드도 평행하지만 동기화가 매우 빠릅니다. 서로 연주하고 행진합니다.

캐밍 된 개틀링 건은 병렬로 간주 될 수 있지만 모든 것이 100 % 동기 적이므로 하나의 프로세스가 진행되는 것처럼 보입니다.