비동기식 vs 멀티 스레딩-차이점이 있습니까?


133

비동기식 호출은 항상 새로운 스레드를 생성합니까? 둘의 차이점은 무엇입니까?

비동기 호출은 항상 새 스레드를 작성하거나 사용합니까?

위키 백과는 말합니다 :

컴퓨터 프로그래밍에서 비동기 이벤트는 기본 프로그램 흐름과 독립적으로 발생하는 이벤트입니다. 비동기 작업은 비 차단 구성표에서 실행되는 작업으로 기본 프로그램 흐름에서 처리를 계속할 수 있습니다.

단일 스레드에서 비동기 호출을 수행 할 수 있다는 것을 알고 있습니까? 이것이 어떻게 가능한지?



1
JavaScript에는 스레드가 없지만 비동기 메서드 호출이 있습니다.
Ajedi32

1
하나의 프로세스가 여러 하위 프로세스를 관리하는 모든 시스템에서 제어 프로세스는 하위 프로세스의 비동기 작업을 제공 할 수 있습니다. JavaScript의 경우 브라우저는 계산 스트림을 제공합니다. 일부 함수가 비동기 호출을 수행하면 브라우저는 해당 함수의 컨텍스트를 저장할 수 있습니다. 이제 동일한 단일 브라우저 스레드가 컨텍스트를 변경하여 다른 기능의 실행을 재개 할 수 있습니다. 기존의 다중 스레드 프로그램에서 한 스레드는 한 기능 블록을 수행하여 다른 스레드가 다른 기능을 실행할 수 있도록합니다. 각 스레드는 자체 기능을 동 기적으로 수행합니다.
Mike

답변:


82

이 질문은 대답하기에는 너무 일반적입니다.

일반적인 경우 비동기 호출이 반드시 새 스레드를 생성하지는 않습니다. 기존 스레드 풀 또는 외부 프로세스가 다른 방법으로 구현하는 한 가지 방법입니다. 언어, 객체 모델 (있는 경우) 및 런타임 환경에 따라 크게 달라집니다.

비동기는 호출 스레드가 응답을 기다리지 않고 호출 스레드에서 비동기 활동이 발생하지 않음을 의미합니다.

그 외에도 더 구체적이어야합니다.


7
멀티 스레딩 == 다중 프로세서의 이점을 얻을 수 있고 비동기식 상황에서도 이점을 얻을 수있는 프로세서 집약적 작업에 대한 처리 이점을 제공하기 위해 여러 스레드 사용. Asynchrony == 프로세스를 수행하는 프로세스 인 반면 프로세스를 호출 한 상태는 프로세스가 완료 될 때까지 기다릴 필요가 없습니다. (이 작업을 수행하기 위해 반드시 여러 스레드를 사용할 필요는 없습니다. 즉, 다른 하드웨어 구성 요소가 책임을 져야합니다).
Evan Sevy

6
@Michael-예제와 함께 단일 스레드에서 비동기 프로그래밍이 어떻게 발생할 수 있는지 설명해 주시겠습니까?
Kumar Vaibhav

7
@KumarVaibhav-가장 일반적인 예는 단일 스레드가 큐 (예 : Windows 메시지 큐)의 항목에서 작동하는 경우입니다. 프로그램이 자신의 큐 (공통 패턴)로 항목을 보내는 습관이있는 경우, 항목을 보내는 코드 비트는 작업이 완료되기를 기다리지 않고 오히려 반환합니다. 메인 루프에 의해 적시에 작업이 처리됩니다.
Michael Kohne

3
코드 작성 방법과 실행 방법간에 차이가있을 수 있습니다. 예를 들어, C #에서 비동기 작업을 시작하는 메서드를 가질 수 있고 내 메서드는 완전히 비동기를 인식하며 작업이 완료되기를 기다리지 않고 다른 작업을 수행 할 수 있습니다. 그러나 CLR은 내 작업을 인라인하고 동 기적으로 실행하기로 결정할 수도 있습니다.
Mike

어떤 스레드가 대기중인 작업을 실행합니까? a-sync로 표시된 메소드는 await 키워드에 도달 할 때까지 동 기적으로 실행됩니다.이 시점에서 어떤 스레드가이 대기 가능 태스크를 실행합니까?

102

