- 博客(35)
- 收藏
- 关注
原创 用户态网络缓冲区
是一块用户空间的内存区域,用于临时存放待发送或已接收的网络数据。它位于用户态,直接和内核中的socket缓冲区相对应。分为和,在网络编程中,readrecv和writesend系统调用是操作内核的socket缓冲区读取和写入数据的,用户态网络缓冲区可以有效的座位应用层和内核层间的一个缓冲地带,有效的解决由于和。
2026-03-20 11:56:11
79
原创 知识点总结(三) 线程池 、数据库连接池
线程池是一个维护着若干线程的池式组件,当需要用到多线程的时候可以将任务封装后丢到线程池中,这时线程池中会分配出一个线程执行并完成该任务。线程池的实现需要两个类,一个是线程池本身类,另一个是阻塞队列类。因为对于线程池本身而言底层首先需要一个vector数组用来存储线程,另外需要一个队列数据结构由生产者线程往里面加入任务,消费者线程取出任务执行,当然这就是需要封装一个线程安全的阻塞队列先说阻塞队列类,这里为了方便内存管理委托给独占智能指针阻塞队列需要 包括。
2026-03-18 15:34:36
315
原创 知识点总结(二)POSIX API 、 tcp/ip网络协议栈、dpdk
① 本质上是以最小确认轮次问题第一次握手 : 让服务端确认 – 能收到客户端;并且告知自己序列号;第二次握手 : 让客户端确认 – 能收到服务端,且服务端能收到客户端;告知自己序列化并确认对端序列号;第三次握手 : 让服务端确认 – 客户端能收到服务端;确认对端序列号;这样的话双方就都确认了① 自己和对端都能发送/接收数据 ② 互相确认初始序列号!② 为什么不是两次。
2026-03-17 15:42:40
401
原创 知识点总结(一)I/O多路复用
每次需要将整个位图作为参数拷贝到内核,检查所有的fd状态并设置,然后再次拷贝回用户态,最后用户态再遍历fd_set找到就绪的fd。这样就会导致以下问题的出现。
2026-03-16 16:59:05
360
原创 高性能组件(三) - 用户态网络缓冲区
对于readwrite这两个系统调用,其实是把把内核中的数据拷贝到用户空间、用户空间的数据拷贝到内核,write该系统调用返回的时候数据有没有发送出去并未可知。以write为例,如果内核缓冲区当前还能接受50字节的数据,但是write系统调用的参数sz=100,这样就会导致写不进去,所以可以先将剩余50个字节缓存起来,注册写事件到epoll,等待下一次就绪的时候继续调用write。数据包的流向 – 需要增加TCP/UDP头 , IP 头 , MAC 头,通过网卡驱动放入到网卡,最后发送出去。
2026-03-15 15:29:22
335
原创 c++ 锁相关(mutex 等)
在多线程条件下,多个线程要执行某段代码去操作共享资源(可以理解为主存中的变量),但是由于硬件层面 寄存器运行效率远高于内存,所以衍生出来的缓存会导致各个线程之间数据不一致问题。因此为了保证数据一致性问题,同一时间只允许一个线程去操作临界区,所以锁的概念由此而来。
2026-03-15 15:15:47
380
原创 c++11智能指针
当用户从连接池获取一个连接时,连接池返回一个 std::shared_ptr,并设置一个自定义删除器。这个删除器的任务是在 shared_ptr 析构(即用户不再使用连接)时,将连接归还给连接池,而不是真正销毁连接。
2026-03-13 16:08:29
370
原创 hash散列表+ 布隆过滤器
布隆过滤器是一种概率型数据结构,他的特点是高效的插入和查询,能确定某个字符串一定不存在或者可能存在。布隆过滤器不存储具体的数据,所以所占空间很小,但是查询结果存在误差,但是误差可控不支持删除操作。
2026-03-12 16:19:11
381
原创 红黑树(rbtree) & ksvstore引擎(引擎层应用)
红黑树节点结构体:01//颜色//左子树//右子树//父结点//红黑树结点//根结点//通用叶子结点} rbtree;//红黑树。
2026-03-11 16:20:58
464
原创 图床项目(四) 文件秒传、图片分享服务
在登录的时候已经在服务端生成了token,并且通过jsonapp的调用序列化后传递给了前端,后续的每次webapi请求都需要前端封装数据也就是content带有token,因此每次的后端api请求都需要。
2026-03-08 16:03:35
374
原创 图床项目(三) 登录注册文件上传mysql实现
内部实现数据库的select 和 insert操作 :通过在http协议解析函数拿到的也就是,使用jsonapp封装库实现反序列化,获取注册账号等数据; :封装此方法 – 该方法核心逻辑注意:在实例化数据库连接池的时候需要加载配置文件 ,这里面包括了数据库连接串的详情信息:数据库名、账号、密码等登录api具体实现内部实现数据库的select 和 insert操作verifyUserPasswordsetToken2. 文件上传api实现2.1 文件上传post_data(cont
2026-03-07 11:09:01
351
原创 图床项目(二) 接口设计
该模型相较于普通的reactor模型复杂一点,其中包括,其中每一个 subReactor·对应一个线程。其中 mainReactor 负责处理新连接 , 并将连接均匀分配给 subReactor ,后续该新连接有对应的subReactor处理read、send操作。
2026-03-06 16:42:49
360
原创 图床项目(一) fastdfs配置及框架
FastDFS主要功能包括:文件存储,同步和访问,,比较适用于基于文件服务的站点。FastDFS主要有两部分组成和。
2026-03-06 14:45:51
351
原创 池式组件(三) - 异步数据库连接池
池式结构中的元素是连接MySQLConn,因此想到去写连接类,该连接又要绑定这一个工作线程Worker,该工作线程还需要绑定着该连接,所以想到去封装,该类中的成员变量就含有 2.1.4中的三个。最开始池式结构里面的元素是连接,连接绑定了线程,因此初始化这些连接的时候需要把这些线程也启动。未来有个发布任务的接口,用户线程通过调用Query发起请求,将包装的元素压到队列,此时就会唤醒线程获取元素并且使用绑定的连接处理。截止到此就要继续进行封装类。
2026-02-25 15:19:57
989
原创 高性能组件(二) - ringbuffer
*注意:**所谓环形队列,其实是逻辑上的,物理存储是连续的缓存空间,通过取余的方式当索引到达尾部的时候重新挪到开头。根据计算机cpu和core的缓存机制,对一个数据都是存放于64B的。中,为了防止头和尾索引放在同一个缓存行导致伪共享,提高性能,所以使用。的方式进行内存对齐。
2026-02-22 21:46:15
29
原创 高性能组件(一) - shared_ptr
实现原子操作的原子性:一个操作比如i++,可能是多条指令构成,为了不让其他core看到未完成的指令的数据,所谓未完成的指令,反映在内存上就是防止访问到其他核心的操作的缓存块,因此需要lock去锁住MESI一致性中的M/E状态即可。为什么原子操作需要锁定 M 和 E 状态?M 和 E 状态的共同点是当前核心独占该缓存行,这意味着其他核心的缓存中不存在有效副本。但仅拥有独占权并不足以保证原子性,因为在操作期间,其他核心仍可能通过总线嗅探发起读请求(使 E 变为 S)或写请求(使当前行失效),从而破坏独占。
2026-02-22 16:54:58
659
原创 池式组件(一) - 线程池
线程池是内部维护着一定数量线程的池式结构。通过控制提前创建好的线程休眠或唤醒,去执行耗时任务,从而避免了每次都需要创建线程这个浪费资源的操作。
2026-02-12 16:45:12
320
原创 kvstore (二)协议层设计 + 引擎层初识(array数组)
此处为了方便循环遍历,我么可以定义一个枚举,里面对应着指针数组中的具体执行参数。
2025-12-27 17:08:58
320
原创 异步IO - io_uring实现
在 Linux 服务器编程中,I/O 模型的选择直接决定了系统的并发处理能力和性能上限。从传统的阻塞 I/O 到 select/poll,再到如今广泛使用的 epoll(基于 epoll 的 Reactor 模式实现:从原理到百万并发实践_epoll reactor-CSDN博客),Linux 一直在探索更高效的 I/O 处理方式。然而,随着现代应用对 I/O 性能要求的不断提高,epoll 模型也显露出一些局限性:它仍然是通知机制而非真正的异步 I/O,应用程序需要在内核通知就绪后自行执行 I/O 操作。
2025-12-21 10:27:55
888
原创 DPDK实现用户态tcp、ip协议栈
传统的linux操作系统内核提供的POSIX API依赖内核协议栈处理数据,其中一般需要两次的数据拷贝 ==① 数据包经过内核的DMA缓冲区拷贝到内核的sk_buff == ,,会使得内核态和用户态频繁切换,导致效率低下。DPDK直接对接拦截网卡数据,将数据包映射到提前配置的用户空间巨页中,省去了内核作为中间桥梁。省去了内核作为中间桥梁。向上DPDK直接向用户态负责,所有的数据直接用户操作,效率大大提高。
2025-12-15 14:05:50
825
原创 基于epoll的reactor模式实现
/定义一个类型,其中 CALLBACK指向函数的指针int fd;//创建一个可以接受 int func(int a) 的指针union {} r_action;
2025-12-04 18:39:40
652
原创 selet/poll/epoll
所谓linux下一切皆文件,就是从这个上面体现,其中sock通信都是以文件描述符 int类型 fd传递的。其中 0 ,1,2 被系统占用,默认从3开始。其中io(也就是fd)可以被回收,回收的时间是60秒。
2025-11-26 21:01:16
619
原创 文件传输助手 - 服务端、服务端
② 连接QTcpSocket的信号(如:readyread、disconnected、errorOccurred)到槽函数。① 调用QTcpServer的nextPendingConnection()获取新连接的socket。③ 将QTcpSocket存储起来,方便后续使用(例如:放入一个列表或容器中管理多个客户端)QPainter 是 Qt 中用于进行二维图形绘制的类。**② 异步获取 void **
2025-11-09 21:34:45
611
原创 deepseekAssistant项目知识点总结(已完成)
/ 默认上下文菜单//文本编辑类部件(QTextEdit, QLineEdit 等)的默认菜单很实用// 完全禁用上下文菜单//游戏中常用// 阻止上下文菜单但可以处理右键事件//自定义的鼠标交互,游戏中常用// 使用动作作为上下文菜单// 创建并添加动作QAction *addAction = new QAction("添加项目", this);// 连接信号。
2025-10-25 12:58:48
725
原创 父窗口和子窗口传递数据(信号和槽方式)
① 包含接受数据的QTextEdit 设置为只读即可② 包含子窗口的堆对象③ 槽函数 – 当子窗口创建的时候连接子窗口的信号,处理接受的数据。
2025-10-16 10:48:12
205
原创 spring基于xml文件注入外部bean
往UserService中注入属性userDao第一步:创建两个包 dao和 service , 其中dao包下包含一个接口和对应的实现类②userDao接口下只添加一个抽象方法UserDaoImpl实现抽象方法UserService中写入userDao属性,并且使用set方式注入。创建一个add方法,里面调用update方法。第二步:创建XML文件对两个要创建的对象进行配置,并且在userService中使用ref的标签注入userDao对象此时name是userService中的属性名
2022-03-29 15:29:39
757
原创 spring学习笔记
一.ioc的两个接口二.ApplicationContext接口主要的两个实现类1.FileSystemXmlApplicationContext是绝对路径,一般是存储在硬盘上的位置2.ClassPathXmlApplicationContext是类文件下的路径,即src下的。IOC操作Bean管理两个步骤:①spring创建对象 ②spring注入属性1.基于XML配置文件的方式创建对象①创建对象②属性注入属性注入中的 set方法注入时具体实例演示:第一步:首先创建
2022-03-29 11:30:29
364
原创 spring中的解耦
原始方式原始方式:在UserServie的方法中直接new UserDao 。工厂模式工厂模式:在UserFactory工厂中new UserDao对象,降低了两个类中间的耦合度,但是这两个类和工厂类中又会耦合,存在缺陷。ioc解耦ioc的解耦用到了 :工厂模式 、XML配置文件 、反射机制第一步第二步在工厂类中的具体操作:先根据XML配置文件,获取到bean中的class后面的信息,也就是类的全限定性类名。利用反射机制中的API (Class.forName)获取加载到堆中的Cla
2022-03-29 10:42:35
1145
原创 tcp/ip协议
TCP/IPhttp协议是客户端和服务端进行传输的数据约束规范(二进制文本)。第一行:建立一个与百度相连的双向的通信(输入输出)。第二行:使用http协议请求数据。## http协议请求回来的构成部分1.http协议的协议头----响应头。2.html的体(body)----响应体。应用和内核以下在传输控制层中进行。连接是虚无的,不占用物理空间的。资源的开辟才是真正的连接。socket是一个四元组,其中包括 ip(ip地址) + port(端口号)网络层传输控制层要发送一个包,这
2022-03-17 09:27:17
534
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