** 네트워크 IO는 본질적으로 파일디스크립터(FD)에 대한 작업.
1. select
특징으로는
- 등록된 file descriptor를 하나하나 체크를 해야하고 커널과 유저 공간 사이에 여러번의 데이터 복사가 있음.
- 관리 file descriptor 수에 제한이 있음.
- 사용 쉽고 지원 OS가 많아 이식성 좋음.
file descriptor를 하나 하나에 체크하기 때문에 O(n)의 계산량이 필요합니다. 따라서 관리하는 file descriptor의 수가 증가하면 성능이 떨어진다.
또한 관리 수가 한정되어 있기 때문에 그 수를 초과하면 사용할 수 없다.
사용자가 selector.selectedKeys ()를 호출하면 운영 체제는 모든 소켓을 검색하여 시스템 커널에서 사용자의 메모리로 복사합니다. 연결 수가 증가하면 순회 및 복제 시간이 선형 적으로 증가하고 메모리 소비가 증가합니다.
Selector라는 클래스가 가지고 있는 Key에 대한 I/O 이벤트를 감시하고 있으며, Accept, Read, Write, Connection Closed 와 같은 이벤트를 감시해서 non-blocking하게 동작한다.
2. poll
poll은 거의 select와 동일하지만 다음과 같은 차이가 있다.
- 관리 file descriptor 무제한.
- 좀더 low level의 처리로 system call의 호출이 select보다 적음. 이식성 나쁨.
- 접속수가 늘어나면 오히려 fd당 체크 마스크의 크기가 select는 3bit인데 비해, poll은 64bit정도이므로 양이 많아지면 성능이 select보다 떨어짐.
3. epoll
linux커널 2.6.x이상 버전에만 지원되고 특징은 다음과 같다.
- 관리 fd의 수는 무제한.
- select, poll과 달리, fd의 상태가 kernel 에서 관리하므로 상태가 바뀐것만을 직접 통지 , fd_set 복사가 필요없음.
- 일일이 fd 세트를 kernel 에 보낼 필요가 없음.
- kernel이 fd를 관리하고 있기 때문에 커널과 유저스페이스 간의 통신 오버헤드가 대폭 줄어듬.
epoll 모드는 활성 부분만을 염두에두고 순회 및 복사 작업을 줄입니다.
Netty 프로그래밍에서 select를 epoll로 전환하는 것이 편리합니다.
코드에서 수정할 수있는 장소는 두 곳입니다. NioEventLoopGroup이 EpollEventLoopGroup으로 바뀝니다. NioServerSocketChannel이 EpollServerSocketChannel로 바뀝니다.
** 출처 **
1. socket, file descripter
http://luckyyowu.tistory.com/71
2. linux epoll
PPT참고
3.개념
https://blog.rapid7.com/2016/07/27/what-exactly-is-an-event-loop/
1. select , epoll 차이
http://gompangs.tistory.com/105
http://ozt88.tistory.com/21?category=123069