Linux IO多重化
2850 ワード
ファイル記述子のステータスをリスニングして、対応する読み書き操作を行います.3つの関数:
各種I/Oブロック時間比較:
参考:Linux I/O詳細
1
2
3
select
poll
epoll
1
2
3
4
5
6
7
8
9
int (int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
int epoll_create(int size);
Linux IO rd">int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);
select
は、リスニングされた読み取り、書き込み、exceptの3種類のファイル記述子を別々に送信し、nfdsは最大1024個をサポートする.poll
はselectに似ていますが、fdsには最大の制限はありません.select
poll
は、各fdの状態を1つずつポーリングする必要があり、各fdのユーザ空間データは、独立したcopy(カーネルコード:do_sys_poll
->copy_from_user
)を必要とする.epoll
は以上の2つの関数の拡張版であり、nfdsには最大の制限はなく、理論的にはシステムがサポートする最大ファイル記述子の個数と等しく、すべてのfdのユーザ空間データが一度にコピーされ、各fdの状態をポーリングすることなく、登録コールバックによって効率が著しく向上する.各種I/Oブロック時間比較:
参考:Linux I/O詳細