먼저 용어부터 간단하게 정의하자면,
* 동기, 비동기(방식), blocking, non-blocking(함수)
동기 : 순서있게 일(I/O등)을 한다.
비동기 : 신호를 보내고, 받는다.(무순서)
블록킹 : 리턴값에 신뢰성이 있다(대신에 기다림)
넌블록킹 : 리턴값은 대개 무조건 false다.(바로 리턴하는 대신, 신뢰성이 없음)
비동기에서는 주로 non-blocking함수를 쓰고, 동기에서는 blocking함수를 주로 쓰지
만, 엄밀히 blocking, non-blocking은 함수에 대한 설명일 뿐입니다. 통신하는 방식
이 아니죠.
문제는 MS에서 AsyncSocket이라고 지원해 주는 것이 Unix에서는 non-blocking방식으
로 되어있습니다.(sync, async라는 것이 사실 이름 붙이기 나름이죠)
사실 진정한 async는 blocking함수가 있으면, 안됩니다.(recv함수도 blocking함수죠)
*대표적 통신 방식
1. sync
2. non-blocking(Windows쪽에서 지원해 주는 async).
3. aync(recv가 없는 방식, 다시 여러가지로세분됨).
아마, 계속 보시다보면, 대충 뭐가 sync고 뭐가 async인지 나름대로 감을 잡으실 수
있으실 겁니다^^
* 실례
1. sync : send명령어로 메세지를 보내고, 다 보냈는지 확인한 수에 return한다.
2. async : WriteFile로 "OS야 시간나면, 이거 보내라~"라고 통지만 해준다.
(당연히 언제 보낼지, 아님 바빠서 안보낼지 알 수가 없다.)
1-1. 보낸다-확인, 보낸다-확인(한번에 1개씩 밖에 못 보내겠죠?)
2-1. 보낸다-보낸다-보낸다 확인-확인-확인.(마구마구 중첩시킬수 있습니다^^)
사실 sync, async는 통신에서 뿐만이 아니라 엔간한 I/O에는 다 있는 방식입니다.
당연히 님께서도 이미 동기 비동기 I/O를 수도없이 겪으셨고 이미 거의 완벽히 이해하
고 계십니다....프린터 써보셨죠??^^
* 더 쉬운 예(프린터를 예로 들어서, 문서 10개를 print시킬때)
1. sync : 문서를 작성하고 print시킨다. 다 프린트 되서 나올때까지 기다려서 확인.
그 다음 문서를 print시키고, 다 나올때까지 확인.(당연 절라 느림)
(거기다 사람(application)이 계속 기달리고 있어야 함...시간 아깝죠?^^)
2. async : 문서를 print시키라고 마구 시킨다.(프린터야 죽어나든 말든..)
글구 사람(application)은 코딩작업을 마무리 하던가, 데브피아에 답변을
올리던가...일을 하다가 printer가 일이 끝나면, 삐~~(신호음)을 울려주고
그때서야 프린트가 잘 됐나 한번 봐준다^^
(사람(application)을 부릴땐 이렇게 시켜야 효율적으로 일하겠죠?^^)
(실제로 쓰이고 있는 방식입니다.)
3. non-blocking방식 : 프린트 시키고 딴짓하다가 프린트가 나오기 시작하면,
다 끝날때까지 기다림(sync보단 효율적이고, async보단 더 느리고)
(recv함수를 쓰는 동안은 기다리니깐요)
동기는 프로그래밍하기가 좋고, 비동기는 좀 더 까다로운 대신 기능이 좋죠^^
덧. async가 네트워크 속도가 빠른 건 아닙니다(확인하고 보내는 시간이 없으니 조금
더 빠르긴 하지만...프린트를 1000장을 시킬때, 완료될때까지 걸리는 시간은 그렇게
차이가 안나죠, 문제는 사람(application)이 하루종일 기달리고 있느냐, 하루종일 딴
일하고, 마지막에 확인만 해주느냐의 차이인 것이죠.^^
출처 : 데브피아의 노컷님이 정리한 자료 입니다...


