IO多路复用技术、select、poll、epoll联系与区别

IO多路复用技术

  • 通信双方都有一个socket,以一个文件描述符的形式存在,那这个fd也对应了内核当中的一块缓存区,缓冲区里有读缓冲区和写缓冲区,一端写另一端读,IO也就是指这样对缓冲区的操作多路复用能够让程序同时监听多个文件描述符

I/O多路复用技术是一种允许单个进程或线程同时监视多个输入/输出(I/O)通道的技术,如网络连接、文件描述符等。当某个I/O通道有数据可读或可写时,操作系统通知应用程序进行相应的操作。这种技术可以提高应用程序的效率和性能,特别是在处理大量并发I/O操作时。以下是几种常见的I/O多路复用技术:

select:

select是最早的I/O多路复用技术之一。它允许程序指定一组文件描述符,然后查询这些描述符中哪些已经准备好进行读取或写入操作。

poll:

poll与select类似,但它使用不同的数据结构(pollfd结构体数组),并且没有select中的文件描述符数量限制。

epoll(Linux特有):

epoll是Linux下的一种高效的I/O多路复用技术。它使用一组系统调用(epoll_create、epoll_ctl、epoll_wait)来管理事件和通知机制。epoll使用红黑树和事件列表来提高性能,特别是对于大量并发连接。

epoll select poll的区别

select/poll/epoll 都是内核提供给用户态的多路复用系统调用

  1. select和poll要检测的文件描述符集合是在用户态下创建的,每次调用都需要从用户态拷贝到内核中。而epoll从创建开始就是在内核空间创建的。
  2. 判断是否有文件描述符就绪,select和poll需要遍历整个文件描述符的集合,遍历的时间复杂度都是O(n)。而epoll利用了内核的事件驱动机制,只有当文件描述符就绪时才会返回,在硬件的支持下是O(1)的时间复杂度。
  3. select和poll都只能工作在相对低效的LT模式下,而epoll同时支持LT和ET模式。
  • 水平触发:当文件描述符就绪时,它们会一直通知应用程序直到应用程序处理完该事件
  • 边缘触发:它只会通知应用程序一次,所以我们一般会循环的从文件描述符中读写数据,一次性尽可能多的读取数据。
  • 一般来说,边缘触发的效率比水平触发的效率要高,因为边缘触发可以减少系统调用次数,减少开销的。
  • 当监测的fd数量较小,建议使用select和poll;当监听的fd数量较多,使用epoll会明显提升性能。
  • epoll 在内核里使用「红黑树」来关注进程所有待检测的 Socket

epoll是同步还是异步

epoll 通常被认为是一种介于传统同步 I/O 和完全异步 I/O 之间的机制。
同步的:epoll 通过 epoll_wait() 系统调用来通知应用程序哪些文件描述符已经准备就绪,应用程序在接收到通知后就要自己去执行实际的 I/O 操作。这种模式更接近于同步 I/O。
异步的:epoll 允许应用程序先注册对特定的 I/O 事件,当这些事件发生之后操作系统会自动通知应用程序,这是异步 I/O 的一个关键特征。
所以总体而言它是同步的,但又提供了一种接近异步 I/O 的编程模型。

epoll详解

epoll 是 Linux 内核提供的一种高效的 I/O 多路复用技术,用于监控大量文件描述符(file descriptors)的 I/O 事件。与传统的 select 和 poll 相比,epoll 在处理大量并发连接时具有显著的性能优势。以下是 epoll 的一些关键特性和概念:

数据结构:

epoll 使用红黑树来组织和管理文件描述符,这使得查找、添加和删除操作都非常高效。
系统调用:

epoll 提供了三个主要的系统调用:
epoll_create:创建一个新的 epoll 实例。
epoll_ctl:用于添加(EPOLL_CTL_ADD)、修改(EPOLL_CTL_MOD)或删除(EPOLL_CTL_DEL)感兴趣的文件描述符。
epoll_wait:等待 I/O 事件的发生,并返回就绪的文件描述符列表。
事件类型:

epoll 支持多种类型的事件,包括读(EPOLLIN)、写(EPOLLOUT)、错误(EPOLLERR)等。
事件触发模式:

epoll 支持两种触发模式:
边缘触发(Edge Triggered,ET):只有状态发生变化时才通知应用程序。
水平触发(Level Triggered,LT):只要条件满足,就会不断通知应用程序。
性能优势:

与 select 和 poll 不同,epoll 不需要在每次调用时传递所有文件描述符的集合,内核维护了文件描述符的状态,这大大减少了数据复制的开销。
就绪列表:

当 epoll_wait 被调用时,内核会将准备好的文件描述符添加到就绪列表中,应用程序可以直接从这个列表中读取事件,而不需要轮询。
可扩展性:

epoll 可以高效地处理成千上万的并发连接,这使得它非常适合用于高性能的服务器应用程序。
内存使用:

尽管 epoll 在性能上优于 select 和 poll,但它可能会使用更多的内存,特别是当监控大量文件描述符时。
编程复杂性:

使用 epoll 编程可能比 select 和 poll 更复杂,需要正确地管理文件描述符的注册、注销和事件处理。
epoll 的高效性能使其成为 Linux 下开发高性能网络应用程序的首选 I/O 多路复用技术之一。然而,开发者需要仔细设计程序,以充分利用 epoll 的优势,同时避免潜在的编程陷阱。

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值