[multithreading] 동시성, 병렬 처리 및 비동기 메서드의 차이점은 무엇입니까?

동시성은 별도의 스레드에서 두 개의 작업을 동시에 실행합니다. 그러나 비동기 메소드는 병렬로 실행되지만 동일한 1 개의 스레드에서 실행됩니다. 이것이 어떻게 달성됩니까? 또한 병렬 처리는 어떻습니까?

이 3 가지 개념의 차이점은 무엇입니까?



답변

동시 및 병렬은 실제로 정확하게 추측하는 것과 동일한 원칙입니다. 병렬 작업은 진정한 멀티 태스킹이어야하고 “동시에”실행되어야하지만 동시에 작업은 공유하는 작업을 의미 할 수 있습니다. 여전히 병렬로 실행되는 것처럼 보이는 실행 스레드.

비동기 메서드는 이전 두 개념과 직접 관련이 없으며 비동기식은 동시 또는 병렬 작업의 인상을 나타내는 데 사용되지만 효과적으로 비동기 메서드 호출은 현재 응용 프로그램에서 멀리 떨어져 작업 해야하는 프로세스에 일반적으로 사용됩니다. 응답을 기다리는 애플리케이션을 기다리거나 차단하고 싶지 않습니다.

예를 들어 데이터베이스에서 데이터를 가져 오는 데 시간이 걸릴 수 있지만 데이터를 기다리는 UI를 차단하고 싶지 않습니다. 비동기 호출은 콜백 참조를 가져와 요청이 원격 시스템에 배치되는 즉시 코드로 실행을 반환합니다. 원격 시스템이 필요한 처리를 수행하는 동안 UI는 계속 사용자에게 응답 할 수 있습니다. 데이터가 콜백 메소드에 반환되면 해당 메소드가 UI를 업데이트 (또는 해당 업데이트를 전달) 할 수 있습니다.

사용자 관점에서는 멀티 태스킹처럼 보이지만 그렇지 않을 수 있습니다.


편집하다

많은 구현에서 비동기 메소드 호출로 인해 스레드가 회전 할 수 있지만 필수는 아니지만 실제로 실행중인 조작 및 시스템에 응답을 다시 통지 할 수있는 방법에 따라 달라집니다.


답변

요컨대,

동시성은 특정 순서없이 겹치는 기간에 시작, 실행 및 완료되는 여러 작업을 의미합니다. 병렬 처리는 여러 작업 또는 고유 한 작업의 여러 부분이 문자 그대로 동시에 (예 : 멀티 코어 프로세서) 실행될 때입니다.

동시성과 병렬 처리는 동일하지 않습니다.

동시성 대 병렬 처리의 차이점

이제 동시성과 병렬 처리의 현저한 차이점을 나열 해 보겠습니다.

동시성은 두 작업이 겹치는 기간에 시작, 실행 및 완료 될 수있는 시점입니다. 병렬 처리는 작업이 문자 그대로 동시에 실행될 때입니다. 멀티 코어 프로세서에서.

동시성은 프로세스를 독립적으로 실행하는 구성이며, 병렬 처리는 (아마도 관련이있는) 계산의 동시 실행입니다.

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

응용 프로그램은 동시에 수행 될 수 있지만 병렬이 될 수는 없습니다. 즉, 둘 이상의 작업을 동시에 처리하지만 두 작업이 동시에 실행되는 것은 아닙니다.

응용 프로그램은 병렬 일 수 있지만 동시에 할 수는 없습니다. 즉, 다중 코어 CPU에서 작업의 여러 하위 작업을 동시에 처리합니다.

응용 프로그램은 병렬 또는 동시 작업이 될 수 없으므로 모든 작업을 한 번에 하나씩 순차적으로 처리해야합니다.

응용 프로그램은 병렬 및 동시가 될 수 있습니다. 즉, 다중 코어 CPU에서 동시에 여러 작업을 동시에 처리 할 수 ​​있습니다.

동시성

