select模块作用:select系统调用用来检测多个文件描述状态变化,程序会一直在select中等待直到超时或者被监视文件描述符中的一个或多个状态发生改变。
select函数:select(rlist,wlist,xlist[,timeout]),返回值:(rlist,wlist,xlist)
rlist:读取socket列表,判断是否有可以读的socket;
wlist:写入socket列表,判断是否有可以写的socket;
xlist:异常socket列表,判断是否有异常的socket;
如果有socket可以读,可以写,或者异常,select返回相应socket列表
select如何判断可读:
- 将检测的socket加入到rlist中,然后调用select等待数据;
- 如果有客户端连接或者对方数据,那么select就会立刻返回;
- 如果是新的链接调用accept接受新的socket,并将该socket计入到rlist或者wlist中;
- 如果有数据,那么就接收数据;
select如何判断可以写:
- 将检测的socket加入到wlist中,调用select等待;
- 如果socket可以写,返回可以写的socket列表;
- 调用send方法,发送数据;
select如何判断异常:
- 将检测的socket加入到xlist中,调用select等待;
- 如果socket有异常,返回异常的xlist列表;
- 处理异常socket;
select多路复用服务器优点和缺点:
优点:
- 不需要频繁的创建和销毁进程和线程,节省了系统的开销和负担;
- select采用轮训方式处理收发数据,处理效率高于多进程和多线程模型;
缺点:
- 当个进程监控的最多文件描述符有限的(系统默认1024个)
- 需要维护一个文件描述符列表
- 对于文件描述符扫描是线性的,当每次对这个结构进行扫描时时间会增加
- 内核把文件描述符消息通知给用户空间需要进行拷贝;
epoll模式
- 是linux下多路复用IO接口select/poll的增强版本
- 它所支持的文件描述符的上限是最大可以打开文件的数目
- epoll只会对“活跃”的socket进行操作,不会因为文件描述符的增加导致效率线性下降
- epoll是通过内核于用户空间mmap同一块内存实现,使用mmap加速内核与用户空间的消息传递;
时间: 2024-11-10 14:26:16