search results for 'I/O'

  1. 2007/05/28 Asynchronous I/O or Non Blocking I/O

위키에서 둘이 같은 말이라는데 음... 그랬나? ㅋ
지금부터 주절대는 말은 내 개인적인 생각임, 근데 아마 맞을것임 아님 말고 ㅋ

두개가 개념상으로 약간은 틀린거 같은데 거의 같으니 머 쩝
암튼 이건 process가 I/O 때문에 cpu를 idle 상태로 장시간 두는 것을 방지하기 위한 것임

먼저 Non Blocking부터 얘기해보자..
소켓 프로그래밍을 하다 보면 이런 경우를 자주 봤을것이다
recv()에서 죙일 블록 되거나
accept()에서 죙일 블록되거나 이런거 말이당 ㅋ
이게 쉽게 말하면 Blocking I/O란 말씀!!!

이거 socket file을 open할 때 기냥 open system call을 써서 그런다
default가 Blocking Mode로 들어간다
이렇게 하면 process block으로 인해 망합니다 ㅋㅋ
이걸 방지 하기 위해 socket file을 open할때 잘 하믄 된다 ㅡㅡ;
어떻게? file control system call을 쓰자
prototype
- int fcntl(int fd, int cmd, int arg);

ex) fcntl(fd, F_GETFL, flag | O_NONBLOCK);
참고 하시라

이렇게 하면 어떻게 되느냐? 성공하면 물론 성공값을 return하고
실패하면 왜 실패 했는지 그 정보를 전달해 준다, 보통 -1을 반환 하지만
process block에 의한 error인지 아니면 다른 이유에 의한 error인지
구분 할 수 있어야 한다. 아마 errno.h에 명시가 되어 있을듯?

이번엔 Asynchronous를 얘기해 보자
비동기 입출력이라고도 한다. 한글로 얘기하니까 약간 어색하다 ㅋㅋ
어색해야 정상이라고 생각하는게 좋다 ㅋㅋ 영어가 폼난다 -_-;
역시 예는 socket이다 크허허허
Non blocking의 경우는 안되면 실패 했다가 성공 할때까지 한다(독한넘 ;;;)
이놈도 마찬가지지만 성공하면 event가 signal을 날린다
 - Linux의 경우임, SIGIO와 SIGUSR을 같이 쓰기도 한다고 함
sigaction으로 설정해 놓고 역시 fcntl을 통해 Non blocking옵션과
asynchronous 옵션을 설정해 주면된다
ex) fcntl(fd, F_SETFL, O_NONBLOCK | FASYNC);

이 외에도 방법론이 몇개 되는 듯 하다
- Polling : 이건 Non Blocking인듯?
- Selcet(poll) loop : 이건 그닥 유용하지 않은 듯 하다 ㅋㅋ 그러니 패스 -_-;
- Signal(interrupt) : 요게 Asynchronous인듯?
그 외 Callback Function, LWP(Light Weight Process = Thread), Completion Queue, Event Flag가 있다. 근데 대충 보니 그닥 안땡기니 설명은 패스!!! 크허허 -_-;



모야 제대로 알고 가자고 해놓고선 ㅡㅡ;
인생이 다 그런거다 ~_~;

===================================================================================

TAG ,