루프안에 있으면 돈다하니까 뭔가 말이 좀 이상한데 내말은 while(1) { select(....); .....(다른 명령어들).... } 호출하고나면 select에서 블록되고 다른 명령어들을 실행 못하잖아.
안드의노예(118.35)2015-05-05 14:15
근데 비동기 select를 쓰면 그냥 바로 아무것도 없음을 리턴하고 다른명령어들을 계속 실행하면서 루프도는건가?
안드의노예(118.35)2015-05-05 14:16
그냥 커널이 대신 처리해 주는 것이라 보면 된다. 기본적으로 네트워크는 랜카드를 이용하고 장치의 Input은 O/S가 인터럽트에 의해 알 수 있지. 인터럽트가 발생하면 CPU는 현재 실행 중이던 코드를 잠깐 중단하고 인터럽트 먼저 해결함. 인터럽트를 해결할 때 불리는 함수는 O/S의 인터럽트 처리 함수이고, 이 처리 함수 내부에서 니가 WSAAsyncSelect로 지정한 이벤트이면 지정된 창의 메시지 큐에 Message를 박아줄 뿐임. 나중에 니 프로그램에서 조금 있다가 GetMessage 함수랑 DispatchMessage 함수를 부르면 윈도우 프로시저에서 그 메시지를 처리하겠지. 진정한 비동기는 인터럽트에서 이루어질 뿐, 나머지는 다 동기적으로 처리된다.
루프안에 있으면 돈다하니까 뭔가 말이 좀 이상한데 내말은 while(1) { select(....); .....(다른 명령어들).... } 호출하고나면 select에서 블록되고 다른 명령어들을 실행 못하잖아.
근데 비동기 select를 쓰면 그냥 바로 아무것도 없음을 리턴하고 다른명령어들을 계속 실행하면서 루프도는건가?
그냥 커널이 대신 처리해 주는 것이라 보면 된다. 기본적으로 네트워크는 랜카드를 이용하고 장치의 Input은 O/S가 인터럽트에 의해 알 수 있지. 인터럽트가 발생하면 CPU는 현재 실행 중이던 코드를 잠깐 중단하고 인터럽트 먼저 해결함. 인터럽트를 해결할 때 불리는 함수는 O/S의 인터럽트 처리 함수이고, 이 처리 함수 내부에서 니가 WSAAsyncSelect로 지정한 이벤트이면 지정된 창의 메시지 큐에 Message를 박아줄 뿐임. 나중에 니 프로그램에서 조금 있다가 GetMessage 함수랑 DispatchMessage 함수를 부르면 윈도우 프로시저에서 그 메시지를 처리하겠지. 진정한 비동기는 인터럽트에서 이루어질 뿐, 나머지는 다 동기적으로 처리된다.