1. 首先我们要知道epoll是用来干什么的(定义):epoll是一种IO多路转接技术,在LINUX网络编程中,经常用来做事件触发,即当有特定事件到来时,能够检测到,而不必阻塞进行监听,基于事件驱动的IO多路复用技术(通俗来说,就是来监听系统有没有什么事件发生,这个事件可以是socket,也可以是数据的读取等)

  2. 既然我们要说epoll了,那么我们就要知道select poll,我们通过这两中技术与epoll进行比较讲解,首先我们就已scoket说下select。

  3. select: 假设我们有一个服务器,服务器每条有好多客户端链接 我们把客户端称为socket 我们把连接上的socket都用fd标识上 哪我们服务器是怎样来判别客户端发送过来消息没 其实我们都是交给我们的操作系统(操作系统的内存分为两部分 一部分是操作系统的内存空间 用来运行操作系统 另一个分配给我们的app(跑在操作系统上的服务器)的空间 )来给我们识别客户端发又没有发送过来数据 所以 我们都是将socket在服务器复制一份来交给操作系统 由操作系统来给我们判别 如果发送了 就告诉我们服务器 好 这个socket发送消息了 你接收吧 假设这一天我们服务器有1000个客户端链接(我们已经将连接上的客户端用文件描述符用数字1-1000来标识了 放到一个列表中) 我们就要不停的使用轮询法将第一个socket的文件描述符复制给操作系统 然后操作系统给你判断一下 然后你就再把第二个复制给操作系统来判断 一直到1000个 然后再重来 这就是轮询法 如果操作系统判断客户端发送消息了 服务器就接收消息 和客户端交互 如果操作系统发现没有发送消息 就给服务器返回一个异常 你想啊 复制来 复制去 时间全给浪费了 这就是先前的select()的缺点 而poll() 比select() 好一点 就是使用链表来保存文件描述符 那就不用受限制了 还可以多链接一点客户 但是 还是采用轮询法 还是复制 总体来说 还是慢(为什么要复制 因为操作系统的运行空间和服务器的运行空间不再一块啊 )

  4. epoll的优点:而epoll创建一个对象 对象就是一个空间 这个空间称为公共空间(缓冲区) 就是操作系统可以用 服务器也可以用 那样我们服务器就不用再复制fd给操作系统了, 第二点 就是由于socket也在操作系统的空间中 操作系统在一直的运行 客户端一发送消息 操作系统就知道是那个socket发送消息了 然后操作系统就以事件通知的方法告诉服务器 那个客户端发送消息了 服务器就能和客户端交互了 就不使用轮询法了 这样效率就会更快了 这就是epoll 的特点

  5. 总结:

  • 不用将套接字(fd文件描述符)从程序复制到操作系统,而是直接将套接字放到公共空间(映射技术)
  • 不是采用轮询的方式,而是采用事件通知的方式来接收套接字(客户端)发送的消息
    也可以说是空间换取速度的一种表现
  1. 上面已经通俗的说了epoll为什么快的原因了,下面说些官方的实现原理:
  • epoll_create:在epoll文件系统建立了个file节点,并开辟epoll自己的内核高速cache区,建立红黑树(可以快速找到那个socket发送了消息),分配好想要的size的内存对象,建立一个list链表,用于存储准备就绪的事件。
  • epoll_ctl:把要监听的socket放到对应的红黑树上,给内核中断处理程序注册一个回调函数,通知内核,如果这个scoket的数据到了,就把它放到就绪列表
  • epoll_wait:观察就绪列表里面有没有数据,并进行提取和清空就绪列表,非常高效。
    核心内容:红黑树,就绪列表,小段cache(我个人喜欢叫公共空间)
  1. fd(文件描述符):


由上面图片可以看出,fd就是一个标志,比如一个socket就是一个标志

参考文章:谈谈对epoll的理解

