동시성은 별도의 스레드에서 두 개의 작업을 동시에 실행합니다. 그러나 비동기 메소드는 병렬로 실행되지만 동일한 1 개의 스레드에서 실행됩니다. 이것이 어떻게 달성됩니까? 또한 병렬 처리는 어떻습니까?
이 3 가지 개념의 차이점은 무엇입니까?
동시성은 별도의 스레드에서 두 개의 작업을 동시에 실행합니다. 그러나 비동기 메소드는 병렬로 실행되지만 동일한 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) 작업의 초기화 정의 (시작시기 및 가져 오는 매개 변수) 코드가 계속해서 수행해야하는 것.
그러나 여전히 구문입니다 (일반적으로 콜백 메소드로 표시됩니다). 배후에서 기본 시스템은 단순히 소위 "작업"이 현재 실행중인 코드를 완료 할 때까지 쌓일 코드 조각이라고 간단히 결정할 수 있습니다. 그런 다음 하나씩 하나씩 압축을 풀고 순차적으로 실행합니다. 아님 또한 작업별로 스레드를 만들어 병렬로 실행할 수도 있습니다. 무슨 상관이야? 그 부분은 개념에 포함되어 있지 않습니다;)
여기에 약간의 의미가 있습니다.
동시성 또는 병렬 처리는 리소스 경합 의 문제이며 , 비동기는 제어 흐름 에 관한 것 입니다.
처리 순서의 결정적 구현이없는 경우 다른 절차 (또는 구성 작업 )를 비동기라고합니다 . 다시 말해, 임의의 주어진 시간에 처리 될 수있는 가능성이있다. T. 정의에 의해, 다수의 프로세서 (예를 들어, CPU 또는 개인)는 그들 중 몇몇이 동시에 처리 될 수있게한다; 단일 프로세서에서 처리는 인터리브됩니다 (예 : 스레드).
비동기 프로 시저 또는 작업은 리소스 를 공유 할 때 동시라고 합니다 . 동시성은 어느 시점에서든 T가 경합 할 수있는 확실한 가능성이다. 어떤 자원도 공유되지 않을 때 (예를 들어, 다른 프로세서와 스토리지) 병렬 처리는 사소하게 보장된다. 그렇지 않으면 동시성 제어를 해결해야합니다.
따라서 비동기 절차 또는 작업은 다른 프로세스와 동시에 또는 동시에 처리 될 수 있습니다.
동시성은 동시에 여러 작업을 동시에 실행하는 것을 의미합니다. 하나 이상의 작업을 수행해야하지만 단일 리소스가있는 경우 동시성을 위해 이동합니다. 단일 코어 환경에서 동시성은 컨텍스트 전환에 의해 달성됩니다.
병렬 처리는 노래와 목욕을 동시에 할 수있는 것처럼 하나 이상의 작업을 동시에 수행하는 것과 같습니다. 이제 병렬 작업을 수행하고 있습니다.
비동기는 하나의 작업이 실행될 때 비동기 모델의 스레드 실행과 관련된 것으로, 이전 작업이 완료되기를 기다리지 않고 다른 작업으로 전환 할 수 있습니다.
비동기 프로그래밍은 동시성을 달성하는 데 도움이됩니다. 다중 스레드 환경에서의 비동기 프로그래밍은 병렬 처리를 달성하는 방법입니다.
"동기화 및 비 동기화는 프로그래밍 모델입니다. 동시 및 병렬은 작업이 실행되는 방식입니다." 출처 : https://medium.com/better-programming/sync-vs-async-vs-concurrent-vs-parallel-5754cdb60f66
즉, sync 및 async는 함수 호출시 프로그램이 실행되는 방법을 설명하고 (대기 또는 계속 실행합니까?) 동시 및 병렬은 함수 (작업)가 실행되는 방법을 설명합니다 (동시 = 동시에, 병렬 = 동시에 효과적으로 실행됩니다).
여기에 몇 가지 예를 들어 설명합니다
GPU가 처리하는 병렬 처리를 사용하여 동일한 코드 블록 (AKA 커널 물리 및 논리 스레드를 수천). 이상적으로는 모든 스레드에 대해 동시에 프로세스가 시작되고 종료됩니다. 하이퍼 스레딩이없는 단일 CPU 코어는 병렬 처리를 수행 할 수 없습니다.
참고 : 6M 스레드가있는 하드웨어에서 7M 호출 크기의 커널을 실행할 때 모든 6M 스레드에서 동시에 동일한 코드를 두 번 실행하면서 매번 6M 스레드를 모두 소비해야하기 때문에 이상적으로 말했습니다.
참고 : 병렬 처리는 GPU로 제한되지 않습니다.
웹 서비스는 수신 많은 작은 요청을 실시간으로 그것은 언제든지 다르게 각 요청을 처리하기 위해 필요하며, 다른 요청이나 내부 작업의 독립. 그러나 데이터 상태 나 시스템 상태를 손상시키지 않으면 서 웹 서비스가 항상 가동되어 실행되기를 원합니다.
사용자가 레코드를 업데이트하고 다른 사용자가 동일한 레코드를 동시에 삭제한다고 상상해보십시오.
참고 : 이러한 요청은 일반적으로 메모리, 데이터베이스 연결 또는 대역폭과 같은 필수 리소스를 소비합니다. 그러나 웹 서비스가 항상 반응하기를 원합니다. Asynchronousy는 그것을 만들 수있는 열쇠 반응 하지 동시성
GUI 스레드에서 실행되는 경우 I / O 작업과 같은 하나의 무거운 프로세스가 GUI를 쉽게 차단할 수 있습니다 . UI 응답 성 을 보장하기 위해 많은 프로세스를 비동기 적으로 실행할 수 있습니다. 한 번에 하나씩 비슷한 비동기 작업을 실행하는 것이 좋습니다 . 예를 들어, 동시에 실행하면 여러 IO 바인딩 작업이 상당히 느려질 수 있으므로 시작을 마치도록 대기열에 추가 하는 것이 좋습니다.
참고 : 동시에 (즉, 한 번에 두 번 이상) 실행되는 비동기 작업은 동시 작업입니다.
참고 : 동시성과 비동기는 종종 서로 혼동됩니다. 동시성은 서로를 방해하지 않고 함께 작동하는 시스템의 다른 부분을 말합니다 (이러한 문제는 종종 잠금, 세마포 또는 뮤텍스로 해결됩니다). 비동기 성은 스레딩과 같은 응답 성을 얻는 방법입니다.
* 참고 : 비동기 및 멀티 스레딩은 종종 서로 혼동됩니다. 비동기 코드는 반드시 새로운 스레드를 포함하지는 않습니다. 그것은 하드웨어 작동 할 수 또는 수 스테판은 그것을 순수 작업을 호출 이 읽기
예를 들어 아래 WPF + C # 코드 await Task.Run(()=> HeavyMethod(txt))
에서 비동기 textBox.Dispatcher.Invoke
성 문제를 해결하고 동시성 문제를 해결합니다.
private async void ButtonClick(object sender, RoutedEventArgs e)
{
// run a method in another thread
await Task.Run(()=> HeavyMethod(txt));
// modify UI object in UI thread
txt.Text = "done";
}
// This is a thread-safe method. You can run it in any thread
internal void HeavyMethod(TextBox textBox)
{
while (stillWorking)
{
// use Dispatcher to safely invoke UI operations
textBox.Dispatcher.Invoke(() =>
{
// UI operations outside of invoke will cause ThreadException
textBox.Text += ".";
});
}
}
나는이 개념들에 대해 당신의 머리를 감싸는 것이 짧고 흥미로울 것입니다.
동시 대 병렬 -작업이 실행되는 방법.
실생활에서 예를 들어 보자. 커다란 케이크를 먹고 노래를 부르는 것은 어려운 일이다. 전체 노래를 부르고 케이크를 완성하는 사람이 가장 빠르면 승리합니다. 따라서 규칙은 노래와 노래를 동시에 먹는 것 입니다. 그렇게하는 방법은 규칙에 속하지 않습니다. 케이크 전체를 먹은 다음 노래 전체를 노래하거나 케이크 반을 먹은 다음 노래 반 노래를 한 다음 다시 할 수 있습니다.
병렬 처리 는 작업이 실제로 동시에 실행되는 특정 종류의 동시성입니다. 컴퓨터 과학에서 병렬 처리는 멀티 코어 환경에서만 달성 할 수 있습니다.
동기식 vs. 비동기식 -프로그래밍 모델.
동 기적으로 코드는 위에서 아래로 순서대로 실행되는 단계로 작성합니다. 비동기 프로그래밍 모델에서는 코드를 작업으로 작성한 다음 동시에 실행됩니다. 동시에 실행한다는 것은 모든 작업이 동시에 실행될 가능성을 의미합니다.