최소한 두 가지 이상의 작업에 대해 이야기 할 때 동시성은 본질적으로 적용 가능합니다. 애플리케이션이 사실상 두 개의 작업을 동시에 실행할 수있는 경우이를 동시 애플리케이션이라고합니다. 여기서 실행되는 작업은 동시에 보이지만 본질적으로 그렇지 않을 수도 있습니다. 각 작업이 작업의 일부를 실행 한 다음 대기 상태로 전환되는 운영 체제의 CPU 시간 분할 기능을 활용합니다. 첫 번째 작업이 대기 상태 인 경우 CPU는 작업의 일부를 완료하기 위해 두 번째 작업에 할당됩니다.

따라서 작업 우선 순위에 따라 운영 체제는 CPU 및 기타 컴퓨팅 리소스 (예 : 메모리)를 할당합니다. 모든 작업을 차례대로 수행하고 완료 할 기회를 제공하십시오. 최종 사용자에게는 모든 작업이 병렬로 실행중인 것 같습니다. 이것을 동시성이라고합니다.

병행

병렬 처리에는 두 가지 작업이 필요하지 않습니다. 말 그대로 물리적으로 작업의 일부 또는 여러 작업을 동시에 CPU의 멀티 코어 인프라를 사용하여 각 작업 또는 하위 작업에 하나의 코어를 할당하여 실행합니다.

병렬 처리에는 기본적으로 여러 처리 장치가있는 하드웨어가 필요합니다. 단일 코어 CPU에서는 동시성이 있지만 병렬 처리는 얻을 수 없습니다.

비동기 메소드

이것은 동시성 및 병렬 처리와 관련이 없으며 비동기식은 동시 또는 병렬 작업의 인상을 나타내는 데 사용되지만 효과적으로 비동기 응용 프로그램 호출은 일반적으로 현재 응용 프로그램에서 멀리 떨어져 있어야하는 프로세스에 사용되며 우리는 원하지 않습니다. 응답을 기다리는 애플리케이션을 기다립니다.


답변

동시성 은 각 작업이 차례로 순차적으로 실행되는 대신 여러 작업의 실행이 인터리브되는 경우입니다.

병렬 처리 는 이러한 작업이 실제로 병렬로 실행될 때입니다.

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


비동기 성은 별도의 개념입니다 (일부 상황과 관련이 있음에도 불구하고). 하나의 이벤트가 다른 이벤트와 다른 시간에 (동기식이 아닌) 발생할 수 있다는 사실을 나타냅니다. 아래 다이어그램은 액터가 다른 스레드, 프로세스 또는 서버에 대응할 수있는 동기 실행과 비동기 실행의 차이점을 보여줍니다.

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

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


답변

비동기는 병렬 또는 동시의 반점이 아니기 때문에 모든 사람이 병렬 또는 동시성과 비동기를 연결하는 데 문제가 있습니다. 그것은 동기의 반입니다. 어떤 경우에는이 스레드가 다른 스레드와 동기화되는지 여부를 나타냅니다.


답변

동시성이 발생할 수있는 몇 가지 시나리오가 있습니다.

비동기 — 이것은 프로그램이 비 차단 작업을 수행함을 의미합니다. 예를 들어 HTTP를 통해 원격 리소스에 대한 요청을 시작한 다음 응답 수신을 기다리는 동안 다른 작업을 계속할 수 있습니다. 이메일을 보내고 응답을 기다리지 않고 평생을 보낼 때와 비슷합니다.

병렬 처리 — 이는 프로그램이 멀티 코어 머신의 하드웨어를 활용하여 작업을 작업으로 나누어 각 작업을 별도의 코어에서 실행함으로써 동시에 작업을 실행 함을 의미합니다. 그것은 샤워에서 노래하는 것과 조금 같습니다. 실제로 두 가지 일을 정확히 동시에하고 있습니다.

멀티 스레딩 — 여러 스레드를 동시에 실행할 수있는 소프트웨어 구현입니다. 멀티 스레드 프로그램은 단일 코어 컴퓨터에서 실행될 때에도 여러 작업을 동시에 수행하는 것으로 보입니다. 이것은 다양한 IM 창을 통해 다른 사람들과 채팅하는 것과 조금 비슷합니다. 실제로 앞뒤로 전환하더라도 최종 결과는 동시에 여러 대화를 나누는 것입니다.


답변

동시성

동시성은 애플리케이션이 동시에 둘 이상의 작업을 동시에 진행하고 있음을 의미합니다. 컴퓨터에 CPU가 하나만 있으면 응용 프로그램이 동시에 두 개 이상의 작업을 진행하지 못할 수 있지만 응용 프로그램 내에서 한 번에 두 개 이상의 작업이 처리되고 있습니다. 한 작업이 다음 작업을 시작하기 전에 완전히 완료하지는 않습니다.

