自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 收藏
  • 关注

原创 信号量唤醒线程的实际机制

而是wait()这种设计确保了,避免了不必要的线程唤醒和上下文切换开销。

2025-12-26 22:50:47 610

原创 Qt贪吃蛇

对比项ui(Ui::GameWindow对象)this(GameWindow对象)是什么助手对象,创建和管理控件实际的窗口对象可见性不可见,在后台工作可见,显示在屏幕上作用创建控件并保存它们的指针作为控件的父容器内存包含控件的指针包含控件的实际对象生命周期由GameWindow管理窗口本身把整个系统想象成一个工厂this= 工厂大楼看得见的建筑包含所有机器和工人对外营业ui(Ui::GameWindow对象)= 工厂的安装团队看不见的后台团队负责安装和设置所有机器。

2025-12-01 20:38:42 567

原创 零拷贝I/O的核心概念

内存带宽(Memory Bandwidth)是指单位时间内内存能读写的数据总量,单位通常是 GB/s(千兆字节 / 秒),它由内存规格(如 DDR4、DDR5)、位宽(如 64bit)、频率(如 3200MHz)决定,是内存的核心性能指标之一。内存带宽占用 = (当前实际传输的数据量 / 内存最大带宽)× 100%比如你的内存最大带宽是 51.2 GB/s(DDR4-3200 双通道),当前每秒传输 25.6 GB 数据,带宽占用就是 50%。

2025-11-28 09:59:19 669

原创 服务器性能下降原因分析

先看资源使用率:用top(CPU)、free -m(内存)、iostat -x(磁盘)、iftop(网络)快速判断是哪类资源瓶颈;再查并发与阻塞:用pstack(线程栈)、strace(系统调用)、perf(性能热点)定位线程阻塞点、锁竞争或低效函数;最后优化代码与配置:根据排查结果,优化代码逻辑(算法、锁、I/O 模型)、调整系统配置(内核参数、ulimit)、扩容资源(CPU、内存、带宽)。

2025-11-28 09:51:20 827

原创 webserver服务器信号处理流程

