谈谈对epoll的理解

  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. 总结

    1. 不用将套接字(fd文件描述符)从程序复制到操作系统,而是直接将套接字放到公共空间(映射技术)
    2. 不是采用轮询的方式,而是采用事件通知的方式来接收套接字(客户端)发送的消息
    3. 也可以说是空间换取速度的一种表现
  6. 上面已经通俗的说了epoll为什么快的原因了,下面说些官方的实现原理

    1. epoll_create:在epoll文件系统建立了个file节点,并开辟epoll自己的内核高速cache区,建立红黑树(可以快速找到那个socket发送了消息),分配好想要的size的内存对象,建立一个list链表,用于存储准备就绪的事件。
    2. epoll_ctl:把要监听的socket放到对应的红黑树上,给内核中断处理程序注册一个回调函数,通知内核,如果这个scoket的数据到了,就把它放到就绪列表
    3. epoll_wait:观察就绪列表里面有没有数据,并进行提取和清空就绪列表,非常高效。
    4. 核心内容:红黑树,就绪列表,小段cache(我个人喜欢叫公共空间)
  7. fd(文件描述符):
    在这里插入图片描述
    由上面图片可以看出,fd就是一个标志,比如一个socket就是一个标志

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值