2012-12-19 3 views

답변

7

속도가 아니므로. writeread 작업은 메모리 복사 위장입니다. 커널에서 데이터를 복사하는 것뿐입니다. 나는. 그들은 실제로 아무 것도 보내거나받지 않습니다.

블로킹 블로킹 기능과 비 블로킹 기능이 묻습니다 : 완료 될 때까지 차단하거나 -1을 반환하고 즉시 수행 할 수없는 경우 EAGAIN을 반환 하시겠습니까? 예를 들어 소켓에서 읽었지만 수신 버퍼에는 아무것도 없다. 뭔가가 올 때까지 recv을 걸고 싶거나 -을 돌려 주시겠습니까?

+0

깨달음에 감사드립니다. –

+0

IOCP에서는 사용자 버퍼 포인터 배열이 WSASend/WSARecv 호출로 커널에 전달되는 방식으로 상당히 위장되어 있습니다. 여전히 데이터 이동이 있지만, NIC 하드웨어 버퍼가 사용자 공간 버퍼에 직접 DMA 될 수 있다고 생각합니다. 한 수준의 비참한 복사를 차단합니다. –

6

내 경험에 비 블로킹 winsock 작업은 약간 느리지 만 훨씬 더 확장 가능합니다. 실제로 블로킹 I/O (IOCP 사용)를 수행 할 때 응용 프로그램 수준에서 2 회의 시스템 호출과 함께 플 래시 호출을 수행하고 블로킹 I/O를 사용하는 경우 하나의 시스템 호출을 수행해야합니다. 동시 연결이 많은 경우 논 블로킹 I/O가 잘 구현되면 확장 성이 뛰어난 아키텍처로 인해 훨씬 ​​빠릅니다.

데이터를 최대 대역폭으로 지점 간 전송해야하는 경우 블로킹 I/O를 사용하십시오. 많은 동시 클라이언트 연결을 처리해야하는 경우 - 비 차단 I/O를 사용하십시오. 그들 중 누구에게도 너무 기대하지 마십시오.

일반적으로 이것은 "이벤트 블로킹 vs 쓰레드"서버 아키텍처에 대한 것이고 "블로킹 대 비 블로킹"입니다. 어떤 상황에서도 사용할 수있는 범용 서버 아키텍처는 없습니다. 그것은 응용 프로그램에 따라 다릅니다.