병행

병렬 처리는 응용 프로그램이 작업을 작은 하위 작업으로 분할하여 동시에 여러 CPU에서 동시에 처리 할 수 ​​있음을 의미합니다.

동시성 대 병렬 처리

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

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

보시다시피, 응용 프로그램은 동시에 가능하지만 병렬은 아닙니다. 즉, 동시에 여러 작업을 처리하지만 하위 작업으로 분류되지는 않습니다.

응용 프로그램은 병렬 일 수 있지만 동시에 할 수는 없습니다. 즉, 응용 프로그램은 한 번에 하나의 작업에서만 작동하며이 작업은 하위 작업으로 나뉘어 병렬로 처리 될 수 있습니다.

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

마지막으로 응용 프로그램은 동시에 여러 작업에서 동시에 작동하며 병렬 작업을 위해 각 작업을 하위 작업으로 나눕니다. 그러나 컴퓨터의 CPU가 이미 동시성 또는 병렬 처리만으로 합리적으로 바쁘기 때문에이 시나리오에서는 동시성 및 병렬 처리의 이점 중 일부가 손실 될 수 있습니다. 이를 결합하면 성능이 약간 저하되거나 성능이 저하 될 수 있습니다. 동시 병렬 모델을 맹목적으로 채택하기 전에 분석하고 측정해야합니다.

에서 http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html


답변

병렬 :이 용어는 두 개의 코드가 “동시에”실행된다는 의미입니다. “실제”병렬 처리인지 또는 어떤 영리한 디자인 패턴을 통해 가짜인지는 중요하지 않습니다. 요점은 “태스크”를 동시에 시작한 다음 뮤텍스와 모든 적절한 트릭을 사용하여 개별적으로 제어 할 수 있다는 것입니다. 그러나 일반적으로 다음과 같이 “병렬”이라는 단어를 “진정한”병렬 처리에만 사용하는 것이 좋습니다. 비협조적인 멀티 태스킹 (CPU / GPU 코어를 포함하거나 소프트웨어 수준에서만 OS를 관리하도록 허용) 매우 낮은 수준에서). 사람들은 예를 들어 브라우저 창의 자바 스크립트에서 볼 수 있듯이 병렬 처리를 위조하는 복잡한 순차적 코드에 대해서만 “병렬”이라고 말하기를 꺼려합니다. 따라서이 스레드의 사람들이 “비 동기화는 병렬 처리와 아무 관련이 없습니다”라고 말하는 이유입니다. 글쎄,하지만 혼동하지 마십시오.

동시성 : 병렬 처리가 없으면 동시성 이있을 수는 없지만 (위에서 설명한 것처럼 시뮬레이션 또는 실제 여부에 관계없이)이 용어는 두 시스템이 특정 시점에서 동시에 동일한 리소스 에 액세스하려고한다는 사실에 중점을 둡니다 . 그것은 당신이 그것을 처리해야한다는 사실에 중점을 둡니다.

비동기 : 비동기는 병렬 처리와 관련이 없다고 말하면 옳습니다. 그러나 그것은 병렬 처리 방식을 제공합니다 (사물을 병렬로 만들지 말아야하는 부담은 당신에게 있습니다-계속 읽으십시오).

“비동기”는 일반적으로 병렬 처리에 관련된 세 가지 기본 사항을 공식화하는 병렬 처리를 나타냅니다 . 1) 작업의 초기화 정의 (시작시기 및 가져 오는 매개 변수) 코드가 계속해서 수행해야하는 것.

그러나 여전히 구문입니다 (일반적으로 콜백 메소드로 표시됩니다). 배후에서 기본 시스템은 단순히 소위 “작업”이 현재 실행중인 코드를 완료 할 때까지 쌓일 코드 조각이라고 간단히 결정할 수 있습니다. 그런 다음 하나씩 하나씩 압축을 풀고 순차적으로 실행합니다. 아님 또한 작업별로 스레드를 만들어 병렬로 실행할 수도 있습니다. 무슨 상관이야? 그 부분은 개념에 포함되어 있지 않습니다;)