select vs epoll

在linux网络编程中,支持I/O 多路复用的系统调用有 select、pselect、pool、epoll 这几个。 select与epoll 原理很类似,但是epoll是在select上面做了很多改进。

1. 支持一个进程打开的socket描述符(FD) 不受限制(仅受限于操作系统的最大文件句柄数)

select 默认只支持1024个, epoll却能支持很大。(1G 内存大约是10万个句柄)

2.I/O 效率不会随着FD数目的增加而线性下降。

epoll只会扫描活跃的socket,二select会全部扫描。

3. 使用mmap加速内核与用户空间的消息传递

4. epoll的API更加简单。

IO通信模型

  1. 同步io (BIO)

bio的问题在于 每当有一个新的客户端请求接入时,服务器端必须创建一个新的线程处理新接入的客户端连接,一个线程只能处理一个客户端连接。 同步io的问题在于: 当对socket的输入流进行读取操作的时候,它会一直阻塞下去,直到有数据可读或者发生异常。

这意味者当对方发送请求或者应答消息比较缓慢 或者网络传输较慢时,读取输入流一方的通信线程将被长时间堵塞,如果对方要60s才能够将数据发送完成,读取一方的io线程也将会被同步阻塞60s,在此期间,其他接入消息只能在消息队列中排队。写出的操作也是一样的。

  1. 伪异步IO

伪异步IO在BIO的基础上加入了线程池的处理逻辑,避免了为每隔请求都创建一个独立的线程,造成线程资源耗尽的问题。 但是由于它底层的通信依然采取了同步阻塞模型,因此无法从根本上解决问题。.

  1. nio

nio里面的 SocketChannel 和 ServerSocketChannel 对应了 BIO里面的 Socket和ServerSocket

nio引入了缓冲区的概念(buffer) 这是和bio的一个重要区别。 bio将数据直接读取到流,而nio则面向缓存

nio引入了通道的概念(channel) 流式单向的,而通道是双向的(全双工)

多路复用器 selector。 简单来讲 selector会不断地轮询注册在其上的Channel,如果某个Channel上面发生读或者写时间,这个Channel就处于就绪状态,会被selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的IO操作。

results matching ""

    No results matching ""