I/O复用
I/O复用使得程序可以同时监听多个文件描述符,可以提高程序的性能.
I/O复用虽然能同时监听多个文件描述符,但是它本身是阻塞。并且当多个文件描述符同时就绪时,如果不采取额外的措施,程序只能按顺序依次处理每一个描述符。使得服务器程序是串行工作。如果要实现并发,只能使用多进程或者多线程等手段.
select用法:
int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);
select的参数类型fd_set没有将文件描述符和事件绑定,它仅仅是一个文件描述符集合,因此select需要提供三个这种类型的参数来分别传入和输出可读、可写及异常等事件。这使得select不能处理更多类型的事件,另外由于内核对fd_set集合的在线修改,应用程序调用select之前要重置这3个fd_set集合.其中select可以跨平台.
poll用法
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
poll的参数类型pollfd把文件描述符和事件都定义一起,任何事件都统一处理,使得编程接口简洁。并且内核每次修改的是pollfd结构体revents成员,而events成员保持不变,一次下次调用poll时应用程序无须重置pollfd结构体的事件集参数.
select和poll都是采用轮询的方式,复杂度为O(n);
epoll用法
int epoll_create(int size);
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);
epoll采用与select和poll完全不同的方式来管理用户注册的事件,它在内核维护一个事件表,并提供独立的系统调用epoll_ctl来控制往其中添加、删除、修改事件.这样,每次epoll_wait调用都直接从该内核事件表中取得用户注册的事件,而无须反复从用户空间读入这些事件。epoll_wait系统调用的参数events来反馈就绪事件.这使得应用程序索引就绪文件描述符的时间复杂度达到O(1).

浙公网安备 33010602011771号