muduo网络库学习(1)

muduo网络库学习(1)


前言

本章节主要介绍muduo网络库的整体架构!

一、muduo是什么?

muduo是一款基于reactor的网络库,整个网络库采用oneloopperthread+threadpool的方法,代码简洁,性能优越·。

二、代码结构

1.base库

base库如下:

在这里插入图片描述

base库主要是分装了一些net中需要的调用,列如为net库提供高性能日志,线程封装,线程池封装等!

2.net库

net如下:
在这里插入图片描述

net部分使用base中的工具类实现更高层次的逻辑,网络编程无非是对socket和其使用的epoll/poll等进行封装,使其便于使用,屏蔽掉底层网络库的一些 “坑”, 在满足了基础的网络IO之后,就需要考虑高性能,高并发的问题,muduo 的是由poll/epoll 这些IO复用模型构成,但是单个IO线程在面对大量请求时难免处理不过来,所以就需要结合多线程或者线程池,一个线程对应一个epoll进行网络IO,这样就可以充分利用硬件多核系统。从软硬两方面综合提升性能。net部分封装的较为彻底,对上层提供的接口简单易用,所以涉及复杂的内部处理,接下来就对其内部实现进行探究。(图中灰色的类是内部类,白色的是外部类)

3.附属库

如下:

在这里插入图片描述

不是muduo库的核心,主要是对muduo库进行一些应用

二、网络库结构

在这里插入图片描述

其中灰色部分是用户不可见的,白色部分是用户可见的,黑色箭头代表着一对一关系,白色箭头代表着多对一关系,同时黑色箭头代表着后者控制前者的生存期。

EventLoop:是对时间循环的抽象

Poller是对IO复用的抽象,它有两个派生类PollPoller以及EpollPoller,分别封装了epoll和poll,这个是muduo唯一一个基于面向对象思想编写的类。EventLoop与Poller是组合关系,一个EventLoop包含一个poll,EventLoop控制Poller的生存期。EventLoop中的loop调用Poller中的poll函数进行实现。

Channel是对IO事件(对应一个套接字)的响应注册的封装,其中函数update()负责将IO事件通过EventLoop中的updateChannels–>poller中的updateChannels,从而实现了对IO事件的注册。其中handleEvent负责对IO事件中发生可读可写等事件进行处理。与EventLoop的关系:EventLoop对应着多个Channel对象。
Channel的生存期不由TcpConnection,Acceptor,Connctor等拥有channel的来控制,而不是由EventLoop来控制(EventLoop中包含着一个WakeupChannel,这个channel由Event Loop控制)。虽然Channel对应着一个文件描述符fd,但是文件描述符的生存期确实由Socket来控制。

Acceptor是被动连接的抽象,它包含了一个监听文件描述符对应的Channel,将这个Channel注册到Eventloop中一旦由可读事件到来,触发Channel的handleEvent从而回调了Acceptor中handleread()。

Connector是一个对主动连接的抽象,包含了一个主动发起连接文件描述符的Channel,注册了handleWrite,handleerror等!

TcpConnction是一个已连接的抽象,包含了一个标志着连接文件描述符的Channel,对改Channel注册了handleread,handlewrite,handleerror等!

TcpServer是对服务器的抽象,一个TcpServer对应着一个Acceptor,一个TcpsServer对应着多个TcpConnection。TcpServer控制Acceptor的生存期,但是不控制Tcpconnection的生存期(列如:TcpClient关闭连接同样会导致Tcpconnction的销毁)

TcpClient是对客户端的抽象,一个TcpClient对应着一个Connector,一个TcpClient对应着多个TcpConnection。TcpClient控制Connector的生存期,但是不控制Tcpconnection的生存期(列如:TcpServer关闭连接同样会导致Tcpconnction的销毁)

总结

` 牢记muduo是一个oneloop perthread +threadpool框架。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值