libevent c++高并发网络编程_高并发-网络I/O
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相关推荐
- libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解
前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...
- 陈硕《网络编程实战》01 网络编程概要
陈硕<网络编程实战> 01 网络编程概要 站在巨人的肩膀之上. 按照录像整理,部分专有名词不太肯定,版权归陈硕大神. 大家好,我是陈硕,受邀讲授一门有关网络编程的在线课程,这门课程的名称是 ...
- linux网络编程(一)网络基础传输知识
linux网络编程(一)网络传输基础知识 一.什么是协议? 二.使用步骤 典型协议 2.网络应用程序设计模式 C/S模式 B/S模式 优缺点 3.分层模型 4.TCP/IP四层模型 通信过程 5.协议 ...
- python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...
python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...
- 高并发编程_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...
不知道从什么时候起,在Java编程中,经常听到Java集合类,同步容器.并发容器,高并发编程成为当下程序员需要去了解掌握的技术之一,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理 ...
- 西工大java高级网络编程_西工大16春《JAVA高级网络编程》平时作业
西工大16春<JAVA高级网络编程>平时作业 7 o& [9 w ^# D Z一.单选题:[25道,总分:100分]5 z# ?* Z! M% M1 h4 R# n. D+ a ...
- 5_异常_多线程_设计模式_IO流_网络编程_反射
JavaSE_第五周 异常 异常的概念 什么是异常 概念 概念:程序在运行过程中出现的特殊情况异常-----通过Jvm将异常的信息打印在控制台---告诉开发者(当前程序在某个环节出现了哪些问题!) 异 ...
- 西工大java高级网络编程_奥鹏西工大16春《JAVA高级网络编程》平时作业
西工大16春<JV高级网络编程>平时作业 一.单选题(共 25 道试题,共 100 分.) 1. 假设以tomt为w服务器,在hllopp应用中有一个hllo.jsp,它的文件路径如下: ...
- 99 网络编程_网络工程师技能图谱,看看你会多少技能
技术推动了时代变革,互联网则加速了这场变革.在蓬勃发展的互联网浪潮下,网络作为基础设施的关键纽带保障着网路流量的顺利流通,维持着赛博世界的繁荣.而在这繁荣之下,生存着这样一个群体--网络工程狮,为网络 ...
- TCP/IP网络编程_第6章基于UDP的服务器端/客户端
6.1 理解 DUP 我们在第4章学习TCP的过程中, 还同时了解了 TCP/IP 协议. 在4层TCP/IP模型中, 上数第二层传输(Transport)层分为TCP和UDP这两种. 数据交换过程可 ...
最新文章
- 一款实用可行的支付系统,专供互联网企业使用,赶紧收藏了!
- 好久没来了,发个招聘贴
- 关于多层html标签嵌套引起CSS冲突问题的解决。
- 十月多媒体技术人聚会北京 LiveVideoStackCon 2018开启讲师/出品人招募
- python数据库连接信息加密_python实现对服务器脚本敏感信息的加密解密功能
- mysql not in 转化_解析MySQL隐式转换问题
- 在用JAVA写一个简易CAD程序时的笔记
- 一句话告诉你为什么有些jQuery插件会有特殊字符(加号、减号、感叹号等)
- 软件项目量化管理(CMMI高成熟度)实践经验谈——之项目管理过程策划篇
- 1548 A Simple Problem with Integers
- 超体故事:写作,我想少一些功利多一点真诚
- 5V转3V的降压芯片和LDO
- 基于MATLAB的图像处理程序
- 这种股权结构一定要远离!
- Kmeans聚类③——Kmeans聚类原理轮廓系数Sklearn实现
- 软件企业成本管理及工时管理调查表
- 宇视警戒球设备双向对讲功能配置指导
- 萌新初学java,自己写的剧本,求大佬帮忙纠正下语法上的错误,能让内容更完善些代码量更少些
- 服装ERP应用 六 ERP--防窜货管理的杀手锏
- ExoPlayer实现倍速播放功能
热门文章
- python 把当前目录文件夹中的所有图片缩放为640*480
- 20200714每日一句
- 190808每日一句
- 190707每日一句,一堂重要的人生之课Let it go, 穷则变变则通
- Atitit 提升扩展性bpmn艾提拉总结 工作流 目录 1.1. 尽管BPMN 1.1全面地处理了过程建模符号,但它实质上缺少解决交换格式(用于图交换)的问题	1 1.2. BPMN 2.0中使
- Atitit eclipse tomcat插件常见问题总结.docx 1.1. tomcat插件调整内存设置在 run run cfg 配置页。。Debug模式共享相同设置	1 1.2. Pub
- atitit ui引擎之道 游戏引擎之道.docx 1. 概念	2 1.1. (cocos,createjs,dom)	2 2. 游戏引擎的构成(图形引擎(渲染系统),控件部件系统,事件系统 ,布局
- Atitit 手机图片备份解决方案attilax总结
- atitit 图像处理机器视觉专业博硕连读课程表.xlsx
- Atitit.跨语言数据库db api兼容性 jdbc odbc ado oledb 增强方案