当前位置: 首页 > news >正文

阿克苏地区网站建设_网站建设公司_VS Code_seo优化

网站建设与制作区别,青岛网站建设方案服务,软件开发培训学校porin,网站做不做百度云加速Posted on: Nov 26 2015 Categories: muduo C Tags: muduo 一般写服务端程序都需要有一个称手的网络库来帮我们处理琐碎的网络通信细节#xff0c;比如连接的建立、关闭#xff0c;读取数据#xff0c;发送数据#xff0c;接收、发送缓冲区的管理等#xff0c;常用的C/C网…Posted on: Nov 26 2015 Categories: muduo C Tags: muduo 一般写服务端程序都需要有一个称手的网络库来帮我们处理琐碎的网络通信细节比如连接的建立、关闭读取数据发送数据接收、发送缓冲区的管理等常用的C/C网络库有libeventasiolibev我们项目组使用的是muduo网络库。muduo是陈硕写的基于非阻塞IO和事件驱动的现代C网络库原生支持one loop per thread模型(即reactor模型)它适合开发Linux下的面向业务的多线程服务端网络应用程序。在Linux上muduo的性能(吞吐量、高并发下的事件处理效率)比其它网络库都要好编程接口也很友好它使用了很多Boost C的现代特性(比如用RAII来管理资源用function/bind来代替虚函数作为库的回调接口借助shared_ptr实现线程安全的对象回调等)代码写得很精练简洁而且源代码中附带有很多例子程序是学习网络编程的很好范例值得细细品读。 我从进项目组开始花了6个月时间把muduo相关的代码、例子程序、书都研究了一遍感觉受益非浅尤其是对处理网络通信的细节、异常处理了然于胸写起代码来很顺溜。现在大概总结下阅读muduo网络库的顺序。 Step 0 熟悉boost智能指针、function/bind的使用 在muduo库内部使用了boost::scoped_ptr,weak_ptr,shared_ptr来管理各个网络对象(channel,tcpconn,socket,acceptor, connector)的生命期尤其是TcpConnection是网络库和用户代码共有的当某个连接不需要时不能在用户代码中持有这个shared_ptr否则会造成资源泄漏。更重要的是在写代码时要学习、融入这种思想用智能指针来管理动态分配的资源。如果能正确使用智能指针在C代码中一般不需要出现delete语句。muduo中另一个重要的思想是用function/bind来封装回调函数。function对象类似于函数指针(不过它可以带状态即绑定一个类对象的成员函数)在发生某些事件时执行相关的回调函数。比如它连接断开、建立时会回调OnConnection()数据读完后会回调OnMessage。在用户代码中也可以模仿这种思想。 Step 1 熟悉muduo库的编译、安装使用 这个阶段主要摸熟muduo库的使用即使用它封装的接口来编写网络应用程序。多敲敲代码看书把example目录下的所有例子程序都做一遍这样差不多能处理常见的网络通信业务。然后考虑写更专业一点的网络服务程序这时候会考虑网络通信的消息格式怎么定心跳协议怎么定系统中 各个server如何分工如何交互、连接遇到些底层的网络bug怎么排查如何做性能调优 Step 2 阅读muduo网络相关的代码理解网络通信的各个细节 这个阶段主要研读muduo实现网络通信的各个细节(即net目录下的代码)。阅读时多参考陈硕著的《Linux多线程服务端编程》第8章。跟着书、代码走一遍基本就能理解muduo网络通信的原理了。这个时候基本上解答了所有step 1产生的疑问比如从建立连接、读数据、写数据、关闭连接的流程是怎么样的读写缓冲是是全局放一个还是每个连接放一个它的IO模型(即网络IO线程模型谁来epoll_wait谁来accept如何分配连接到子线程)是什么样的各个回调函数是处于主线程还是子线程的语镜中Connector主动发起连接要考虑哪些细节 这个阶段就两个任务 理解muduo处理网络通信的流程各种事件发生的时机。muduo对各种网络异常的处理。 最后要能够达到在各种环境下遇到网络问题能够定位问题出在哪里。 Step 3 阅读muduo线程库定时器runInLoop实现 muduo的线程库封装了一些常用的多线程设施比如thread,条件变量锁countDownLatch线程池线程私有变量BlockingQueue等。没有boost thread库提供得多但是也足够用了。有些东西封装得挺有特色可以看看。定时器和runInLoop几乎是所有网络库的标配。muduo中定时器实现得较简单(用stl::set来存放所有timer)用timerfd来获取定时事件的到来。具体可参考《Linux多线程服务端编程》第8.2节。runInLoop很有特色、很重要它可以将一个线程的某些操作 转到 另一个线程来做这样可以使很多非线程安全的函数变成线程安全的(比如定时器操作)也可以将某些耗时的操作异步化(比如可以将数据库写操作放到另一个线程处理)。具体实现中会将一个function对象绑定到另一个loop io线程的待执行列表中loop io线程处理完所有网络事件、定时器事件后就会执行所有绑定的function。里面用到了eventfd来通知那个线程有待执行的funcion了。 可以看出muduo使用了socket fd(网络IO事件), timerfd(定时器到来事件), eventfd(通知事件), signal fd(信号到来事件)来处理相关的所有事件只需一个epoll循环整个程序的处理流程很清晰简洁。 Step 4 阅读muduo日志库 muduo日志库的代码不多很容易阅读。读的时候可参考《Linux C多线程服务端编程》第5章走一遍大概能理解它的流程。阅读的时候主要学习两点 从需求、现有的硬件等限制学习如何设计并实现一个合格的日志库 需求分为功能需求、性能需求。 功能需求主要考虑: 接口设计是否合理、易用需要支持哪些功能muduo日志库的设计原则是尽量提供最精简的日志设施不必要的就不提供。封闭的接口尽量便于程序员阅读、查错。性能需求考虑单位时间内可写入的最大日志量且要求它不会阻塞正常的业务处理流程。muduo的设计原则性能只需要“足够好”即能达到现代硬盘的最大写入带宽即可。且在实现时要考虑减少多线程的锁争用尽量不阻塞正常的业务处理逻辑。如何做异常处理、性能调优 日志库的实现逻辑基本大同小异逻辑基本是在各个业务线程中拼装日志串然后将日志串存入一个Buffer访问时需要加锁另外有一个日志线程不停地从Buffer中取数据然后将它输出到日志文件中。实现的时候会考虑 Buffer如何设计什么时候唤醒日志线程从Buffer中取数据如何减少 业务线程、日志线程 访问Buffer时的锁竞争日志串如何组装才能使它组装速度足够快、且要兼顾接口设计的易用性要考虑线程间的竞争、写入速度等各种情况保证不会丢失每条日志串。什么时候切换写到另一个日志文件什么时候flush到日志文件若日志串写入过多日志线程来不及消费怎么办muduo日志库的性能很高大概可以达到每秒200多万条非常快。代码中做了很多性能调优比如实现了一个memory output stream来加快各种类型转换成字符串。利用线程私有变量缓存了一些变量值来加快日志串的组装。用双缓冲技术来减少线程之间的锁竞争、最大化一次性输出日志的吞吐量。阅读时注意每个优化细节然后在平时做性能调优时 模仿它。 Step 5 定制开发修改源码。借鉴某些组件的实现应用到自己的代码中 muduo网络库有很多功能不提供比如SSL加密配置业务线程的个数设置多个监听端口。在实际应用时可能根据需要来修改muduo库。我们项目组做的修改有 将各业务线程的个数、网络IO线程的个数、心跳线程的个数 等可配置化。 在实际应用中会根据业务特点来决定线程模型。有的时候会将一些耗时的操作比如操作mysql、压力大的操作单独配置一些线程来操作。 一个TcpServer支持多个监听端口。 在实际高并发服务的项目中一般都会有一个链接服务器来接受并管理所有的外部链接。同时它也需要与内部的server通信。这时候就需要监听两个端口号。为了编程的方便我们使muduo支持了一个TcpServer监听多个端口号。注也可以不修改可创建两个TcpServer每个TcpServer监听一个端口号。 TcpServer支持发起连接。 在实际项目中经常需要一个服务端程序作为一个server来接受别人的连接也需要主动发起一些连接到别的server上。为了编程的方便我们使支持了TcpServer既可以发起连接也可以接受连接。注也可以不修改创建单独的TcpServer来接受连接创建单独的TcpClient来发起连接。 在thirdpartServer中利用runInLoop、定时器的实现。 在我们的项目中有个server要与苹果的Apns服务通信而Apns只接受Ssl加密通信但是muduo不支持Ssl连接。当时考虑过修改muduo使之支持Ssl通信但是由于当时还不熟悉Ssl编程直接修改muduo会带来一些不必要的风险所以直接使用Linux上的原始函数、openSsl库来与Apns通信。通信时要用到定时器和runInLoop我就把muduo的这部分实现代码借鉴进来实现了这两个功能。
http://www.lebaoying.cn/news/114877.html

