IO多路复用(网络编程)select
问题:IO多路复用是要干什么?为什么要采用IO多路复用,为什么不采用多进程服务器?或者多线程服务器?
答:IO 多路复用是使用一个线程来检查多个文件描述符(Socket)的就绪状态,如果有文件描述符就绪,则返回,否则阻塞到超时。
IO多路复用,比多线程、多进程好,减少了内存开销和上下文切换的开销。
一、select()函数
1. 函数解释
int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);
struct timeval{
long tv_sec;
long tv_usec;
};
void FD_CLR( int fd,fd_set *set);
int FD_ISSET(int ffdf,fd_set *set);
void FD_SET(int fd,fd_set *set);
void FD_ZERO(fd_set *set);
2.使用流程
(1)定义一张文件描述符表,进行初始化;
(2)通过select 函数检测文件描述表;
(3)记录需要检测的表,轮询更新表并处理需要操作的文件描述符;
3.缺点:
(1)内核使用轮询方式检测表中描述符是否就绪,文件描述符越多,消耗资源越多;
(2)文件描述符集合使用表最大为1024个文件描述符;
(3) 每次文件描述符集合更新时,重新拷贝到内核中;
(4)结果表会覆盖原始表,select函数实现中,一旦发现就绪的文件描述符就会返回,此时表中未就绪的描述符会被清除,每次都需要重新向新表加入需要检测的文件描述符;
总结:select()函数 将需要监测的文件描述符收集起来交给内核,让内核监控哪一个或者哪几个文件描述符内有数据写入,当一个或者多个文件描述符内有数据时,select()函数会返回有数据写入的文件描述符个数,并置位相应的bitmap表。