2010-03-05 7 views
8

델리게이트를 사용하여 모든 함수를 비동기 적으로 호출 할 수 있습니다. 문서에서이 작업은 스레드 풀에 대한 작업 항목을 대기열에 넣음으로써 수행됩니다..net의 비동기 호출과 비동기 호출의 차이점

IO 함수 (예 : 소켓, 파일, 웹 페이지 등)에서 비동기 호출을 수행 할 수도 있습니다. 내 생각 엔 (하지만 잘 모르겠다)이 스레드 풀에서 작업 항목을 생성하지 않습니다. 결과를 얻은 후에 만 ​​(또는 오류) 스레드 풀의 새 스레드에서 콜백이 호출됩니다.

이 가정이 맞습니까? 아니면 비동기 IO 호출, 또한 아래의 덮개를 그냥 스폰되는 일부 스레드입니까? 그렇다면 어떻게 비동기 호출이 스레드 풀을 사용하여 스레드를 생성하고 차단하는 것보다 더 뛰어난 성능을 발휘할 수 있습니까?

도 : 주어진 시간에 얼마나 많은 비동기 호출을 처리 할 수 ​​있습니까? 쓰레드 풀을 사용하는 경우, 당신이 좋아하는만큼 추측합니다. 하지만 IO 비동기 호출의 경우 한계가 있습니까? 그렇다면 한계가 무엇인지 어떻게 알 수 있습니까?

답변

7

비동기 IO는 스레드 풀의 다른 스레드를 사용하는 것보다 훨씬 더 복잡한 작업입니다. 단일 장치에 대해 여러 개의 동시 I/O 요청을 수행하기위한

유용하지 않음 장치 커널 오브젝트를 시그널링

1 :

는 다양한 기법 OS 내부 , 비동기 IO를 지원하는이 있습니다. 하나의 스레드가 I/O 요청을 발행하고 다른 스레드가 처리하도록 허용합니다.

2

가 단일 장치에 대해 다수의 동시 I/O 요청을 허용하는 이벤트 커널 오브젝트 시그널링. 하나의 스레드가 I/O 요청을 발행하고 다른 스레드가 처리하도록 허용합니다.

3

가 단일 장치에 대해 다수의 동시 I/O 요청을 허용 경보 가능 I/O를 사용. I/O 요청을 발행 한 스레드도 처리해야합니다.

4하여 I/O 완료 포트

는 단일 장치에 대해 다수의 동시 I/O 요청을 허용. 하나의 스레드가 I/O 요청을 발행하고 다른 스레드가 처리하도록 허용합니다. 이 기법은 확장 성이 뛰어나고 유연성이 가장 뛰어납니다.

+0

@sergey : 그래서 당신은 실제로 차이가 있다고 말하고 있습니다. 그러면 한 번에 대기중인 입출력 요청 수는 얼마입니까? sweetspot은 무엇입니까? 이 대상 IO 또는 다른 뭔가에 의존합니까? 어떻게 알 수 있습니까? – Toad

+0

Simle 대답은 다릅니다. IO Completion 포트 (가장 복잡하지만 가장 강력한 기술)를 사용하는 경우 OS는 모든 활성 IO 작업을 처리 할 수 ​​있도록 가능한 한 적은 스레드를 생성합니다 (하드웨어 구성에 따라 다름). 경보 가능한 IO를 사용하려면! every!에 대해 하나의 스레드가 필요합니다! 보류중인 IO 작업. 그렇기 때문에 IO 보완 포트가 훨씬 효과적이고 확장 성이 뛰어납니다. 많은 것을 처리 할 수 ​​있습니다! 최소한의 자원으로 동시적인 IO 요청. 제프리 리히터 (Jeffrey Richter)가 "C/C++을 통한 Windows"또는 "프로그래밍 서버 측 응용 프로그램"을 읽어야한다고 생각합니다. 그것은 꽤 어려운 물건이다! –

+0

@reinier 한계는 CPU 수에서 Windows 라이센스 키까지의 모든 것을 기반으로합니다. 하지만 제한은 중요하지 않습니다. BCL에서 제공하는 비동기 메서드를 사용하는 한 예를 들어 볼 때보다 확장 성이 좋습니다. 'QueueUserWorkItem'. – bzlm

관련 문제