비동기식으로 발생해야하는 작업이 CPU 작동을 요구하지 않을 때마다 다른 스레드를 생성하지 않고도 해당 작업을 수행 할 수 있습니다. 예를 들어, 비동기 작업이 I / O 인 경우 CPU는 I / O가 완료 될 때까지 기다릴 필요가 없습니다. 작업을 시작하기 만하면 I / O 하드웨어 (디스크 컨트롤러, 네트워크 인터페이스 등)가 I / O 작업을 수행하는 동안 다른 작업으로 넘어갈 수 있습니다. 하드웨어는 CPU를 중단하여 CPU가 완료되면 CPU에 알리고 OS는 응용 프로그램에 이벤트를 전달합니다.

종종 상위 레벨 추상화 및 API는 OS 및 기본 하드웨어에서 사용 가능한 기본 비동기 API를 공개하지 않습니다. 이 경우 스폰 된 스레드가 I / O 작업을 대기하는 경우에도 일반적으로 비동기 작업을 수행하기 위해 스레드를 만드는 것이 더 쉽습니다.

비동기 작업에서 CPU가 작동해야하는 경우 일반적으로 해당 작업이 다른 스레드에서 발생하여 실제로 비동기가되어야합니다. 그럼에도 불구하고 하나 이상의 실행 단위가있는 경우 실제로 비동기식입니다.


1
잘 설명했습니다. 감사합니다. 하지만 여기에 질문이 있습니다. 예를 들어, 비동기 작업이 I / O 인 경우 CPU는 I / O가 완료 될 때까지 기다릴 필요가 없습니다. 작업을 시작하면됩니다. 내 질문은 프로그램이 단일 스레드 인 경우 코드 줄 3에서 I / O 작업을 호출 한 다음 I / O 작업이 완료되기를 기다리지 않고 3 줄에서 작업을 시작하고 4 줄을 실행하는 방법입니다. ? 나를 위해, 나는 I / O 작업의 완료를 기다리지 않고 실행 라인 (4)를 달성하기 위해 새로운 스레드에서 3 행의 코드를 삽입해야 [자바 PGM 관점].
스파이더 맨

1
그 이유는 CPU가 기다릴 필요는 없지만 CPU는 I / O 작업이 완료되기를 기다리는 것입니다 ... 두 번째 단락은 내 질문에 대한 답변이라고 생각합니다. 이 경우 Java에서는 비동기 호출을 다른 스레드에서 실행해야한다고 결론을 내릴 필요가 있습니다. 내가 틀렸다면 바로 고치거나 새 SO qn을 게시해야하는지 알려주세요
spiderman

@spiderman Node.js와 같은 일부 언어에는 비동기 프로그래밍 모델이 있습니다. 언어 및 런타임은 IO 작업이 완료되기 전에도 동일한 스레드에서 라인 4를 실행할 수있는 내장 기능을 제공합니다. 이는 라인 3으로 달성되며 IO가 완료되면 런타임이 호출 할 콜백을 제공합니다.
jrahhali

@spiderman 아마도 ... OS의 Async 함수는 false 또는 무언가를 직접 반환합니다.
Byeongin Yoon

18

아니요, 비동기 호출에 항상 스레드가 포함되는 것은 아닙니다.

그들은 일반적으로 호출자와 병행하여 일종의 작업을 시작합니다. 그러나이 작업은 다른 프로세스, OS, 다른 하드웨어 (디스크 컨트롤러와 같은), 네트워크의 다른 컴퓨터 또는 사람에 의해 처리 될 수 있습니다. 스레드가 병렬로 작업을 수행하는 유일한 방법은 아닙니다.


12

JavaScript는 단일 스레드 및 비동기입니다. 예를 들어 XmlHttpRequest를 사용하면 응답이 반환 될 때 비동기 적으로 실행될 콜백 함수를 제공합니다.

John Resig는 타이머가 JavaScript에서 작동 하는 방식에 대한 관련 문제에 대해 잘 설명하고 있습니다 .


12

멀티 스레딩은 동일한 프로세스에서 발생하는 둘 이상의 작업을 말합니다. 비동기 프로그래밍은 여러 프로세스에 퍼져 있습니다. 예를 들어 내 작업이 웹 서비스를 호출하는 경우 스레드는 웹 서비스가 반환 될 때까지 기다릴 필요가 없습니다. 여기에서는 스레드가 다른 시스템의 프로세스가 완료 될 때까지 기다리지 않도록하는 비동기 프로그래밍을 사용합니다. 그리고 웹 서비스로부터 응답을 받기 시작할 때 웹 서비스가 요청 처리를 완료했다고 말하는 메인 스레드를 중단시킬 수 있습니다. 이제 메인 스레드가 결과를 처리 할 수 ​​있습니다.


