Development/Common

동기 비동기

linuxism 2012. 7. 3. 09:00


좋은 답변 감사합니다..답변을 읽으니까 명확하게 들어 오는 군요...:-]

-맹수.

ps)자바의 nio에는 Non-Blocking IO라고만 써있어서..헷갈렸습니다.
이런 점에서는 자바가 느린 편이군요.

------------------------------------------------------------
>혼동되는 두 단어 또는 개념이 있을 때에는 둘이 전혀 관계없다고 생각하고
시작하는 것이 좋습니다. 특히나, IT 분야는 용어가 끝도 없이 생산되고
있는 영역이므로 더욱 그렇습니다.

> 역시 개념이 혼동이 오는 군요..
> 논 블러킹 소켓과 비동기 소켓이 잘 구분되지 않습니다.
> select()에서 fd을 논 블로킹으로 할수 있다는 건 알겠습니다만...
> 비동기 소켓은 io가 끝날때 까지 관련 서버 함수를 블로킹 하는 데요(맞나요?)
> 흠 그럼 무엇과 io가 비동기 인가요?

- 동기(synchronous) 방식과 블럭킹(blocking) 모드
- 비동기(asynchronous) 방식과 논-블럭킹(non-blocking) 모드

이렇게 연관지을 수 있습니다.

동기나 비동기라는 표현은 일을 처리하는 "방식"을 말합니다.

클라이언트가 서버에게 요청을 하는 경우를 예를 들면,
클라이언트가 서버에게 요청을 보내고 서버가 그 결과를 보낼 때까지
다른 일을 하지 않고 기다렸다가 결과를 받으면 다음 단계로 진행하는
방식을 "동기" 방식이라고 합니다.
반대로 클라이언트가 서버에게 요청을 보낸 후, 그 결과가 넘어올 때까지
기다리지 않고 다른 작업을 하다가 결과값이 왔다는 신호를 받으면
결과값을 받아 처리하는 방식을 "비동기" 방식이라고 합니다.

동기 방식은 요청을 보내고 기다리는 방식이므로 함수를 호출하면
그 함수는 결과값이 올 때까지 반환하지 않습니다. 영어 단어 뜻 그대로
해석하면 됩니다. 블럭킹은 더 이상 진행하지 않도록 Block한다는
뜻입니다.

비동기 방식은 요청을 보내고 그 즉시 다음으로 진행하는 방식이므로
함수를 호출하면 그 즉시 반환합니다. 함수가 프로그램의 진행을
블럭하지 않습니다.

TCP/IP BSD 소켓 객체는 기본적으로 '블럭킹' 모드로 동작합니다.

소켓이 블럭킹 모드라 함은, 1) recv 를 호출할 당시 해당 소켓에
읽을 데이터가 없으면 데이터가 들어올 때까지 기다림을 말합니다.
2) send 를 호출할 때 아직 보내지 못한 데이터들로 전송 버퍼가
꽉 차 있으면 그 버퍼가 비워져서 데이터가 버퍼로 들어갈 수 있을
때까지 기다립니다.

setsockopt 메써드를 사용하여 논 블럭킹 모드로 바꾸면 행동 방식이
달라집니다.
1) recv를 호출할 때 데이터가 있으면 데이터를 반환합니다. 그러나
데이터가 없을 때에는 Exception을 내고 즉시 반환합니다.
2) send를 호출할 때 전송 버퍼가 차 있지 않으면 버퍼를 채우고
반환합니다. 전송 버퍼가 다 차 있으면 Exception을 내고 즉시
반환합니다.

프로그램 진행 방식을 비동기 모드로 하기 위해서는 소켓을 논 블럭킹
모드로 전환하고 사용해야 합니다.

> 그리고 파이썬에서 논블러킹 소켓이 따로 있는지.
> 그리고 논 블로킹 소켓의 장단점은 어떻게 될까요?

소켓 객체는 하나입니다. setsockopt 메써드를 호출하여 소켓의
모드(mode)를 변경할 뿐입니다.

논 블럭킹 모드의 장단점이란 질문은 적절하지 못한 것 같습니다.

비동기 모드를 위해 논 블럭킹 모드는 꼭 필요합니다. 블럭킹 모드
보다 생각해야 할 것이 하나 더 있다는 것이 다를 뿐입니다.
Exception에 대처하는 코드를 만들어야 합니다.


출처 - http://memento915.egloos.com/491879