图解IO多路复用模型之select、poll、epoll

简介: 图解IO多路复用模型之select、poll、epoll

在之前的文章《如何不使用任何模型裸建服务器》(详情见上篇文章)中,我们最终使用了多线程来解决多客户端连接问题。Linux下,一般默认为一个线程占有8M的线程栈空间,那么如果有1024*8个连接,就需要8G的线程栈空间,显然具有高额的资源开销。那么IO多路复用模型,就是为了用单线程来实现多客户端连接的技术

Select模型

该模型的图解大致如下:

对应的核心代码如下:

Select模型存在以下缺点:

  1. 默认情况下,fdset只有1024个bit位,也就是说只能1024个连接。
  2. 每次select函数调用后,都需要检测所有文件描述符。
  3. 每次select函数调用时,内核都需要进行拷贝文件描述符集合。
  4. 参描较多,较难理解。

Poll模型

Poll模型与select模型的运行规则基本一致。

该模型的图解大致如下:

对应的核心代码如下:

Poll模型相比select模型,有以下优点:

  1. 将文件描述符交给结构体数组进行记录和管理,可连接数量可自定义,并且大大增加。
  2. 参数相对更简单易懂。

epoll模型

epoll是典型的用于高效地处理大量并发连接的模型

该模型的图解大致如下:

Epoll核心代码:

epoll模型相比select、poll模型,有以下优点:

  1. 支持边缘触发。当recv函数一次性无法读取全部数据的时候,可以在下次循环中继续读取数据,有效地避免粘包等问题。
  2. 使用红黑树管理文件描述符和对应事件。在连接数巨大的时候,epoll的红黑树数据结构可以快速地实现节点的增删改查。包括相应事件发生的时候,内核也能迅速地查找到相应的节点并且进行后续操作。
  3. 直接从内核获取就绪状态的文件描述符。用户无需遍历全部地文件描述符,挨个检测它们是什么状态。
  4. 数据结构直接建立在内核中,无需将存储文件描述符集合和监听事件的数据结构实例反复复制进入内核中。
  5. 没有连接数量大小的限制。
目录
相关文章
|
25天前
|
存储 监控 Linux
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
50 0
|
2月前
|
网络协议 安全 测试技术
手撕测试tcp服务器效率工具——以epoll和io_uring对比为例
手撕测试tcp服务器效率工具——以epoll和io_uring对比为例
39 2
|
3月前
|
存储 Linux 调度
io复用之epoll核心源码剖析
epoll底层实现中有两个关键的数据结构,一个是eventpoll另一个是epitem,其中eventpoll中有两个成员变量分别是rbr和rdlist,前者指向一颗红黑树的根,后者指向双向链表的头。而epitem则是红黑树节点和双向链表节点的综合体,也就是说epitem即可作为树的节点,又可以作为链表的节点,并且epitem中包含着用户注册的事件。当用户调用epoll_create()时,会创建eventpoll对象(包含一个红黑树和一个双链表);
66 0
io复用之epoll核心源码剖析
|
3月前
|
Linux
Linux 下的五种 IO 模型详细介绍
根据上述定义,我们的前4种模型——阻塞式I/O模型、非阻塞式I/O模型、I/O复用模型和信号驱动式I/O模型都是同步I/O模型,因为其中真正的I/O操作(recvfrom )将阻塞进程。异步请求:A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。和上面的阻塞IO模型相比,非阻塞IO模型在内核数据没准备好,需要进程阻塞的时候,就返回一个错误,以使得进程不被阻塞。阻塞请求:A调用B,A一直等着B的返回,别的事情什么也不干。
34 0
Linux 下的五种 IO 模型详细介绍
|
25天前
|
NoSQL Java Linux
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
59 0
|
1月前
|
JavaScript Unix Linux
IO多路复用:提高网络应用性能的利器
IO多路复用:提高网络应用性能的利器
|
3月前
|
消息中间件 架构师 Java
性能媲美epoll的io_uring
性能媲美epoll的io_uring
29 0
|
3月前
|
网络协议 架构师 Linux
一文说透IO多路复用select/poll/epoll
一文说透IO多路复用select/poll/epoll
139 0
|
27天前
|
存储 Java 数据处理