相关文章:

  • 网站验证码体验购物网站可以备案吗
  • 做羞羞的事的视频网站网站常见 8
  • 哪个协会要做网站建设啊网址大全下载安装
  • 关于政务网站建设的调查问卷根据网站开发app
  • 如何电话推销客户做网站新素材网站
  • 哈尔滨企业网站排名北京市朝阳区住房建设网站
  • 中国建设银行招聘网站首页wordpress自定义404页面
  • 设计师培训班多少钱长春关键词优化平台
  • 我要建设一个网站天津网站排名优化费用
  • 济南网站建设山东聚搜网力推织梦网站怎么做模板
  • 泰安专业的网络推广公司徐州网络优化招聘网
  • 网站开发工具哪个好铜仁市住房和城乡建设部网站
  • 武功县住房与城乡建设局网站看片代码 python
  • 用手机可以建设一个手机网站吗开发公司正式电未接通
  • 做青蛙网站wordpress 弹出 广告
  • 建立了网站后如何发贴最新手机排行
  • 网站开发分类小说网站采集可以做嘛
  • 免费建立微信网站系统建站
  • 上海机电设备公司网站建设中小企业网站设计与开发目的
  • 成都前几年网站建设公司工厂订单外发代加工外发加工网
  • phpwind 做的网站做网站用什么数据库
  • 网站建设的流程分析网站使用的数据库主要有哪些
  • 免费做效果图的网站有哪些wordpress 导航地图
  • 校园网站建设模板cdr软件
  • 手机商城手机网站建设多少钱上海浦东注册公司
  • 电影网站规划微信公众号网站建设
  • 池州网站公司网页如何发布
  • 顺义推广建站阿里网站建设需要准备什么软件
  • 做网站什么的好游戏网站开发公司
  • 顺义做网站同学嵌入式软件开发工资高吗