重写Muduo网络库项目
文章平均质量分 81
重写Muduo库,底层epoll+线程池,不再依赖于boost库,使用C++11智能指针,thread多线程完成Muduo库实现。
陈岂几真幸运
冲冲冲
展开
-
muduo 32 muduo各个类功能总结
处理accept,监听新用户连接,新用户连接响应以后,拿到和客户端通信的clientfd,打包成Channel,然后根据muduo库的轮询算法,找一个subloop,将Channel给到subloop,扔给subloop之前,需要将subloop唤醒一下(wakeupfd : 每loop都有一个wakeupfd ,他那个Linux的系统调用eventfd创建的,一个带有线程notify,即带有通知机制的fd),mainloop可以向subloop随便写。该项目自己重构的muduo库只支持epoll。原创 2023-09-10 20:21:59 · 184 阅读 · 0 评论 -
muduo 30 使用Apache Benchmark 压测分析
Apache Benchmark,通常称为 "ab",是一个用于测试 Web 服务器性能的工具。它是由 Apache HTTP 服务器项目提供的一个命令行工具。"ab" 工具可以你可以使用 "ab" 工具来评估一个 Web 服务器在不同负载情况下的性能表现。这对于测试服务器的并发处理能力响应时间吞吐量等指标非常有用。"ab" 工具提供了许多参数来配置测试,例如请求的总数、并发用户数、请求超时时间等。使用Apache Benchmark 对http服务器进行压测分析,测试网络库的并发处理能力。原创 2023-08-14 14:47:48 · 194 阅读 · 0 评论 -
muduo 31 timer定时器模块
其原因是因为set容器是一个有序队列,以<排序,就是说整个队列中,Timer的到期时间时从小到大排列的,正是因为这样,才能做到节省系统资源的目的。在muduo的定时器系统中,一共由四个类:Timestamp,Timer,TimeId,TimerQueue组成。1、EventLoop调用方法,加入一个定时器事件,传入定时器回调函数,超时时间和间隔时间(为0.0则为一次性定时器),addTimer方法根据这些属性构造新得定时器。内部实现的插入方法获取此定时器的超时时间,如果比先前的时间小就说明第一个触发。原创 2023-08-25 00:36:39 · 146 阅读 · 0 评论 -
muduo 29 异步日志
因为没有log消息要记录时,后端线程很可能阻塞等待log消息,当有缓冲满时,及时唤醒后端将已满缓冲数据写到磁盘上,能有效改善新能;否则,短时间内产生大量log消息,可能造成数据堆积,甚至丢失,而后端线程一直休眠(直到3秒超时唤醒)。原创 2023-08-13 00:26:27 · 1568 阅读 · 0 评论 -
muduo 28 项目总结
①:首先定义一个EventLoop对象,这个是mainloop②:创建一个地址,ip:127.0.0.1 、 port:8000③:调用EchoServer构造函数,1. 创建TcpServer;2.保留loop;3.设置两个回调函数;4.设置线程数(这个数量不包括baseloop)。很好的把网络代码和业务代码分离,我们只需要关注两个回调函数做什内容就好。④:调用start();⑤:启动主线程loop。1、构建TcpServer对象,同时包含了注册回调,设置底层线程的个数,和扩展。原创 2023-07-12 01:39:23 · 94 阅读 · 0 评论 -
muduo 27 项目测试
【代码】muduo 27 项目测试。原创 2023-07-11 14:20:43 · 68 阅读 · 0 评论 -
muduo 26 shell脚本编写
写一个shell脚本一键编译原创 2023-07-11 13:00:06 · 48 阅读 · 0 评论 -
muduo 25 TcpConnection
mainLoop通过acceptor获取一个新用户的连接后,把响应的sockfd,channel封装在TcpConnection中,通过轮询去交给subLoop。原创 2023-07-07 15:57:47 · 69 阅读 · 0 评论 -
muduo 24 Buffer缓冲区
mainLoop通过acceptor获取一个新用户的连接后,把响应的sockfd,channel封装在TcpConnection中,通过轮询去交给subLoop。原创 2023-07-07 15:56:07 · 117 阅读 · 0 评论 -
muduo 23 TcpServer
4. Poller监听到acceptorChannel_上有事件发生,通过acceptChannel_.setReadCallback(std::bind(&Acceptor::handleRead, this))中handleRead返回一个connfd,并且去执行newConnectionCallback_回调(由TcpServer::newConnection设置的)1. TcpServer构造函数,传入当前mainloop,当前InetAddress,当前服务器name,创建一个Acceptor;原创 2023-07-07 15:51:12 · 182 阅读 · 0 评论 -
muduo 22 Acceptor
通过setThreadNumber来设置底层的线程数量,一个IO线程(mainReactor)和多个工作线程(subReactor)原创 2023-07-06 11:05:29 · 53 阅读 · 0 评论 -
muduo 21 Socket封装fd
1. 通过构造函数,获取外面传进来的一个listenfd;2. bindAddress:绑定ip地址和端口,用户传入的;3. listen:监听4. accept:从监听队列中拿通信fd;5. shutdownWrite: 将写端关闭(Tcp通信是一个双向通信,每一段都可读可写)6.setTcpNoDelay:通过setsockopt更改Tcp的选项。原创 2023-07-06 00:39:53 · 60 阅读 · 0 评论 -
muduo 20 EventLoopThreadPool
事件线程池的概念,两个同容器:一个是所有线程 、 一个是EventLoopThread中的EventLoop指针。原创 2023-07-05 23:33:03 · 51 阅读 · 0 评论 -
muduo 19 EventLoopThread类
对EventLoop和thread的封装,一个线程中有一个loop,通过绑定器将其绑定。原创 2023-07-05 22:07:43 · 87 阅读 · 0 评论 -
muduo 18 Thread线程类
EventLoop中的Channel、Poller、EpollPoller都实现结束了,接下来是EventLoop相关的Thread三个类。事件循环的线程池,管理事件循环线程调度的。(在TcpServer中)Thread类就是底层封装的线程,muduo库采用的是Linux原生的pthread_create,代码繁杂,原创 2023-07-05 17:02:05 · 72 阅读 · 0 评论 -
muduo 17 EventLoop事件循环类
主要完成的内特是,调用poller的poll方法底层调用epoll_wait把活跃Channel都放到activeChannels_容器中,然后进行遍历执行handleEvent判断具体事件类型,执行相应回调函数。由linux内核中的eventfd() 函数创建一个无名的事件文件描述符(项目中的wakeupFd_ ),可以通过读写(read、write)该文件描述符来进行事件的通知和等待。1. loop执行的回调,但是当前运行的线程不是loop对应的线程,将这个loop的线程唤醒!原创 2023-07-05 02:24:47 · 95 阅读 · 0 评论 -
muduo 15 EpollPoller
当我们去使用epol create1的时候,创建的epollfd,然后在当前进程里面再去fork创建一个子进程,然后用exec替换子进程,在子进程里面就把父进程设置了标志的fd,资源就都给关闭了:作用是为了解决使用 fork 函数创建子程序后,在子程序中执行 exec 函数族时自动关闭无用的文件描述符.(默认情况,子进程会继承父进程所打开的所有fd资源)原创 2023-07-04 17:06:46 · 51 阅读 · 0 评论 -
muduo 16 封装获取线程tid方法
服务器肯定有多个线程,一个线程执行一个EventLoop,所以我们会有很多个EventLoop,每个EventLoop都有很多Channel,自己Channel上的事件要在自己的EventLoop线程上去处理,为了控制这些逻辑,EventLoop在这里涉及到获取当前线程ID。每个线程都有一个自己的t cachedTid.原创 2023-07-04 01:24:47 · 66 阅读 · 1 评论 -
muduo 14 Poller抽象层代码
TCP server里边儿非常重要的一个东西呢,就是event loop事件循环,一个事件循环对应一个线程,一个线程对应一个事件循环。一个事件循环就是event loop里边对应了一个poller跟一堆的channel,现在来实现poller。原创 2023-07-03 19:07:38 · 51 阅读 · 0 评论 -
muduo 13 Channel通道
TCP server相当于是给muduo库提供编写服务器程序的一个入口的这么一个类。它相当于就是一个大箱子,把这个模组库有关服务器这个编程的相关的所有的东西,包括啊,包括啊,包括啊,都给它打包到一块儿了。里有event loop,有acceptor跟accept相关的操作全部打包进去,事件循环的这个线程池,有一系列的回调,再者它就有一个connection map,它维护了所有的连接。原创 2023-07-03 16:58:09 · 92 阅读 · 0 评论 -
muduo 12 InetAddress地址
需要先定义一个对象来打包IP地址跟端口号来作为TCP server对象的构造函数的参数.原创 2023-07-02 19:36:13 · 74 阅读 · 0 评论 -
muduo 11 Timestamp时间管理
Timestamp类,在这个类中我们主要要完成两个内容,返回当前时间的时间戳time_t类型,并将其转化成字符串类型。原创 2023-07-02 17:10:35 · 87 阅读 · 0 评论 -
muduo 10 Logger日志
debug: 调试信息呢,一般来说是非常非常多的,可能我们在系统正常运行的情况下,会默认把debug日志关掉,当我们需要去输出debug日志的时候,再打开一个开关。对于debug日志,一般不使用时将其关闭,因为debug日志一般信息比较多,一直开着占用资源,所以我们定义#ifdef #endif 条件编译指令。定义一个日志类,由 noncopyable类继承而来,私有化构造函数,静态成员函数获取唯一日志实列对象,包括设置日志级别、写入日志信息函数。infer: 正常的一个日志输出,打印一些重要的流程信息;原创 2023-07-02 16:10:02 · 156 阅读 · 0 评论 -
muduo 09 noncopyable基类
派生类的拷贝构造和赋值首先会调用基类的拷贝构造和赋值,但是基类的拷贝构造和复制已经被delete掉了,也就是说我们的noncopyable类的好处就是让由它继承而来的的派生类不可拷贝构造和赋值。noncopyable被继承后派生类对象可以正常的构造和析构,但是派生类对象无法进行拷贝构造和赋值操作。原创 2023-07-02 13:04:56 · 61 阅读 · 0 评论 -
muduo 08 项目CMake文件
【代码】muduo 08 项目CMake文件。原创 2023-06-29 00:57:30 · 66 阅读 · 0 评论 -
muduo 07 VsCode如何配置我们相应的头文件的搜索路径,库文件的搜索路径以及想要连接的库
model库的这个使用,需要链接libmuduo_base.so 、libmuduo_net.so 、 libpthread.so。在linux中我们如何连接这些库呢,使用的是 -libmuduo_net -libmuduo_base -lpthread。这两个路径呢,是会自动搜索的,因为它们是处在环境变量中的。ctrl+shift+B编译打开tasks.json。-lmuduo_net :库名称。然后我们再ctrl+shift+B 就会直接。-L:库文件搜索路径。把我们需要的连接库文件写入进去。原创 2023-06-28 22:54:43 · 1420 阅读 · 0 评论 -
muduo 06 muduo网络库编程
链接:https://pan.baidu.com/s/1OVDY_tv2cOAj0_QlYSvalg提取码:2nk4muduo库是基于boost开发的 ,所以首先需要安装boost库参考:(36条消息) C++网络编程 - Boost::asio异步网络编程 - 01- boost库源码编译安装_大秦坑王的博客-CSDN博客然后安装muduo(36条消息) C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装_大秦坑王的博客-CSDN博客。原创 2023-06-28 22:54:25 · 113 阅读 · 0 评论 -
muduo 05 select、poll、epoll总结
并不是epoll的ET模式就是一定好的,在极端的情况下,一个套接字上的数据远远不断的过来,因为ET模式,这个socket上的数据从不可读到可读,不可写到可写只会通知一次,之后应用程序会不断的去循环从这个socket上去读取数据,其他就绪的套接字可能会得不到处理。避免由于一个描述符的阻塞读/写操作让其他描述符的任务出现饥饿状态,比如说我用一个阻塞操作去读取一个空的文件,他就会一直阻塞在那里,无法操作其他的文件描述符的任务。相比之下,ET模式在不同的操作系统上可能存在一些细微的差异和实现限制。原创 2023-06-26 20:42:24 · 158 阅读 · 0 评论 -
Muduo 04 Reactor模型
1. 整个的这个基于reactor模型的这个网络服务器呢,在交互的时候呢首先会把事件注册到这个反应堆上(应用对这个事件感兴趣,请求反应堆帮助监听我所感兴趣的事件,并在这个事件发生时去调用一下相应预先设置的回调handler)所以我们所谓的向反应堆注册事件意思就是说,把这个。4. 因为事件对应的处理器都是在反应堆里边维护的,所以,它把这个事件返回到reactor里,reactor就会找到这个event对应的handler,一般都是通过一个map表来存储。,都给到这个reactor反应堆。原创 2023-06-26 18:16:44 · 78 阅读 · 0 评论 -
Muduo 03 好的网络服务器设计
one loop per thread is usually a good model,多线程服务端编程的问题就转换为如何设计一个高效且易于使用的event loop,然后每个线程run一个event loop就行了(当然线程间的同步、互斥少不了,还有其 它的耗时事件需要起另外的线程来做)。作为网络模块的架构设计,实现了简单好用的负载算法,使 各个fork网络进程不会忙的越忙、闲的越闲,并且通过引入一把乐观锁解决了该模型导致的服务器惊群 现象,功能十分强大。还有更好的设计方式,nginx服务器。原创 2023-06-26 16:24:29 · 63 阅读 · 0 评论 -
Muduo 02 Unix/Linux上的五种IO模型
应用进程一直在等待read的返回结果。这种模型效率是不高,但是编程非常简单。原创 2023-06-26 16:00:24 · 59 阅读 · 0 评论 -
muduo 01 阻塞非阻塞,同步异步
对于异步IO接口,调用时会向操作系统通知三个东西,一个是我们感兴趣的sockfd,一个是buf,一个是sigio信号,通知操作系统我们对该sockfd感兴趣,判断一下里面是否有数据,有数据放到buf中,放好了再通过sigio信号通知过来。该函数默认是阻塞的,当我调用它的时候如果我的sockfd上没有数据到来,没有数据可读,该函数就不会返回,当前线程就一直阻塞等待sockfd上有数据到来。我要最终如果有数据的话呢,我要把这个内核缓冲区的数据搬到应用程序的每一块儿缓冲区当中,还有一个就是。原创 2023-06-25 23:41:03 · 138 阅读 · 0 评论