`

Linux IO 多路复用 之 epoll 与 select/poll 简介

阅读更多

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

 

分享到:
评论

相关推荐

    网络io与io多路复用select/poll/epoll 服务器并发代码实现

    网络io与io多路复用select/poll/epoll 服务器并发代码实现

    linux内核select/poll,epoll实现与区别

    select,poll,epoll都是多路复用IO的函数,简单说就是在一个线程里,可以同时处理多个文件描述符的读写。 select/poll的实现很类似,epoll是从select/poll扩展而来,主要是为了解决select/poll天生的缺陷。 epoll在...

    IO多路复用之epoll——完整代码

    三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu

    IO多路复用之poll——完整代码

    三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu

    IO多路复用之select_poll_epoll详解1

    2. Re:络通信 --> IO多路复之sel 3. Re:络通信 --> IO多路复之sel 3. 络通信 --> IO多路复之selec 4. 数据库 --

    IO多路复用之select——完整代码

    三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu

    本项目包括利用多线程、select、poll以及epoll实现的并发处理连接请求

    这两类都要使用到IO多路复用,O多路复用是指单个进程/线程就可以同时处理多个IO请求。有三个方式select、poll、epoll。 select:将文件描述符放入一个集合中,调用select时,将这个集合从用户空间拷贝到内核空间...

    IO多路复用之epoll全面总结(必看篇)

    epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件...

    linux 下 select 编程 librtspserver

    linux 下 select 编程 我们知道 select 是IO 多路复用的一个最简单支持,poll 和 epoll 是 select 的升级版。在 UNIX 网络编程第五章读书笔记 我们遇到这样一个问题:当客户端阻塞在 fgets() 等待客户输入的时候,...

    利用epoll编写echo客户端/服务器

    epoll是Linux内核为处理大批量文件描述符而作了改进的epoll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

    udp多路IO模型.zip

    select,poll,epoll都是IO多路复用的机制,可以监测多个描述符,当某个或多个描述就绪,能够通知程序进行相应的读写行为。本demon是基于linux下udp通信实现,源码包括select、poll、epoll模型的udp服务端代码。

    特征:1、跨平台(Linux, Windows, MacOS, Solaris)2、高性能事件循环.rar

        在类unix系统中有五大I/O模型,依次为阻塞IO(BIO)、非阻塞IO(NIO)、IO多路复用(linux下有select、poll、epoll三种方案)、信号驱动IO、异步IO(前面四种都是同步IO),本文主要介绍常用的C的IO库,几乎都是...

    select poll epoll 代码实例

    select poll epoll 代码实例

    IO复用:select,poll,epoll,kqueue的详细例子

    源码详解文章地址 https://blog.csdn.net/yadoufeng/article/details/130443058?spm=1001.2014.3001.5502

    IO复用之select poll epoll的总结(推荐)

    下面小编就为大家带来一篇IO复用之select poll epoll的总结(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    基于select、poll、epoll的区别详解

    linux提供了select、poll、epoll接口来实现IO复用,三者的原型如下所示,本文从参数、实现、性能等方面对三者进行对比。 代码如下: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, ...

    优于select的epoll1

    1. 实现IO复用的传统方法select和poll,但是性能不满意,因此有Linux的epoll,BSD的kqueue,Solaris的/dev/poll,Wi

    linux epoll机制详解

    在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序。在linux新的内核中,有了一种替换它的机制,就是epoll。 select()和poll() IO多路复用模型 select的...

    epoll学习实例

    epoll学习实例,epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是...

Global site tag (gtag.js) - Google Analytics