![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计一个轻量的多线程网络库
项目已经实现了 Channel 模块、Poller 模块、事件循环模块、HTTP 模块、定时器模块、异步日志模块、内存池模块、数据库连接池模块。
CodeGpt
Stay hungry, Stay foolish, Stop when you are perfect.
展开
-
为什么使用内存池
操作系统分用户态和内核态,我们只能在用户态进行操作。我们所使用的内存有栈和堆的,栈的内存自动分配和回收。对于程序员来说,主动申请和释放的内存是堆的内存。比如malloc()free()。我们调用malloc()向堆申请内存,系统也分配给了我们。但是我们申请的这部分内存容易造成内部碎片,这会导致残缺的内存块不能被我们所利用。比如申请 4k 的内存块,系统剩余的内存空间也够。但是这些是不连续的,连续的块可能只有 2k 大小,那么就会发生内存分配失败的情况。如果是公司级别的程序,不像个人写的 demo。原创 2024-07-25 10:17:34 · 631 阅读 · 0 评论 -
数据库连接池模块设计
数据库的连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。因此,希望实现一个数据库连接池来帮助项目加快对数据库的操作。原创 2024-07-25 10:19:31 · 267 阅读 · 0 评论 -
为什么要实现非阻塞的日志
经过对比可以得到,异步日志的方式对性能更加友好,而且可以减少磁盘 IO 函数的操作,一次写入更多的数据,提高效率。原创 2024-07-25 10:18:59 · 457 阅读 · 0 评论 -
定时器模块讲解
定时器功能相关的类由 Timestamp,Timer,TimerQueue类组成,muduo 库还有一个 Timeld 类方便对定时器进行索引,本项目里没有加上这个类。原创 2024-07-25 10:18:28 · 266 阅读 · 0 评论 -
基类Poller的设计
我们编写网络编程代码的时候少不了使用IO复用系列函数,而muduo也为我们提供了对此的封装。muduo 有 Poller 和 EPollPoller 类分别对应着epoll和poll。而我们使用的接口是Poller,muduo 以Poller 为虚基类,派生出 Poller 和 EPollPoller 两个子类,用不同的形式实现 IO 复用。ownerLoop_重写方法靠派生类实现,这里我们可以专注一下方法。在 muduo 中可以使用此方法获取不同的实例,并且这个方法是在单独的一个文件内实现的。原创 2024-07-25 10:17:04 · 427 阅读 · 0 评论 -
EventLoop的作用
EventLoop 可以算是 muduo 的核心类了,EventLoop 对应着事件循环,其驱动着 Reactor 模型。我们之前的 Channel 和 Poller 类都需要依靠 EventLoop 类来调用。I/Oepoll_wait这里上代码,我们可以看见 EventLoop 的成员变量就有 Channel 和 Poller。其实 EventLoop 也就是Reactor模型的一个实例,其重点在于循环调用epoll_wait不断的监听发生的事件,然后调用处理这些对应事件的函数。原创 2024-07-25 10:15:39 · 904 阅读 · 0 评论 -
什么是Channel
Channel 对文件描述符和事件进行了一层封装。平常我们写网络编程相关函数,基本就是创建套接字,绑定地址,转变为可监听状态(这部分我们在 Socket 类中实现过了,交给 Acceptor 调用即可),然后接受连接。但是得到了一个初始化好的 socket 还不够,我们是需要监听这个 socket 上的事件并且处理事件的。比如我们在 Reactor 模型中使用了 epoll 监听该 socket 上的事件,我们还需将需要被监视的套接字和监视的事件注册到 epoll 对象中。原创 2024-07-25 10:15:01 · 173 阅读 · 0 评论 -
为什么要有缓冲区的设计
如何实现一个轻量的网络库原创 2024-07-25 10:13:38 · 550 阅读 · 0 评论