epoll(eventpoll)是干嘛的?IO多路转接技术(相较select、poll的优点)相关推荐

  1. 网络编程(三)TCP IO多路转接服务器编程(select)

    同系列文章: 1, 文章目录 一,select知识引入 二,select基本概念 2.1 select概念理解前先总结一下通信过程(便于后文理解select) 2.2 select函数的用法 2.2. ...

  2. IO多路转接之epoll

    IO多路转接之epoll 文章目录 IO多路转接之epoll 一.epool 二.基于epoll实现服务器(LT) 三.**基于epoll实现服务器(LT)** 一.epool 是为处理大批量句柄而作 ...

  3. IO多路转接模型-----epoll

    epoll: Linux下性能最高的多路转接模型 epoll 有3个相关的系统调用. epoll_create 功能:创建epoll,在内核中创建eventpoll结构体,size决定了epoll最多 ...

  4. IO多路转接 ——— select、poll、epoll

    文章目录 I/O多路转接之select select初识 select函数 socket就绪条件 select基本工作流程 select服务器 select的优点 select的缺点 select的适 ...

  5. select poll epoll 高效IO 多路转接

    目录 五种常见IO模型 高效IO的概念 阻塞 vs 非阻塞 非阻塞IO fcntl函数 I/O多路转接之select 初识select select函数原型 select操作接口 tcp_server ...

  6. IO多路转接模型----(select的模型,select的优缺点,poll的模型,poll的优缺点)

    IO多路转接模型:select/poll/epoll 对大量描述符进行事件监控(可读/可写/异常) select模型 用户定义描述符的事件监控集合 fd_set(这是一个位图,用于存储要监控的描述符) ...

  7. 高级IO--1 ---(五种典型IO,阻塞IO,非阻塞IO,信号驱动IO,异步IO, IO多路转接)

    高级IO: 五种典型IO: 阻塞IO/非阻塞IO/信号驱动IO/异步IO/IO多路转接 IO多路转接模型:select/poll/epoll 五种典型IO 阻塞IO IO操作的流程:等待IO操作条件具 ...

  8. IO多路转接之poll

    IO多路转接之poll 文章目录 IO多路转接之poll 一.Poll 一.Poll 1.函数原型: int poll(struct pollfd *fds, nfds_t nfds, int tim ...

  9. Linux C语言IO多路转接select函数

    动态数组的实现与前面代码相同,下面是主函数 #include <netdb.h> #include <stdio.h> #include <sys/socket.h> ...

最新文章

  1. BIG DATA 大数据时代来临
  2. 【天池直播】图像系列直播第一讲--带你入坑深度学习
  3. Pwntools---fmtstr_payload()介绍
  4. springboot(2.2.4)全局异常处理(RestControllerAdvice,ExceptionHandler)
  5. POJ 2456 - Aggressive cows(二分)
  6. 阿里云 ECS服务器 开放 8080 端口 -- 图解
  7. java中局部内部类_Java内部类详解--成员内部类,局部内部类,匿名内部类,静态内部类...
  8. impdp使用network_link导入
  9. 利用日志传送来实现数据库的可用性
  10. 服务器mstsc远程桌面,远程桌面工具,详细教您如何使用远程桌面工具mstsc连接远程桌面...
  11. 分享一套比较全的Java技术栈,值得参考!
  12. sagemath_同余运算总结
  13. jpg如何缩小kb?jpg图片压缩怎么弄?
  14. Excel 表格数据去重
  15. 商品库存清单案例java_JAVA实现简单的商城库存清单
  16. MM-DD-RRRR / MM-DD-YYYY 的区别 (Date format)
  17. java计算机毕业设计物流站环境监测系统源码+系统+数据库+lw文档+mybatis+运行部署
  18. ad7606与stm32连接电路介绍
  19. 深入浅出CChart 每日一课——快乐高四第五十七课 新的起点,炫彩界面库之老树新芽
  20. MTK平台apnspn的配置

热门文章

  1. 关于owa over https的邮箱加密访问
  2. 如何删除有病毒的网站?
  3. php 直接定义 和 construct,PHP _construct()函数讲解
  4. 2 数据源配置_Quick BI支持哪些数据源(配置操作篇)
  5. 【MM配置】Inventory Management 库存管理
  6. 入门SAP PP的学习流程
  7. Field XXXX input value is longer than screen field-BDC
  8. 物料帐结算,库存差异为何在下月初冲回
  9. SAP中各种分摊分配方法
  10. SAP最大命中数的修改