Mudo C++网络库第六章学习笔记
muduo网络库简介
- 高级语言(Java, Python等)的Sockects库并没有对Sockects API提供更高层的封装, 直接用它编写程序很容易掉到陷阱中;
- 网络库的价值还在于能方便地处理并发链接;
网络核心库
- muduo是基于Reactor模式的网络库, 其核心是个事件循环EventLoop,用于响应计时器和IO事件;
- muduo采用基于对象(object-based)而非面向对象(object-oriented)的设计风格;
网络附属库
- 网络库有一些附属模块, 它们不是核心内容, 在使用的时候需要链接相应的库;
- 使用muduo库而言, 只需要掌握5个关键类:Buffer,EventLoop, TcpConnection, TcpClient, TcpServer;
线程模型
- muduo的线程模型符合one loop per thread + thread pool模型;
- 每个线程最多有一个EventLoop, 每个TcpConnection必须归某个EventLoop管理, 所有的IO会转移到这个线程;
- ThreadPool, 新到的链接会按round-robin方式分配到线程池中;
- muduo库的核心是每个IO线程一个事件循环, 把IO事件分发到回调函数上;
- 希望muduo库能减少网络编程中的偶发复杂性(accidental complexity);
- 基于事件的非阻塞网络编程是编写高性能并发网络服务程序的主流模式;
- 大量用到了回调函数的思想;
- TCP网络编程最本质是处理三个半事件:
- 连接的建立, 包括服务器端接受(accept)新链接和客户端成功发起(connect)链接; TCP连接一旦建立, 客户端和服务端是平等的, 可以各自收发数据;
- 连接的断开, 包括主动断开(close, shutdown)和被动断开(read返回0);
- 消息到达, 文件描述符可读; 这是最重要的一个事件, 对它的处理方式决定了网络编程的风格(阻塞还是非阻塞, 如何处理分包, 应用层的缓冲如何设计, 等等);
- 消息发送完毕, 这个算半个; 对于低流量的服务, 可以不必关心这个事件; 另外, 这里的发送完毕是指数据写入操作系统的缓冲区, 将由TCP协议栈负责数据的发送与重传, 不代表对方已经收到了数据;
- echo 服务器的实现:
- muduo的使用非常简单, 不需要从指定的类派生, 也不用覆写虚函数, 只需要注册几个回调函数去处理三个半事件就行了;
- echo服务器的业务逻辑就是把收到的数据原封不动地发回客户端;
- 程序主体是被动等待事件发生, 事件发生之后网络库会调用(回调)事先注册的事件处理函数(event handler);
- 七步实现finger服务
- Python Twisted是一款非常好的网络库, 它也是采用的Reactor作为网络编程的基本模型, 所以从使用上与muduo颇有相似之处(muduo没有deferreds);
- finger是Twisted文档中一个经典的例子, muduo来实现最简单的finger服务端;
- 大佬的muduo学习笔记;
- finger(端口79)是互连网上最古老的协议之一, 用于提供站点及用户的基本信息, 一般通过finger服务,你可以查询到站点上的在线用户清单及其他一些有用的信息;
- finger服务是基于客户/服务器模式的,目标机上通常有一个fingerd的服务器程序(在unix中,被称为finger守护进程);
- 而finger返回的结果是由这个进程决定的,使用或自己编些不同的进程,可以提供各种各样的finger服务;
- 性能评测
- 在muduo库擅长的领域(TCP长连接), 其性能不比任何开源网络库差;
- muduo最开始并没有以高并发、高吞吐为主要目标;
- ping pong 测试表明:
- muduo的吞吐量比Boost.Asio高15%;
- muduo的吞吐量比libevnet2高18%;
- muduo与Nginx的吞吐量对比
- 对比内置的简陋的HTTP服务器的长连接性能;
- 直接返回内存中的数据, 比较程序的网络性能;
- qps(每秒请求数)都能超过10万;
- muduo与ZeroMQ的延迟对比;
- muduo的延迟稳定的低于ZeroMQ;
- ping pong 测试表明:
- 详解muduo库多线程模型
- 以一个sudoku solver为例, 一个求解数独的服务器程序;
- 从网络连接读入一个sudoku题目, 算出答案, 再发回给客户端;
- 怎么做才能发挥多核硬件的能力;
- 一个简单的以'\r\n'分隔的文本行协议, 使用TCP长连接, 客户端在不需要服务时主动断开连接;
- 正确使用non-blocking IO需要考虑的问题很多, 不适宜直接调用Sockect API, 而需要一个功能完善的网络库支撑;
- 目前高性能httpd普遍采用的是单线程Reactor方式;
- reactors+thread pool是最灵活的IO与CPU配置;
- 通常由网络库负责读写socket, 用户代码负责解码、计算和编码;
- C++多线程服务器编程模式为: one loop per thread + thread pool
- event loop 用作non-blocking IO 和定时器;
- thread pool用来做计算, 具体可以是任务队列或生产者消费者队列;
Mudo C++网络库第六章学习笔记的更多相关文章
- Mudo C++网络库第十一章学习笔记
反思C++面向对象与虚函数 C++语言学习可以看<C++ Primer>这本书; 在C++中进行面向对象编程会遇到其他语言中不存在的问题, 其本质原因是C++ class是值语义, 而非对 ...
- Mudo C++网络库第四章学习笔记
C++多线程系统编程精要 学习多线程编程面临的最大思维方式的转变有两点: 当前线程可能被切换出去, 或者说被抢占(preempt)了; 多线程程序中事件的发生顺序不再有全局统一的先后关系; 当线程被切 ...
- Mudo C++网络库第三章学习笔记
多线程服务器的适用场合与常用编程模型 进程间通信与线程同步; 以最简单规范的方式开发功能正确.线程安全的多线程程序; 多线程服务器是指运行在linux操作系统上的独占式网络应用程序; 不考虑分布式存储 ...
- Mudo C++网络库第七章学习笔记
muduo编程示例 muduo库是设计来开发内网的网络程序, 它没有做任何安全方面的加强措施, 如果在公网上可能会受到攻击; muduo库把主动关闭连接这件事分成两步来做: 如果主动关闭连接, 会先关 ...
- Mudo C++网络库第五章学习笔记
高效的多线程日志 日志(logging)有两个意思: 诊断日志(diagnostic log), 常用日志库提供日志功能; 交易日志(transaction log), 用于记录状态变更, 通过回放日 ...
- Spring实战第六章学习笔记————渲染Web视图
Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...
- 《Linux命令行与shell脚本编程大全》 第十六章 学习笔记
第十六章:创建函数 基本的脚本函数 创建函数 1.用function关键字,后面跟函数名 function name { commands } 2.函数名后面跟空圆括号,标明正在定义一个函数 name ...
- 网络库Alamofire使用方法学习笔记
Github地址 由于Alamofire是swift网络库,所以,以下的所有介绍均基于swift项目 导入Alamofire 以下为使用cocoapods导入,其余的方式请参考官网 source 'h ...
- apue第六章学习总结
apue第六章学习总结 1.关于阴影文件与口令 在口令文件当中,常见的字段有(以root为例): root(用户名):x(加密口令):0(uid):0(gid):root(注释字段):/root(用户 ...
随机推荐
- Hadoop记录-技术网站
Grafan监控:http://docs.grafana.org/ Tez:http://tez.apache.org/install.html 阿里巴巴镜像:https://opsx.alibaba ...
- C#多线程和异步(二)——Task和async/await详解
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
- python+selenium 模拟登陆,自动下单
目前写的实在太粗糙,留着,以后来写上
- git个人学习总结
什么是git 代码管理工具,分布式管理,每个人电脑都是一个完整的版本库.并且有中央服务器(gitHub,gitLab)提供代码交换修改 git基础概念 工作区:自己的项目(有一个隐藏目录 " ...
- Information Retrieval 倒排索引 学习笔记
一,问题描述 在Shakespeare文集(有很多文档Document)中,寻找哪个文档包含了单词“Brutus”和"Caesar",且不包含"Calpurnia&quo ...
- vue.cli 中使用 less 来写css样式
vue-cli 的webpack中已配置了less,但 package.json 中没有选项,为了方便开发中使用,需安装一下: 安装方式一: npm install less less-loader ...
- 三十四、Linux 进程与信号——信号特点、信号集和信号屏蔽函数
34.1 信号特点 信号的发生是随机的,但信号在何种条件下发生是可预测的 进程杠开始启动时,所有信号的处理方式要么默认,要么忽略:忽略是 SIGUSR1 和 SIGUSR2 两个信号,其他都采取默认方 ...
- mysql 创建存储过程
mysql 创建存储过程 实例一: CREATE PROCEDURE cp_test() BEGIN declare a int; declare b int; ; ; select a,b; END ...
- 洛谷P1972 【[SDOI2009]HH的项链】
这道题想了很久,发题解是为了理解的更深刻一点...(管理放我过好嘛qwq) 步入正题:这道题应该是很多做法,我选择的是离线+树状数组. 首先输入数组.用fisrt数组先记录元素最开始出现的位置,对应的 ...
- Kaldi中的L2正则化
steps/nnet3/train_dnn.py --l2-regularize-factor 影响模型参数的l2正则化强度的因子.要进行l2正则化,主要方法是在配置文件中使用'l2-regulari ...