티스토리 뷰

NON-BLOCK I/O란, read, write를 수행할때, 실제로 읽거나 쓰기가 완료되지 않은 상태에서, 요청만하고 다른 일을 수행할 수 있도록 함으로써, 효율을 증대(?)시키는 기능을 합니다. 물론, 개발하는 사람이 신경써야할 일이 많아집니다. 주로, 동시에 여러개의 접속을 처리하는데 사용합니다.

원하는 것은 압축파일을 좀더 빨리 풀기 위해 읽어들이면서 동시에 풀려고 했는데, NON-BLOCK I/O를 일반 파일에도 적용하면 가능할 것 같았습니다. 예를 들어
fd = open( "/tmp/a.bin", O_RDONLY | O_NONBLOCK );
read( fd, buf, 4096*1024*1024 );
이렇게 4MB 정도를 읽어들인다면, 아무리 빠른 하드디스크라도, 읽는 속도가 느릴 것이기 때문에, read는 완전히 수행되지 않고, non-block 관련 오류(EWOULDBLOCK)가 빈번하게 나올 것이고 이 때마다 그동안 읽은 것을 풀려고 했습니다만... 아니더군요? 4MB를 읽을 때까지 멈춰있더란 말입니다.

그래서 man page를 더 자세히 읽어 본 결과,
man 2 read
Many file systems and disks were considered to be fast enough that the implementation of O_NONBLOCK was deemed unnecessary.  So, O_NONBLOCK may not be available on files and/or disks.
이런 우려스러운 멘트와 더불어,
man 2 open
O_ASYNC
              Enable signal-driven I/O: This  feature  is  only  available  for  terminals, pseudo-terminals, sockets, and (since Linux 2.6) pipes and FIFOs.
일반파일에 대해서 구현을 하지 않았다는군요.
아, 이런, 그럼 원하는 것을 하기 위해 epoll 로 해야하나? 라고 생각해서 테스트 해보니, 이번엔 "Permission denied"가 나옵니다.
man 2 epoll_ctl
 EPERM  The target file fd does not support epoll
네~ 이런! epoll은 분명 커널에서 지원하는 것이라 둘이 다른 루틴을 탈텐데 말입니다. 그래서 POSIX에 비교적 최근에 들어온 aio 쪽은 어떤지 살펴 보았습니다. 그런데, 이건 clone(fork)를 해서 한 녀석이 소켓을 관찰하고 있는 방식으로 구현된다는군요.

이거 다른 OS에서도 그런것일까요?
반응형
댓글
댓글쓰기 폼