你的理解实际流程信号触发 -> epoll 检测到信号信号触发 -> 信号处理函数被调用 -> 向管道写端写入一个字节-> 管道读端变为可读 ->epoll 检测到读事件-> 调用对应函数处理-> 主循环调用函数 -> 从管道读端读出信号值 -> 根据信号值调用对应函数处理信号中文含义触发源对应事件服务器典型处理动作SIGTERM终止信号外部命令 (kill <pid>管理员要求服务器关闭启动优雅关闭流程,安全释放所有资源后退出。SIGALRM闹钟信号内部alarm()函数。

2025-11-23 16:07:50 1074

原创 C++ functoin和bind

【代码】C++ functoin和bind。

2025-11-22 19:39:52 80

原创 力扣42接雨水

【代码】力扣42接雨水。

2025-11-19 16:10:16 111

原创 力扣92反转链表二

【代码】力扣92反转链表二。

2025-11-19 13:26:04 84

原创 力扣76题

【代码】力扣76题。

2025-11-12 22:35:32 88

原创 进程间的通信

同一主机、高性能需求:优先选共享内存 + 信号量(超大数据)或Unix 域套接字(可靠传输);同一主机、异步消息传递:选消息队列(结构化消息)或命名管道(简单字节流);跨主机通信:选套接字(底层控制)或RPC/MQ(上层封装,简化开发);简单通知 / 同步:选信号(紧急事件)或信号量(资源控制)。

2025-11-12 16:44:13 936

原创 高性能MySql阅读

事务的概念:事务是一组sql语句,一组原子性的sql查询,或者一个独立的工作单元。事务的四大特性:原子性,一致性,隔离性,持久性原子性:一个事务被视为一个不可分割的最小单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。(解决“事务执行中途失败,数据状态不一致”的问题)一致性:数据库总是从一个一致性的状态转换 到另外一个一致性的状态。保证事务执行前后,数据从库从一个合法状态转移到另一个合法的状态。(解决“事务执行后数据违反业务规则”的问题)

2025-10-29 20:03:51 833

原创 对信号的理解

是当前进程的 “临时任务”,不是新进程 —— 就像你写代码时,中途停下来处理一个消息,处理完再接着写,不会重新开一个新的代码文件去处理消息。信号产生后,内核并不会立即将其递送给进程处理,而是先将信号标记为 “待处理(pending)”,存放在进程的进程控制块(PCB)即。其他信号触发时,是不是没有时间等待,系统直接往对应接收信号的进程的上下文中中的pending中添加信号事件?是的,当信号触发时,系统会直接往对应接收信号的进程的上下文中的。是一个位图,每个比特位对应一个信号,当信号触发时,内核会在。

2025-10-27 22:54:06 719

原创 webserver类续

当服务器的监听套接字(m_listenfd)通过epoll检测到新连接事件(EPOLLIN接收客户端的连接请求,获取新连接的文件描述符(connfd检查服务器资源是否充足(如连接数是否达到上限MAX_FD为新连接初始化定时器(通过调用timer函数),用于后续的超时管理。根据监听套接字的触发模式(LT 或 ET),采用不同的连接处理逻辑。连接接收:根据监听模式(LT/ET)差异,分别采用单次或循环accept方式,确保不遗漏客户端连接。资源控制:通过检查限制最大连接数,防止服务器资源耗尽。

2025-10-27 22:22:37 662

原创 WebServer类

这两个成员变量共同构成了WebServerm_pool指向实际的线程池实例,负责任务的调度和线程管理;则记录线程池的大小,是初始化线程池的关键参数。它们的存在使得 Web 服务器能够通过多线程并发处理多个客户端的 HTTP 请求,提高服务器的并发处理能力和响应效率。// epoll_event 相关// ET;LT这段代码是WebServer类中与事件监听、I/O 复用及连接模式变量名类型含义与作用events存储epoll监控的事件数组,大小为(最大事件数)。当epoll_wait。

2025-10-18 22:11:16 792

原创 leetCode第33题

left,mid]区间要么落在单调区间要么落在非单调区间,在对应的区间也对应着外面的if else语句的两种情况。内部的if else语句则是target落在[left,mid]区间的情况。重点在大的if else 分支语句中。对应着if else语句分支。

2025-10-17 20:17:56 174

原创 util_timer定时器解读

util_timer类是一个用于管理连接超时的定时器类,主要作用是跟踪客户端连接的超时时间,并在超时发生时执行预设的回调函数(如关闭超时连接、释放资源等)。expiretime_tuser_datasockfdaddresscb_funccb_funcprevnextutil_timer简单来说,util_timer是连接超时管理的基本单元,配合实现了定时器的有序管理(按超时时间排序),最终用于检测并处理长时间无活动的客户端连接,避免资源泄露。这段代码定义了一个名为int sockfd。

2025-10-12 18:52:34 756

原创 My_shared_ptr

【代码】My_shared_ptr。

2025-10-10 20:21:27 90

原创 web服务器HTTP协议处理部分

该方法通过状态机模式分阶段解析 HTTP 请求,配合parse_line(行解析)、(请求行解析)等辅助函数,逐步完成请求的解析工作。解析过程中若发现错误则立即返回,若解析完成则调用do_request处理具体业务(如返回静态资源或处理 CGI 请求),是 HTTP 服务器处理请求的核心逻辑实现。// 处理cgi// 根据标志判断是登录检测还是注册检测// 将用户名和密码提取出来int i;for (i = 5;= '&';= '\0'

2025-10-05 18:54:29 631

原创 分析递归的过程

树的高度对应着DFS深度优先搜索,空间占用与树的高度。1.依次枚举每个位置应该放哪个数。2.依次枚举每个数应该放哪个位置。

2025-10-04 18:05:11 137

原创 项目中HTTP协议处理部分(续)

read_onceLT 模式下按需单次读取,依赖 epoll 持续通知。ET 模式下通过循环一次性读完所有数据,减少 epoll 通知次数,提升性能。该方法确保了请求数据被完整存入缓冲区,为后续的 HTTP 协议解析(如解析请求行、请求头)提供了完整的输入数据。// 解析http请求行,获得请求方法,目标url及http版本号cgi = 1;else//检索匹配连续的\t//查找从m_url开始后第一个\t的位置。

2025-10-02 18:01:03 729

原创 项目中HTTP协议处理部分

m_read_buf是整个请求数据的 “容器”。标记 “当前正在解析的行” 的起点。标记 “已经解析到的位置”,也是下一行解析的起点。通过这三个变量的配合,程序能够从m_read_buf中 “逐行” 提取数据(请求行、头部字段等),实现对 HTTP 请求的分步解析。例如,当需要获取当前行的内容时,直接通过即可定位到该行的起始地址,直到所标记的结束位置。这段代码在http_conn类的私有成员中声明了一个包含 2 个元素的数组m_iv,主要用于高效地集中管理 HTTP 响应数据的缓冲区,配合。

2025-10-02 16:02:09 941

原创 异步日志系统

类,核心功能是通过后台线程异步写入日志,避免前端线程因 IO 操作阻塞,提升系统性能。

2025-10-01 19:16:34 1034

原创 日志系统解读

在日志系统中,“滚动”(roll)指的是当日志文件达到特定条件(如大小超限、时间周期结束等)时,关闭当前日志文件并创建一个新的日志文件来继续记录日志的过程。其核心目的是避免单一日志文件过大,便于日志的管理、归档和查看。这段代码是LogFile类中的rollFile方法,负责实现日志文件的滚动(即创建新的日志文件)当旧文件达到滚动条件(如大小超过rollSize_或时间跨天)时,rollFile会被触发。此时,file_智能指针管理的旧AppendFile。

2025-10-01 16:08:57 428

原创 Web服务器项目解读

FILE*缓冲区(buffer_:内存中的一块临时存储区域,用于暂存待写入数据,减少直接磁盘 I/O 的次数。文件流(fp_:关联缓冲区和磁盘文件的抽象层,负责管理缓冲区的刷新策略,并与操作系统交互完成实际的磁盘写入。磁盘文件:最终的数据存储目的地,数据通过文件流从缓冲区同步到这里。的作用就是通过文件流fp_,强制将其管理的缓冲区(buffer_)中的数据写入磁盘文件,确保数据即时持久化。文件指针(FILE*)本身并不直接对应内核中的一片存储区域,但它是一个指向结构体的指针,而这个结构体(FILE。

2025-09-21 15:37:04 949

原创 TCP粘包拆包问题

​​:发送方连续发送的多个独立数据包,被接收方一次性接收并合并为一个连续字节流的现象。例如,发送端依次发送“Hello”和“World”,接收端可能收到“HelloWorld”。​​:发送方发送的单个数据包因超过TCP传输限制,被拆分为多个部分,接收方需多次接收才能组合成完整数据的现象。例如,发送端发送一个1000字节的消息,而TCP最大报文段长度(MSS)为1460字节(以太网常见值),接收端可能先收到500字节,再收到500字节。

2025-09-11 11:35:48 744

原创 什么是IO多路复用

角色比喻真实含义你(老板)一个线程/进程处理业务的核心顾客客户端连接(Client Connection)来自网络的各种请求点单连接请求/数据请求read/write 等IO操作后厨做奶茶内核准备数据数据从网络/磁盘读取到内核缓冲区递交奶茶数据从内核空间拷贝到用户空间应用程序真正处理数据一个服务员一个线程传统BIO模型的资源消耗号码牌文件描述符(File Descriptor, FD)操作系统对每个连接的标识小本本文件描述符集合(FD Set)你监控的所有连接提醒铃。

2025-08-30 20:56:22 494

原创 阻塞,非阻塞,同步,异步的理解

非阻塞:IO 未就绪时不阻塞,但数据就绪后仍需应用程序主动调用recv完成拷贝(同步特性不变);异步:应用程序发起请求后彻底 “不管”,内核自己搞定 “等数据 + 拷贝数据”,最后通知结果(全程无需应用程序参与等待或拷贝)。

2025-08-29 13:43:40 1072

原创 虚函数表的问题

【代码】虚函数表的问题。

2025-08-22 20:11:47 94

原创 固定式线程池任务队列

【代码】固定式线程池任务队列。

2025-08-04 12:23:25 128

原创 抽象工厂模式

衡量代码模块之间的依赖程度,

2025-07-31 22:46:16 773

原创 异步I/O和同步I/O

的生活场景来类比 Linux 中的。

2025-07-31 20:38:19 782

原创 STL标准模板库Map

这是一种自平衡的二叉搜索树(BST),能够保证最坏情况下的操作复杂度为。这些规则确保红黑树的大致平衡,使得查找、插入、删除操作的时间复杂度为。是 C++ STL 中的关联容器,它存储。

2025-07-31 13:00:23 527

原创 智能指针管理this指针

这里通过this指针直接构造了一个新的shared_ptr,但这是错误的用法。新构造的shared_ptr会创建一个新的引用计数控制块(control block),而不是共享pa的引用计数。因此,pa和pb的引用计数是独立的(各自为 1),而不是共享的。当pa和pbpa的引用计数减为 0,调用delete释放Int对象。pb的引用计数也减为 0,也会调用delete释放同一个Int对象。这会导致(double-free),是未定义行为(UB),通常会导致程序崩溃。

2025-07-30 16:59:02 306

原创 共享型智能指针循环引用问题

以上情况会形成循环引用造成内存泄漏。一下情况不会造成内存泄漏。

2025-07-26 20:10:22 229

原创 Lambda表达式

【代码】Lambda表达式。

2025-07-26 19:59:12 129

原创 Tcp粘包问题

TCP 粘包是指发送方发送的多个数据包到接收方后粘连在一起,导致接收方无法分辨原始数据包的边界。这通常是由于 TCP 协议的特性(面向流、Nagle 算法、滑动窗口等)引起的。

2025-07-26 19:58:40 159

原创 我的单例模式存在的问题

member variables)确实需要在类外进行定义(即分配存储空间),但。它的内存分配和生命周期由编译器在幕后处理,无需手动在类外定义。它实际上是存储在程序的全局/静态数据区,但作用域仅限于函数内。C++11 标准规定,局部静态变量的初始化是线程安全的。,因为它们的存储和初始化是由编译器自动管理的。保证初始化代码只执行一次,避免竞态条件。,导致线程B 拿到一个未初始化的对象!),确保多线程环境下只会初始化一次。虽然线程A 已经释放了锁,但。,它们能从根本上避免这个问题。在原始的单例模式实现中,

2025-07-26 12:36:24 431

原创 C++野指针

野指针(Dangling Pointer)是指指向无效内存地址的指针。使用野指针会导致程序崩溃、数据损坏或未定义行为。通过合理的初始化、内存管理和使用智能指针,可以有效避免野指针带来的风险。:改为返回值或使用动态分配。:确保正确释放派生类对象。

2025-07-24 16:33:39 311

原创 MySQL事务的四大特性

事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败回滚。事务执行前后,数据库从一个一致性状态变换到另一个一致性状态。多个事务并发执行时,一个事务的执行不应影响其他事务的执行。事务一旦提交,其结果就是永久性的,即使系统故障也不会丢失。有四个隔离级别:读未提交、读已提交、可重复读、串行化。这是事务的最终目标,由其他三个特性共同保证。通过锁机制和MVCC(多版本并发控制)实现。通过undo log(回滚日志)实现。通过redo log(重做日志)实现。

2025-07-22 12:30:03 197

原创 虚析构函数

(非虚调用),因为析构顺序是确定的(从派生类到基类)。还有父类,会继续递归调用更高层基类的析构函数。所有析构函数执行完毕后,底层内存管理器(如。编译器生成代码,通过。)回收对象占用的内存。

2025-07-22 10:27:33 221

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除