모든 형태의 멀티 컴퓨팅으로 인한 속도 향상을 가정하려면 여러 CPU 기반 작업이 여러 컴퓨팅 리소스 (일반적으로 프로세서 코어)에서 동시에 실행되거나 모든 작업이 다음의 동시 사용에 의존하지 않는다고 가정해야합니다. 즉, 일부 작업은 하나의 시스템 하위 구성 요소 (예 : 디스크 스토리지)에 의존하는 반면 일부 작업은 다른 시스템 (주변 장치에서 통신 수신)에 의존하고 다른 작업은 프로세서 코어를 사용해야 할 수 있습니다.
첫 번째 시나리오는 종종 "병렬"프로그래밍이라고합니다. 두 번째 시나리오는 종종 "동시"또는 "비동기"프로그래밍이라고합니다. "동시"는 때때로 운영 체제가 여러 작업의 실행을 인터리브 할 수 있도록 허용하는 경우를 지칭하는데도 사용됩니다. 직렬로 배치하거나 여러 리소스를 사용하여 병렬 실행을 수행 할 수 있습니다. 후자의 경우 "동시"는 일반적으로 작업 실행의 실제 동시성의 관점이 아니라 프로그램에서 실행이 작성되는 방식을 나타냅니다.
암묵적인 가정으로이 모든 것에 대해 말하기는 매우 쉽습니다. 예를 들어, 일부는 "비동기 I / O가 다중 스레드 I / O보다 빠릅니다."와 같은 주장을 빠르게합니다. 이 주장은 여러 가지 이유로 모호합니다. 첫째, 특정 비동기 I / O 프레임 워크가 멀티 스레딩으로 정확하게 구현 된 경우 일 수 있습니다.이 경우 하나의 개념이 동일하고 다른 개념보다 "빠르다"고 말하는 것은 의미가 없습니다. .
둘째, 비동기 프레임 워크의 단일 스레드 구현 (예 : 단일 스레드 이벤트 루프)이있는 경우에도 해당 루프가 수행하는 작업에 대해 가정을해야합니다. 예를 들어, 단일 스레드 이벤트 루프로 할 수있는 한 가지 어리석은 일은 두 개의 서로 다른 순수 CPU 바인딩 작업을 비동기 적으로 완료하도록 요청하는 것입니다. 이상적인 단일 프로세서 코어 만있는 컴퓨터에서이 작업을 수행 한 경우 (최신 하드웨어 최적화 무시)이 작업을 "비동기 적으로"수행하는 것은 두 개의 독립적으로 관리되는 스레드 또는 단 하나의 단독 프로세스로 수행하는 것과 실제로 다르게 수행되지 않습니다. -차이는 스레드 컨텍스트 전환 또는 운영 체제 일정 최적화로 내려갈 수 있지만 두 작업이 모두 CPU로 이동하는 경우 두 경우 모두 비슷합니다.
당신이 마주 칠 수있는 비정상적이거나 어리석은 코너 케이스를 상상하는 것이 유용합니다.
예를 들어 위와 같이 "비동기"는 동시 일 필요가 없습니다. 정확히 하나의 프로세서 코어가있는 시스템에서 두 개의 CPU 바운드 작업을 "비동기 적으로"실행합니다.
다중 스레드 실행은 동시 일 필요가 없습니다. 단일 프로세서 코어가있는 머신에서 두 개의 스레드를 생성하거나 두 개의 스레드에 다른 종류의 부족한 리소스를 획득하도록 요청합니다 (예를 들어 하나만 설정할 수있는 네트워크 데이터베이스를 상상해보십시오. 한 번에 연결). 스레드의 실행은 인터리브 될 수 있지만 운영 체제 스케줄러는 적합하다고 생각하지만 단일 코어에서 전체 런타임을 줄일 수 없으며 (스레드 컨텍스트 전환으로 인해 증가 할 것입니다) 일반적으로 스레드보다 많은 스레드를 생성하는 경우 코어를 실행하거나 리소스가 유지할 수있는 것보다 리소스를 요청하는 스레드가 더 많습니다.) 이것은 다중 처리에서도 마찬가지입니다.
따라서 비동기 I / O 나 멀티 스레딩 모두 런타임 측면에서 성능 향상을 제공 할 필요가 없습니다. 속도를 늦출 수도 있습니다.
그러나 원격 데이터베이스와 같은 네트워크 연결 리소스에서 데이터를 검색하기 위해 네트워크 호출을 수행하고 일부 로컬 CPU 바운드 계산을 수행하는 특정 프로그램과 같이 특정 사용 사례를 정의하면 다음과 같은 추론을 시작할 수 있습니다. 하드웨어에 대한 특정 가정이 주어진 두 방법 간의 성능 차이.
질문 : 수행해야하는 계산 단계 수와이를 수행하기 위해 얼마나 많은 독립 자원 시스템이 있습니까? 독립적 인 시스템 하위 구성 요소를 사용해야하고 동시에 수행 할 경우 이점을 얻을 수있는 계산 단계의 하위 집합이 있습니까? 몇 개의 프로세서 코어가 있으며 여러 프로세서 또는 스레드를 사용하여 별도의 코어에서 작업을 완료하는 데 드는 오버 헤드는 얼마입니까?
작업이 독립적 인 하위 시스템에 크게 의존하는 경우 비동기 솔루션이 좋을 수 있습니다. 처리하는 데 필요한 스레드 수가 많아서 컨텍스트 전환이 운영 체제에서 사소하지 않은 경우 단일 스레드 비동기 솔루션이 더 나을 수 있습니다.
작업이 동일한 리소스 (예 : 동일한 네트워크 또는 로컬 리소스에 동시에 액세스해야하는 여러 필요)에 의해 바인딩 될 때마다 멀티 스레딩은 아마도 불만족스러운 오버 헤드를 유발할 것이며 단일 스레드 비동기식 은 그러한 리소스에서 더 적은 오버 헤드를 유발할 수 있습니다. 제한된 상황에서도 속도를 높일 수 없습니다. 이러한 경우 유일한 옵션 (속도 향상을 원할 경우)은 해당 리소스의 여러 복사본을 사용 가능하게 만드는 것입니다 (예 : 부족한 리소스가 CPU 인 경우 다중 프로세서 코어, 부족한 리소스 인 경우 더 많은 동시 연결을 지원하는 더 나은 데이터베이스) 연결이 제한된 데이터베이스 등).
또 다른 표현은 운영 체제가 두 작업에 대해 단일 리소스 사용을 인터리브하도록 허용하는 것이 단순히 한 작업이 리소스를 사용하고 다른 작업이 대기 한 다음 두 번째 작업이 연속적으로 완료되도록하는 것보다 빠를 수 없습니다 . 또한 인터리빙의 스케줄러 비용은 실제 상황에서 실제로 속도가 느려지는 것을 의미합니다. CPU, 네트워크 리소스, 메모리 리소스, 주변 장치 또는 기타 시스템 리소스의 인터리브 사용량이 발생하는지 여부는 중요하지 않습니다.