나는 약간 동의하지 않을 것입니다. 비동기 IO 완료를 사용하여 여러 동시 요청을 처리하는 단일 스레드 HTTP 서버를 작성했습니다. 비동기는 여러 실행 경로에서 발생하는 일이 필요하지 않으며 여러 컴퓨팅 스트림이 겹칠 수 있음을 의미합니다. 그것을 보는 또 다른 방법은 단일 스레드 OS에서 "동시"실행되는 2 개의 프로세스를 가질 수 있다는 것입니다. 각 프로세스의 관점에서 동기식으로 실행됩니다. 그러나 OS 관점에서 비동기로 작동합니다.
Mike

11

실제 스레드를 지원하기 전에 메시지 루프를 사용하여 비 선점 시간 (버전 2.13, 3.0, 3.1 등) 이후 Windows는 항상 비동기 처리를 수행했습니다. 따라서 귀하의 질문에 대답하기 위해 비동기 처리를 수행하기 위해 스레드를 만들 필요는 없습니다.


@ dmckee-다른 시스템이 비슷한 방식으로 어떻게 진화하는지 흥미 롭습니다.
Otávio Décio 2016 년

8

비동기 호출은 호출을 호출하는 것과 동일한 시스템 / 장치에서 발생할 필요조차 없습니다. 따라서 질문이 있다면, 비동기 호출이 현재 프로세스에서 스레드를 요구합니까? 답은 아니오입니다. 그러나 비동기 요청을 처리하는 어딘가에 실행 스레드가 있어야합니다.

실행 스레드는 모호한 용어입니다. 초기 Macintosh 및 Windows OS와 같은 협업 작업 시스템에서 실행 스레드는 요청이 다른 스택, 명령 포인터 등을 실행하게 한 것과 동일한 프로세스 일 수 있습니다. 그러나 사람들이 일반적으로 비동기 호출에 대해 이야기 할 때 이는 일반적으로 다른 스레드가 프로세스 내 (예 : 동일한 프로세스 내) 인 경우 또는 다른 프로세스가 프로세스 간인 경우 다른 스레드에 의해 처리되는 호출을 의미합니다.

프로세스 간 (또는 프로세스 간) 통신 (IPC)은 일반적으로 프로세스 간 통신을 포함하도록 일반화됩니다. 데이터 잠금 및 동기화 기술은 별도의 실행 스레드가 실행되는 프로세스에 관계없이 일반적으로 동일하기 때문입니다.


7

일부 시스템에서는 콜백을 사용하는 일부 기능에 대해 커널의 동시성을 활용할 수 있습니다. 다소 모호한 인스턴스의 경우 비동기 IO 콜백을 사용하여 Mac 시스템 6-8의 선점없는 멀티 태스킹 시대에 비 차단 인터넷 서버를 다시 구현했습니다.

당신이 스레드없이 프로그램 "의"동시 실행을이 방법은 스트림 과 같은 .


5

비동기는 단지 무언가 (함수 호출, 장치 등)가 끝나기를 기다리는 프로그램을 차단하지 않음을 의미합니다. 별도의 스레드로 구현할 수 있지만 동기 작업에 전용 스레드를 사용하고 일종의 이벤트 시스템을 통해 통신하여 비동기식 동작을 수행하는 것도 일반적입니다.

단일 스레드 비동기 프로그램의 예가 있습니다. 다음과 같은 것 :

...do something
...send some async request
while (not done)
    ...do something else
    ...do async check for results

2

비동기 호출의 특성은 호출이 진행되는 동안 응용 프로그램을 계속 실행하려면 새 스레드 를 생성 하거나 최소한 활용해야합니다. 이의 목적으로 만 만든 또 다른 스레드에게 당신을 비동기 콜백 처리

경우에 따라 상황에 따라 비동기 메소드를 호출하려고하지만 사용자에게 동기식으로 보이도록 할 수 있습니다 (예 : 비동기 메소드가 완료되었다는 신호가 표시 될 때까지 차단). 이것은 WaitForSingleObject 와 같은 Win32 API를 통해 달성 할 수 있습니다 .


일부 시스템에서는 마찬가지이지만 전부는 아닙니다. 유닉스는 커널을 다른 스레드로 호출하지 않는 한 다른 스레드를 생성하거나 사용할 필요가 없습니다.
Craig S

이것은 Windows에서도 마찬가지입니다. 예를 들어 겹친 I / O는 비동기 적입니다.
Jason Orendorff
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.