티스토리 뷰
NON-BLOCK I/O란, read, write를 수행할때, 실제로 읽거나 쓰기가 완료되지 않은 상태에서, 요청만하고 다른 일을 수행할 수 있도록 함으로써, 효율을 증대(?)시키는 기능을 합니다. 물론, 개발하는 사람이 신경써야할 일이 많아집니다. 주로, 동시에 여러개의 접속을 처리하는데 사용합니다.
원하는 것은 압축파일을 좀더 빨리 풀기 위해 읽어들이면서 동시에 풀려고 했는데, NON-BLOCK I/O를 일반 파일에도 적용하면 가능할 것 같았습니다. 예를 들어
그래서 man page를 더 자세히 읽어 본 결과,
아, 이런, 그럼 원하는 것을 하기 위해 epoll 로 해야하나? 라고 생각해서 테스트 해보니, 이번엔 "Permission denied"가 나옵니다.
이거 다른 OS에서도 그런것일까요?
원하는 것은 압축파일을 좀더 빨리 풀기 위해 읽어들이면서 동시에 풀려고 했는데, NON-BLOCK I/O를 일반 파일에도 적용하면 가능할 것 같았습니다. 예를 들어
fd = open( "/tmp/a.bin", O_RDONLY | O_NONBLOCK );이렇게 4MB 정도를 읽어들인다면, 아무리 빠른 하드디스크라도, 읽는 속도가 느릴 것이기 때문에, read는 완전히 수행되지 않고, non-block 관련 오류(EWOULDBLOCK)가 빈번하게 나올 것이고 이 때마다 그동안 읽은 것을 풀려고 했습니다만... 아니더군요? 4MB를 읽을 때까지 멈춰있더란 말입니다.
read( fd, buf, 4096*1024*1024 );
그래서 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네~ 이런! epoll은 분명 커널에서 지원하는 것이라 둘이 다른 루틴을 탈텐데 말입니다. 그래서 POSIX에 비교적 최근에 들어온 aio 쪽은 어떤지 살펴 보았습니다. 그런데, 이건 clone(fork)를 해서 한 녀석이 소켓을 관찰하고 있는 방식으로 구현된다는군요.
EPERM The target file fd does not support epoll
이거 다른 OS에서도 그런것일까요?
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 식물
- 커피
- ssh
- JavaScript
- SSO
- writely
- SVN
- Tattertools plugin
- macosx
- 킹벤자민
- tattertools
- 대화
- 디버깅
- perl
- OpenID
- MySQL
- 퀴즈
- 오픈소스
- 구근
- 벤자민
- VIM
- 덴드롱
- nodejs
- BlogAPI
- Linux
- 수선화
- TCP/IP
- 클레로덴드럼
- Subversion
- url
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함