多路I/O转接服务器(一)
多路IO转接服务器也叫做多任务IO服务器。该类服务器实现的主旨思想是,不再由应用程序自己监视客户端连接,取而代之由内核替应用程序监视文件。
主要使用的方法有三种:select、poll、epoll
select
、poll
和epoll
是三种用于 I/O 多路复用(I/O Multiplexing)的系统调用,它们主要用于在处理多个 I/O 事件时提高效率。它们的基本功能都是在一个或多个文件描述符上等待事件(如可读、可写或异常情况),但是它们在性能和使用上有所不同。
一、select多路IO转接
让内核去监听客户端连接(lfd),当有客户端进行连接时 它会让server去调用accetp(当有连接时才去立即调用,而不是一直阻塞等待)得到一个用于通信的cfd,最后让内核监管着lfd和所有cfd
即(原理):借助内核, select 来监听, 客户端连接、数据通信事件。
简单描述:c1要建立连接,被select监听到了,select报告老板,老板调用accecp函数(直接返回不用阻塞),把cfd交给select,让select和c1进行通信
阻塞、非阻塞忙轮询、响应式(多路IO转接)
借助select实现多线程
函数解析
1. 底层原理:
文件描述符表:前三个默认被系统占用
fd_set集合:传入的是文件描述符,传出所有监听集合(读、写、异常)中满足对应事件的总数
fd_set集合的本质:位图(二进制位存放文件描述符的状态),默认都为0,若发生变化就置1
2. 语法:
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeva l *timeout);
参数:
- nfds:监听的所有文件描述符中,最大文件描述符+1;
- readfds:读 文件描述符监听集合。传入传出参数
- writefds:写 文件描述符监听集合。传入传出参数,通常传NULL
- exceptfds:异常 文件描述符监听集合。传入传出参数,通常传NULL
- timeout:大于0表示设置监听时长,NULL表示阻塞监听,0表示非阻塞监听 while轮询
返回值: