epoll是怎么实现的?

Linux epoll机制是通过红黑树和双向链表实现的。 首先通过epoll_create()系统调用在内核中创建一个eventpoll类型的句柄,其中包括红黑树根节点和双向链表头节点。然后通过epoll_ctl()系统调用,向epoll对象的红黑树结构中添加、删除、修改感兴趣的事件,返回0标识成功,返回-1表示失败。最后通过epoll_wait()系统调用判断双向链表是否为空,如果为空则阻塞。当文件描述符状态改变,fd上的回调函数被调用,该函数将fd加入到双向链表中,此时epoll_wait函数被唤醒,返回就绪好的事件

epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT).在采用这两种模式时要注意的是,

1.如果采用ET模式,那么仅当状态发生变化时才会通知,(比如新的链接建立)

2.而采用LT模式类似于原来的select/poll操作,只要还有没有处理的事件就会一直通知.

补充说明一下这里一直强调的"状态变化"是什么:

1)对于监听可读事件时,如果是socket是监听socket,那么当有新的主动连接到来为状态发生变化;对一般的socket而言,协议栈中相应的缓冲区有新的数据为状态发生变化.但是,如果在一个时间同时接收了N个连接(N>1),但是监听socket只accept了一个连接,那么其它未 accept的连接将不会在ET模式下给监听socket发出通知,此时状态不发生变化;对于一般的socket,就如例子中而言,如果对应的缓冲区本身已经有了N字节的数据,而只取出了小于N字节的数据,那么残存的数据不会造成状态发生变化.

2)对于监听可写事件时,同理可推,不再详述.

以代码来说明问题:

首先给出server的代码,需要说明的是每次accept的连接,加入可读集的时候采用的都是ET模式,而且接收缓冲区是5字节的,也就是每次只接收5字节的数据:

#

下面给出测试所用的Perl写的client端,在client中发送10字节的数据,同时让client在发送完数据之后进入死循环, 也就是在发送完之后连接的状态不发生改变--既不再发送数据, 也不关闭连接,这样才能观察出server的状态:

#

运行server和client发现,server仅仅读取了5字节的数据,而client其实发送了10字节的数据,也就是说,server仅当第一次监听到了EPOLLIN事件,由于没有读取完数据,而且采用的是ET模式,状态在此之后不发生变化,因此server再也接收不到EPOLLIN事件了.
(友情提示:上面的这个测试客户端,当你关闭它的时候会再次出发IO可读事件给server,此时server就会去读取剩下的5字节数据了,但是这一事件与前面描述的ET性质并不矛盾.)

如果我们把client改为这样:

#!/usr/bin/perl  use IO::Socket;  my $host = "127.0.0.1";
my $port = 5000;  my $socket = IO::Socket::INET->new("$host:$port") or die "create socket error $@";
my $msg_out = "1234567890";
print $socket $msg_out;
print "now send over, go to sleep n";
sleep(5);
print "5 second gone send another linen";
print $socket $msg_out;  while (1)
{  sleep(1);
} 

基于这两个实验,可以得出这样的结论:ET模式仅当状态发生变化的时候才获得通知,这里所谓的状态的变化并不包括缓冲区中还有未处理的数据,也就是说,如果要采用ET模式,需要一直read/write直到出错为止,很多人反映为什么采用ET模式只接收了一部分数据就再也得不到通知了,大多因为这样;而LT模式是只要有数据没有处理就会一直通知下去的.

由此可见,水平触发时如果系统中有大量你不需要读写的就绪文件描述符,而它们每次都会返回,这样会大大降低处理程序检索自己关心的就绪文件描述符的效率,而边缘触发,则不会充斥大量你不关心的就绪文件描述符,从而性能差异,高下立见

libevent c++高并发网络编程_高并发-网络I/O相关推荐

  1. libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

  2. 陈硕《网络编程实战》01 网络编程概要

    陈硕<网络编程实战> 01 网络编程概要 站在巨人的肩膀之上. 按照录像整理,部分专有名词不太肯定,版权归陈硕大神. 大家好,我是陈硕,受邀讲授一门有关网络编程的在线课程,这门课程的名称是 ...

  3. linux网络编程(一)网络基础传输知识

    linux网络编程(一)网络传输基础知识 一.什么是协议? 二.使用步骤 典型协议 2.网络应用程序设计模式 C/S模式 B/S模式 优缺点 3.分层模型 4.TCP/IP四层模型 通信过程 5.协议 ...

  4. python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...

    python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...

  5. 高并发编程_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...

    不知道从什么时候起,在Java编程中,经常听到Java集合类,同步容器.并发容器,高并发编程成为当下程序员需要去了解掌握的技术之一,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理 ...

  6. 西工大java高级网络编程_西工大16春《JAVA高级网络编程》平时作业

    西工大16春<JAVA高级网络编程>平时作业 7 o& [9 w  ^# D  Z一.单选题:[25道,总分:100分]5 z# ?* Z! M% M1 h4 R# n. D+ a ...

  7. 5_异常_多线程_设计模式_IO流_网络编程_反射

    JavaSE_第五周 异常 异常的概念 什么是异常 概念 概念:程序在运行过程中出现的特殊情况异常-----通过Jvm将异常的信息打印在控制台---告诉开发者(当前程序在某个环节出现了哪些问题!) 异 ...

  8. 西工大java高级网络编程_奥鹏西工大16春《JAVA高级网络编程》平时作业

    西工大16春<JV高级网络编程>平时作业 一.单选题(共 25 道试题,共 100 分.) 1. 假设以tomt为w服务器,在hllopp应用中有一个hllo.jsp,它的文件路径如下: ...

  9. 99 网络编程_网络工程师技能图谱,看看你会多少技能

    技术推动了时代变革,互联网则加速了这场变革.在蓬勃发展的互联网浪潮下,网络作为基础设施的关键纽带保障着网路流量的顺利流通,维持着赛博世界的繁荣.而在这繁荣之下,生存着这样一个群体--网络工程狮,为网络 ...

  10. TCP/IP网络编程_第6章基于UDP的服务器端/客户端

    6.1 理解 DUP 我们在第4章学习TCP的过程中, 还同时了解了 TCP/IP 协议. 在4层TCP/IP模型中, 上数第二层传输(Transport)层分为TCP和UDP这两种. 数据交换过程可 ...

最新文章

  1. 一款实用可行的支付系统,专供互联网企业使用,赶紧收藏了!
  2. 好久没来了,发个招聘贴
  3. 关于多层html标签嵌套引起CSS冲突问题的解决。
  4. 十月多媒体技术人聚会北京 LiveVideoStackCon 2018开启讲师/出品人招募
  5. python数据库连接信息加密_python实现对服务器脚本敏感信息的加密解密功能
  6. mysql not in 转化_解析MySQL隐式转换问题
  7. 在用JAVA写一个简易CAD程序时的笔记
  8. 一句话告诉你为什么有些jQuery插件会有特殊字符(加号、减号、感叹号等)
  9. 软件项目量化管理(CMMI高成熟度)实践经验谈——之项目管理过程策划篇
  10. 1548 A Simple Problem with Integers
  11. 超体故事:写作,我想少一些功利多一点真诚
  12. 5V转3V的降压芯片和LDO
  13. 基于MATLAB的图像处理程序
  14. 这种股权结构一定要远离!
  15. Kmeans聚类③——Kmeans聚类原理轮廓系数Sklearn实现
  16. 软件企业成本管理及工时管理调查表
  17. 宇视警戒球设备双向对讲功能配置指导
  18. 萌新初学java,自己写的剧本,求大佬帮忙纠正下语法上的错误,能让内容更完善些代码量更少些
  19. 服装ERP应用 六 ERP--防窜货管理的杀手锏
  20. ExoPlayer实现倍速播放功能

热门文章

  1. python 把当前目录文件夹中的所有图片缩放为640*480
  2. 20200714每日一句
  3. 190808每日一句
  4. 190707每日一句,一堂重要的人生之课Let it go, 穷则变变则通
  5. Atitit 提升扩展性bpmn艾提拉总结 工作流 目录 1.1. 尽管BPMN 1.1全面地处理了过程建模符号,但它实质上缺少解决交换格式(用于图交换)的问题 1 1.2. BPMN 2.0中使
  6. Atitit eclipse tomcat插件常见问题总结.docx 1.1. tomcat插件调整内存设置在 run run cfg 配置页。。Debug模式共享相同设置 1 1.2. Pub
  7. atitit ui引擎之道 游戏引擎之道.docx 1. 概念 2 1.1. (cocos,createjs,dom) 2 2. 游戏引擎的构成(图形引擎(渲染系统),控件部件系统,事件系统 ,布局
  8. Atitit 手机图片备份解决方案attilax总结
  9. atitit 图像处理机器视觉专业博硕连读课程表.xlsx
  10. Atitit.跨语言数据库db  api兼容性 jdbc odbc ado oledb 增强方案