muduo网络库安装与简介

599 阅读4分钟

一、 muduo库编译安装和源码简介

muduo库底层实际上就是epoll+linux的pthread线程库,所以它只能装在Linux的环境当中,它还依赖boost库,boost库是用C++写的非常强大的开源库。

1.boost库安装

参考博客

linux上安装boost:

  • 执行wget https://boostorg.jfrog.io/artifactory/main/release/1.69.0/source/boost_1_69_0.tar.gz下载boost库 image.png
  • 解压tar包tar -zxvf boost_1_69_0.tar.gz
  • tar解压完成后,进入源码文件目录,查看内容: image.png
  • 运行bootstrap.sh工程编译构建程序,需要等待一会儿,查看目录: image.png
  • 源码根目录下生成了b2程序,运行b2程序如下(boost源码比较大,这里编译需要花费一些时间):
    【注意】:如果Linux系统没有安装g++编译器,需要先安装g++,建议g++4.6版本以上,能比较好的支持C++新标准,可以通过命令g++ --version查看g++版本号。 image.png
  • 编译完成后,会有如下打印: image.png
  • 最后,再把上面的boost库头文件和lib库文件安装在默认的Linux系统头文件和库文件的搜索路径下,运行下面命令(因为要给/usr目录下拷贝文件,需要先进入root用户):sudo ./b2 install
  • 安装完成后,最后会有如下信息打印出来: image.png
  • 验证安装boost是否成功,通过下面的代码验证一下:
#include <iostream>
#include <boost/bind.hpp>
#include <string>
using namespace std;

class Hello
{
public:
	void say(string name) 
	{ cout << name << " say: hello world!" << endl; }
};

int main()
{
	Hello h;
	auto func = boost::bind(&Hello::say, &h, "zhang san");
	func();
	return 0;
}
  • 通过g++编译上面的代码,运行打印如下 image.png 到这里我们Linux下的boost库安装成功

2. # Linux平台下muduo网络库源码编译安装

参考博客

二、muduo网络库简介

1. muduo网络库底层

我们在Linux上开发程序用到最多的第三方库就是libevent和muduo网络库,实际上它们都是支持epoll+线程池的基于多路I/O复用的网络模型,性能非常强大。

不管是C++还是java里面的网络库,做到高并发基本上都是这样设计:用muduo库来说,首先它有一个I/O线程,I/O线程里面有个epoll。

image.png

我们可以把它称作main Reactor(主反应堆),主要通过acceptor做新用户的链接(acceptor封装了I/O线程处理新用户链接的事件的类对象),链接上以后它会通过负载算法把这些链接分发给不同的工作线程

image.png

工作线程上的epoll是处理已连接用户的读写事件,I/O线程是专门做新用户链接的,一般线程的数量会和CPU的核数对等,这样就尽量做到高并发了。用I/O复用的好处就是一个线程可以监听多个套接字,尤其是对于链接量大而活跃量小(一般都是这样的场景),epoll有其非常大的性能优势。

在这个网络环境中,我们这样去设计,相当于epoll+线程池,工作线程都可以通过线程池来创建出来,这就是muduo网络库底层实现

如果说每一个工作线程的epoll所监听的已连接用户要做比较耗时的操作,比如传文件、视频、音频,那就需要单独开一个线程来做耗时的I/O操作,如果你还是在同样的工作线程(epoll线程)上去处理比较耗时的I/O操作,那么当前这个epoll就可能无法及时处理其他依然注册在这个epoll上的读写事件了。

image.png

2. muduo中的Reactor模型

reactor和preactor是我们网络中常用的高性能网络模型。
维基百科对reactor模型的解释:反应器设计模式是用于处理服务请求的事件处理模式由一个或多个输入并发地交付给服务处理程序。服务处理程序然后将传入的请求解复用,并将它们同步地分发到相关的请求处理程序。可以看出如下关键点:

  • 事件驱动(event handling)
  • 可以处理一个或多个输入源(one or more inputs)
  • 通过Service Handler同步的将输入事件采用多路复用分发给相应的Request Handler处理

image.png muduo库上有一个acceptor对象封装了I/O线程处理新用户链接的事件的类对象,然后通过负载算法分发到不同的子反应堆,自反应堆再进行读写、编码、解码。