epoll(eventpoll)是干嘛的?IO多路转接技术(相较selectpoll的优点)

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了epoll(eventpoll)是干嘛的?IO多路转接技术(相较selectpoll的优点)相关的知识,希望对你有一定的参考价值。

  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多路转接技术(相较selectpoll的优点)的主要内容,如果未能解决你的问题,请参考以下文章

面试必问的epoll技术,从内核源码出发彻底搞懂epoll

MFC的App类是干嘛的?

HTML5是啥?具体是干嘛的?

javaFX是干嘛的

es封装工具是干嘛的

Zookeeper到底是干嘛的