IO 多路复用技术
在 Linux IO 编程中,如果需要同时处理多个客户端请求,可以利用 IO多路复用技术,把多个 IO阻塞 复用到同一个 select(系统调用)阻塞上。这样就能达到 单个线程同时处理多个客户端请求 的效果。
与传统的多线程方式相比,IO多路复用 可以减少系统开销。因为所需线程少,节省了很多系统资源。
IO 复用的关键系统调用
文件描述符 —— FD(file descriptor)
Linux 内核将所有外部设备都当作一个文件来操作;
而Linux中对一个文件的读写操作会调用系统命令,返回一个文件描述符 FD。
对一个 socket 的读写也有相应的描述符 —— socketfd。
这些描述符就是一个数字,它指向内核中的一个结构体。结构体中包含 文件路径、数据区 等属性。
select/poll
利用 Linux 中的 select/poll 机制,可以将多个文件描述符 FD 传给 select 或 poll 系统调用;
select/poll 可以侦测这些 FD 是否处于就绪状态,以便处理相应的IO操作。
select/poll 以 顺序扫描 的方式检测FD的就绪状态,且支持的 FD 数量有限,所以实际应用中容易成为瓶颈。
epoll
为了克服select的缺陷,出现了多种解决方案(如,FreeBSD 的 kqueue、Solaris 的 dev/poll)。
epoll 系统调用就是其中一种方案。与 select 相比,它有很多大改进:
# 支持大量的 socket 描述符
select 支持单进程打开的 FD数量较小,默认值是 1024。
对于动辄上万个客户端连接的服务端来说根本不够用。
epoll 支持的 FD数量 上限是 操作系统的最大文件句柄数,远大于1024。
这个数字通常与内存关系较大。一般,内存越大,这个上限就越高。
1GB内存的机器支持大约10万个句柄。
可以通过以下命令查看该数值:
cat /proc/sys/fs/file-max
# IO 效率不会因 FD数量增加 而 线性下降
现实应用中经常会有这种场景:客户端连接非常多(即 socket集合 非常大),且网络延时或链路空闲导致“活跃”socket非常少。
传统 select/poll 是顺序扫描 socket 集合,检查就绪状态。
这导致发现“活跃”socket的效率 因FD数量增加而线性下降。
epoll 则只会对“活跃”的socket 进行操作。
因为它是根据每个 FD 上的 callback 函数实现的。
只有“活跃”的socket 才会主动调用 callback 函数。
也就是“事件驱动”,这是epoll名称的由来(event poll)。
可以把 epoll 的这个机制当作是 “伪异步IO”。
显然,如果所有 socket 都处于活跃状态,那么 epoll 在这方面没有效率优势,甚至不如传统select。
但在现实场景中,经常会出现很多 socket 处于非活跃状态,epoll 的效率优势非常明显。
# 使用 mmap 减少数据从 内核到用户空间 的内存复制
为了把内核中的FD相关数据通知到用户空间,epoll 利用 mmap 让内核与用户空间 映射同一块内存。这样就可以避免不必要的内存复制。
# 更简单的 API
相关推荐
select,poll,epoll都是多路复用IO的函数,简单说就是在一个线程里,可以同时处理多个文件描述符的读写。 select/poll的实现很类似,epoll是从select/poll扩展而来,主要是为了解决select/poll天生的缺陷。 epoll在...
本文将深入探讨网络I/O的基本概念,以及select、poll和epoll这三种I/O多路复用机制,并通过实际代码示例展示其在服务器并发中的应用。 首先,理解网络I/O。在网络通信中,数据传输通常涉及发送(output)和接收...
三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu
在Linux系统中,epoll是实现IO多路复用的一种高效方法,它克服了早期的poll和select方法在处理大量并发连接时性能下降的问题。 epoll的核心概念包括: 1. **Epoll结构**:epoll_create()函数创建一个epoll实例,...
在 Linux 系统中,IO 多路复用机制主要有三种实现方式:Select、Poll 和 Epoll。这里我们将对 Select 和 Poll 两种机制进行详细的解析。 Select 多路复用 Select 是一种传统的 IO 多路复用机制,通过使用 fd_set ...
IO多路复用通过系统调用如select、poll、epoll等,让程序可以监控多个文件描述符(通常包括网络套接字)。当其中任一描述符准备好进行读写操作时,系统会通知程序。这种机制在处理多个客户端连接时非常有效,避免了...
在Linux系统中,epoll是针对IO多路复用的一种高效实现,尤其适用于大规模并发连接的场景。以下是关于epoll的详细总结: 1. **基本概念** - **epoll** 是在Linux 2.6内核引入的,是对早期的`select`和`poll`函数的...
三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu
在Unix/Linux系统中,最常用的IO多路复用方法包括select、poll和epoll。本示例主要关注的是select函数的使用。 **一、select函数介绍** select函数是C语言中的一个标准库函数,定义在`<sys/select.h>`头文件中。它...
在Linux中,最常用的IO多路复用机制有`select()`、`poll()`以及`epoll()`。其中,`epoll`是更为高效的选择,因为它具有更好的可扩展性和性能。 在实现TCP echo服务器时,首先需要创建一个监听套接字,然后使用`...
`epoll`提供了`select()`、`poll()`等IO多路复用函数的增强版本。与`select`和`poll`相比,`epoll`具有更高的性能和可扩展性,因为它使用了内核事件通知机制,减少了不必要的系统调用和上下文切换。 在`epoll`模型...
三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu
select、poll和epoll是三种常见的IO多路复用器。select是一种基本的IO多路复用器,允许进程同时监听多个文件描述符,等待其中的一个文件描述符准备好。poll是一种改进的IO多路复用器,允许进程同时监听多个文件描述...
这两类都要使用到IO多路复用,O多路复用是指单个进程/线程就可以同时处理多个IO请求。有三个方式select、poll、epoll。 select:将文件描述符放入一个集合中,调用select时,将这个集合从用户空间拷贝到内核空间...
本文将深入探讨四种常见的IO复用机制:`select`、`poll`、`epoll`和`kqueue`,并结合源码分析如何在实际项目中应用它们。我们将通过分析`service.cpp`(服务端)和`client.cpp`(客户端)来理解这些机制的工作原理。...
在Unix/Linux系统中,常见的多路复用IO机制有以下几种: 1. **select**:这是最早出现的多路复用IO机制,它可以监视文件描述符集合,当任意一个描述符准备好时,select函数会返回。不过,select的缺点在于它有一个...
在Python中,常用的IO多路复用库有`select`、`poll`、`epoll`(适用于Linux)、以及` selectors`模块,这些库允许服务器同时处理多个连接,而无需等待任何一个阻塞的I/O操作完成。在这个项目中,服务器可能使用了`...
IO多路复用技术,如select、poll和epoll,提供了一种更为高效的方法。它们允许程序注册一组文件描述符,然后由操作系统内核来监控这些描述符的状态。当某些描述符准备就绪时,内核会通知应用程序。这种机制减少了...
`epoll` 是 Linux 内核提供的另一种高效的 IO 多路复用机制,它解决了 `select` 和 `poll` 的大部分问题,成为了现代 Linux 系统中首选的 IO 多路复用方法。`epoll` 的特点如下: - **平台支持度**:`epoll` 只在 ...