
C/C++后端开发学习笔记
文章平均质量分 93
用于记录自己的C/C++后端开发学习过程,形成系统笔记。
jiang_T
无无无
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[C/C++后端开发学习]23 Nginx学习
反向代理负载均衡HTTP Server正向代理Nginx安装可以直接通过ubuntu的命令安装Nginx,但如果有开发需求的话,就必须通过下载源码进行编译的方式进行安装。Nginx源码下载地址:nginx,我下载的是1.20.2版本;同时还需要依赖openssl,pcre(用于正则匹配) 和 zlib(用于压缩):openSSL 1.1.1npcre 8.45zlib 1.2.11将这些库的目录与nginx源码的目录放在同一层,然后进入到nginx源码原创 2022-10-09 15:29:10 · 1144 阅读 · 0 评论 -
[C/C++后端开发学习]22 协议设计与Protobuf
文章目录通信协议设计基本要素消息帧完整性的判断方法主流序列化协议Protobuf使用protobufIDL语法编译.proto命名规范在C++中使用protobufprotobuf 编码通信协议设计基本要素要能完整地识别一帧数据(帧完整性)能够进行序列化和反序列化能够进行协议升级(包括客户端和服务端,需要指明协议版本)协议具备安全性(加解密)能够实现数据压缩,减小传输数据量消息帧完整性的判断方法1、强制固定每个消息的数据长度,比如规定每个消息都发128字节这显然是很拙劣的方法。以原创 2022-03-20 14:24:50 · 1655 阅读 · 0 评论 -
[C/C++后端开发学习]21 定时器实现方案
文章目录定时任务的处理方式实现方案1)红黑树2)最小堆3)时间轮方案选择时间轮的实现单层级时间轮多层级时间轮Skynet的时间轮定时任务的处理方式服务端的驱动逻辑主要涉及两类事件的处理:网络I/O事件和定时事件,不同的框架采用不同的方式来整合这两种事件的处理流程:在同一个线程中先处理I/O事件,再处理定时事件,如nginx、redis。利用 epoll_wait 监测I/O的同时依靠 timeout 参数来实现所谓定时,缺点是I/O的处理导致延时比较严重。网络事件和I/O事件在不同线程中处理,如s原创 2022-01-26 18:24:30 · 2606 阅读 · 0 评论 -
[C/C++后端开发学习]20 Redis基础数据结构
文章目录简单动态字符串SDS双向链表Quicklist字典Dict跳表Skiplist整数集合Intset压缩列表Ziplist已知Redis 对外提供了5种不同类型的对象。Redis 针对不同的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率。简单动态字符串SDSSDS(Simple Dynamic String)对原始C字符串进行了封装,在Redis中除了将字符串作为常量而不需要修改的地方,几乎都使用SDS作为字符串。不论是使用哪一种对象,其key和value如果是用原创 2021-11-30 16:28:15 · 605 阅读 · 0 评论 -
[C/C++后端开发学习]19 Redis对象与命令
文章目录关于Rediskey-value基础数据结构应用场景value的内部存储结构及其选择基础数据结构及其操作命令1 string1.1 存储结构1.2 基础命令1.3 应用2 list2.1 存储结构2.2 基础命令2.3 应用3 hash3.1 存储结构3.2 基础命令3.3 应用4 set4.1 存储结构4.2 基础命令4.3 应用5 zset5.1 存储结构5.2 基础命令5.3 应用关于RedisRedis(Remote Dictionary Service,远程字典服务)是一种内存数据库,原创 2021-11-29 01:48:10 · 1856 阅读 · 0 评论 -
[C/C++后端开发学习]18 Mysql事务原理
Mysql事务原理原创 2021-11-27 00:20:19 · 1370 阅读 · 0 评论 -
[C/C++后端开发学习]17 Mysql索引原理
文章目录索引、主键及约束索引分类主键的选择约束索引的实现索引的存储聚集索引辅助索引验证实际采用的索引索引的工作原则最左匹配原则覆盖索引索引失效索引的设计原则索引、主键及约束索引分类Mysql利用B+树来组织和存储数据,索引用于在B+树中作为key值快速地查找数据。唯一索引不可以出现相同的索引值,但可以有NULL值。UNIQUE(key)主键索引非空的唯一索引,一个表只有一个主键索引;在 InnoDB 中,由主键索引构建的B+树包含了表的完整数据信息;PRIMARY KEY(key原创 2021-11-25 23:02:21 · 1482 阅读 · 0 评论 -
[C/C++后端开发学习]16 使用libevent
文章目录libevent和libevlibevent的封装层次使用libevent1)由调用者自己管理I/O2)调用者只处理事件网络监听和读写事件普通I/O事件3)定时事件和信号处理定时事件信号处理事件原理浅析定时任务管理的实现evbuffer的实现1)evbuffer写数据2)evbuffer读数据libevent和libevlibevent和libev均是基于C语言实现的异步事件库,它们封装了事件管理过程中与操作系统的交互,使得调用者无需关注事件监测机制以及IO处理机制等在不同平台上的差异,而只需关原创 2022-01-10 16:46:33 · 1951 阅读 · 0 评论 -
[C/C++后端开发学习]15 简单内存池实现
文章目录为什么需要内存池内存池的设计策略对比内存池分配方法设计内存池结构空洞的利用内存释放数据结构设计内存池操作接口实现初始化内存池申请内存释放内存销毁内存池内存池的自动清空补充: 内存泄漏的排查为什么需要内存池简而言之,反复地进行malloc和free不利于内存管理,同时容易产生内存碎片。复杂的代码中还容易出现内存泄漏问题。内存池则提前分配好大块内存,形成内存池,再从内存池中提供现成的内存块给程序使用。内存池的设计策略对比由一个大的整块分散成多个小块,回收时再整合成大块(如伙伴系统)。一般以页为原创 2021-11-22 16:19:34 · 1103 阅读 · 0 评论 -
[C/C++后端开发学习]14 线程池实现
文章目录线程池的作用线程池的结构任务的形式线程池的实现数据结构的封装线程与任务的管理方法实现测试代码线程数量设定线程池的作用服务器接收到客户端请求后,往往需要执行一些处理任务,然后再将执行结果返回给客户端。这其中有一些任务是比较耗时的,如写日志、计算任务及数据库CRUD等操作,在单线程环境下可能会影响到服务器对其他客户端的响应速度。因此需要采用多线程处理。那么,如果每次接收到请求之后再去新建线程来执行任务,则会存在比较大的性能开销。一种比较巧妙的方法就是,提前建立好可以执行任务的线程,放在一个线程池中,原创 2021-11-20 23:08:53 · 1068 阅读 · 0 评论 -
[C/C++后端开发学习]13 Mysql连接池
池化技术池化技术简单地说就是复用现成的资源,减少资源对象的创建次数,在高并发的场景下提高程序的响应速度。具体实现包括线程池、内存池、连接池、对象池等等。使⽤池化技术缓存的资源对象有如下共同特点:对象创建时间⻓;对象创建需要⼤量资源;对象创建后可被重复使⽤数据库连接池即是在程序启动时就预先建⽴⾜够的数据库连接,并将这些连接通过一个容器组织起来,由程序动态地对池中的连接进⾏申请,使⽤,释放。创建数据库连接是⼀个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多原创 2021-11-20 02:13:26 · 894 阅读 · 0 评论 -
[C/C++后端开发学习]12 基于netmap的用户态协议栈(二)
文章目录初步实现简单的TCP用户态协议栈TCP的状态迁移TCP首部处理TCP控制块(TCB)几个辅助函数TCP数据报的接收和发送1 实现三次握手2 接收数据并回复相同的数据3 实现“四次”挥手完整代码初步实现简单的TCP用户态协议栈TCP的状态迁移下图是TCP的状态迁移图。显然,由于TCP是一种有状态协议,所以实现起来要比之前实现的那些协议复杂很多,其中包括三次握手、四次挥手、连接重置等等。同时还有错误重传、滑动窗口等机制以及各种定时器。此外,还需要为TCP实现慢启动、拥塞控制、快速重传等等算法。平时原创 2021-12-11 22:27:45 · 3043 阅读 · 0 评论 -
[C/C++后端开发学习] 11 实现一个简单的HTTP服务器
Reactor 模型中增加HTTP协议在实现GET方法实现POST方法实现CGI原创 2021-11-17 19:25:00 · 3681 阅读 · 0 评论 -
[C/C++后端开发学习]10 基于netmap的用户态协议栈(一)
用户态协议栈的意义在内核实现协议栈往往存在两次拷贝过程,一是网卡中的数据通过sk_buff拷贝到内核,之后再从内核拷贝到进程用户空间。于是我们考虑如何加快这个过程,减少拷贝次数。一种思路:通过DMA直接将数据从网卡拷贝到内存中,于是应用程序可以直接通过mmap从内存中取得数据。由于DMA的工作是不需要CPU干预的,所以对于CPU来说相当于没有做任何的拷贝操作,即所谓零拷贝。那么应用进程如何通过这种方式从网卡直接取得数据?常用几种方法:使用raw socketnetmap框架dpdk框架ne原创 2021-11-08 22:40:48 · 1186 阅读 · 0 评论 -
[C/C++后端开发学习] 9 服务端百万并发测试
服务端并发的概念并发量:同时承载的客户端的数量,实质上就是同时能够维护的 socket 的数量比如要实现10W客户端同时在线,200ms内正常返回结果,承载量的影响因素:数据库网络带宽内存操作日志常见单机服务模型单线程同步:NTP多线程同步:Natty纯异步:Redis、HAProxy半同步半异步:Natty多进程同步:fastcgi多线程异步:memcached多进程异步:Nginx一个请求一个进程/线程:Apache/CGI微进程框架:erlang/go/lua原创 2021-11-02 00:50:24 · 1414 阅读 · 0 评论 -
常见TCP/IP协议栈相关问题
文章目录TCP相关UDP相关TCP相关TCP三次握手过程TCP四次挥手过程为什么建立连接需要三次握手,而断开连接需要四次挥手三次握手主要是提供一种确认机制,防止之前已经因分组丢失而失效的连接请求突然又重传到了服务端,导致服务端误以为客户端又发起了一次连接;那么断开连接时需要四次挥手,主要是由于TCP是双向通信的,读写是不同的两个通道,服务端的读通道被关闭后写通道的数据可能还未发送完毕,因此两个通道需要分开来发送FIN包及其ACK包,就出现了一般情况下的四次挥手。TIME_WA原创 2021-11-04 01:34:29 · 1395 阅读 · 0 评论 -
[C/C++后端开发学习] 8 tcp服务器支持websocket协议
tcp服务器支持websocket协议背景websocket应用场景websocket工作流程握手过程(Opening Handshake)通信协议结束(Closing Handshake)实现服务端的状态机代码实现结构定义辅助函数核心代码测试补充:web传输密文背景尽管HTTP协议在WEB上已广泛应用,但它是一个无状态、单向通信的协议,那么对于一些需要实时刷新页面数据的场合,基于HTTP实现起来就会很尴尬:前端需要不断地发起HTTP请求连接到服务端去获取最新的数据。这造成了一些问题:大量HTTP请原创 2021-10-27 03:09:50 · 1765 阅读 · 1 评论 -
[C/C++后端开发学习] 7 tcp服务器的epoll实现以及Reactor模型
tcp服务器的epoll实现以及Reactor模型1 IO多路复用selectpollepoll2 epoll详解2.1 基本使用方法2.2 LT水平触发和ET边沿触发2.3 实现服务器监听和接收数据3 Reactor模型3.1 增加回调函数实现Reactor模型3.2 实现服务器发送数据3.3 半包的数据怎么处理?3.4 单Reactor的优化思路3.5 多线程多Reactor处理处理方法:3.6 多进程多Reactor处理处理方法:3.7 Reactor参考案例其他杂项笔记1 IO多路复用IO多路复原创 2021-10-26 01:19:36 · 2403 阅读 · 1 评论 -
[C/C++后端开发学习] 6 设计模式:结构型
设计模式:结构型单例模式装饰器模式单例模式保证一个类仅有一个实例,并提供一个该实例的全局访问点。 ——《设计模式》GoF装饰器模式装饰器和责任链的区别:装饰器的迭代与顺序无关,而责任链必须注意处理顺序;责任链有打断流程,而装饰器所有流程都会执行。...原创 2021-10-22 21:17:52 · 646 阅读 · 0 评论 -
[C/C++后端开发学习] 5 设计模式:创建型
设计模式:创建型设计模式定义如何学习设计模式?设计原则依赖倒置开放封闭面向接口封装变化点单一职责理氏替换接口隔离组合优于继承原则的层次关系模板方法本质观察者模式补充:互斥锁和自旋锁策略模式设计模式定义设计模式是指在软件开发中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案如何学习设计模式?找到稳定点和变化点,把变化点隔离出来(解耦合-把耦合限定在最小范围)先满足设计原则,慢慢迭代出设计模式(分治思维)设计原则依赖倒置高层模块不应该依赖低层模块,两者都应该依赖抽象原创 2021-10-22 19:41:43 · 1370 阅读 · 1 评论 -
[C/C++后端开发学习]4 布隆过滤器与分布式一致性Hash
海量数据去重的Hash与布隆过滤器1 背景2 可用的数据结构对比3 散列表3.1 冲突处理方法4 布隆过滤器4.1 原理4.2 为什么不支持数据删除操作4.3 应用场景缓存穿透问题4.4 布隆过滤器的设计方法1)确定参数2)选择Hash函数4.5 其他补充5 分布式一致性 hash5.1 背景5.2 hash 偏移问题虚拟节点1 背景使用 word 文档时,word 如何判断某个单词是否拼写正确?从海量数据中查询某个字符串是否存在?网络爬虫程序,怎么让它不去爬相同的 url 页面?垃圾邮件过滤算原创 2021-10-17 01:55:35 · 332 阅读 · 0 评论 -
[C/C++后端开发学习]3 B树和B+树
1 红黑树处理海量数据时的存在问题海量数据无法全部读入到内存中处理,而采用红黑树时的数据寻址次数多(logn),这将引起大量的磁盘IO操作,导致查询时间长,性能差。解决思路: 采用多叉树降低树的高度。2 B树2.1 B树的性质2.2...原创 2021-10-17 22:39:53 · 1076 阅读 · 0 评论 -
[C/C++后端开发学习]2 红黑树原理及实现
1 二叉搜索树1.1 定义二叉搜索树BST的结构:此处使用宏定义单独定义一个 TREE_ENTRY 来表示二叉树的节点,是为了方便将业务与算法分离开。类似于内核中的通用链表。但这里的代码似乎还是处理的不好。#define TREE_ENTRY(name, type) \ struct name \ { \ struct type left; \ struct type r原创 2021-10-16 16:54:14 · 451 阅读 · 0 评论 -
[C/C++后端开发学习]1 排序、KMP、链表
1 排序、KMP、队列、栈1 排序1.1 Shell排序1.2 快速排序2 KMP算法欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入1 排序1.1 Shell排序1.2 快速排序2 K原创 2021-10-10 14:01:50 · 483 阅读 · 0 评论