自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 android---Intent 给 Activity 传递消息(激活 + 传数据 + 收结果)

你告诉物业 “我要 XX 房间(URI)的姓名数据”,物业验证你的权限后,去问管家要数据,再把数据带回给你。简单类比:你(MyActivity)写了一张 “指令纸条(Intent)”,上面写着 “请拍照,照片存在 XX 位置”,交给前台(系统);ContentProvider 是 “数据管家”(比如通讯录 App 的 ContentProvider),你不能直接找它要数据,必须通过 ContentResolver 这个 “中间人” 发请求。实例销毁,它就没了。(也叫实例变量),它的作用范围确实和。

2026-03-06 22:57:18 332

原创 wait_for和wait函数的返回值

wait_for()无论超时 / 被唤醒返回,必然持有锁,后续代码可安全操作共享资源;阻塞期间锁会被释放,保证其他线程能访问共享资源;返回值bool仅用于判断 “是否在超时前满足谓词”,和锁状态无关 —— 锁的状态只由wait_for()的内部逻辑保证。代码是不带谓词的wait_for()版本,它的返回值类型和含义和带谓词的版本完全不同,这也是新手极易混淆的点。

2026-02-25 17:17:05 58

原创 信号处理webserver

简单性:使用字节编号便于处理和传输效率:最小化通信开销可靠性:保证信号传递的原子性和顺序性在您的Web服务器中,这种机制用于处理定时器事件和服务器关闭信号,是实现高性能并发服务器的关键技术之一。

2026-01-16 23:33:35 459

原创 SIGALRM信号处理机制详解

实现了Web服务器的连接超时管理机制,通过周期性SIGALRM信号触发定时器检查,自动清理超时连接,是保证服务器稳定性和资源有效利用的关键组件。实现了Web服务器的优雅关闭机制,当收到SIGTERM信号时,服务器会设置停止标志,在完成当前请求处理后安全退出,确保资源正确释放,是服务器稳定运行的重要保障。

2026-01-16 23:10:43 917

原创 operator new/delete

重载全局作用域的(内存分配)和(内存释放);在重载函数中添加打印日志,追踪new int等操作实际调用的底层函数,以及传递的参数(分配 / 释放的内存大小);严格遵循 C++ 标准对这些重载函数的约束(比如处理sz=0、抛出bad_alloc、非内联等)。这段代码重载了全局的,替换了 C++ 默认的内存分配 / 释放逻辑;重载函数底层用实现,同时添加日志追踪调用时机和内存大小;严格遵循 C++ 标准约束(如处理sz=0、抛出bad_allocnoexcept等);主函数通过。

2026-01-07 23:32:58 949

原创 std::allocator<T>::destroy

destroy的核心是显式调用对象的析构函数,释放对象内部资源(如字符串、数组),但不释放对象所在的原始内存;C++11 前仅支持析构T类型对象,C++11 起通过模板支持析构任意类型U的对象;p必须指向已构造的合法对象,且只能析构一次;必须遵循 “先 destroy(析构对象),后 deallocate(释放内存)” 的顺序,否则会导致资源泄漏。

2026-01-07 23:08:48 928

原创 construct对象构造接口

construct的核心是用 placement-new 在已分配的原始内存上构造对象,不分配新内存,只初始化对象;C++11 前仅支持拷贝构造,C++11 起通过可变参数模板支持任意构造函数(完美转发参数);p必须是allocate分配的未初始化内存指针,参数必须匹配对象的构造函数;C++17 后推荐通过调用,底层逻辑不变。

2026-01-07 22:42:59 652

原创 STL内存分配器

的核心是申请字节的原始未初始化内存,底层调用全局,但不构造任何T对象;hint参数是内存位置提示(提升缓存性能),但 C++17 弃用、C++20 移除,实际用途有限;T必须是完整类型,C++20 编译期使用时需 “分配后立即释放”;易混点:分配内存仅开启 “数组的生存期”,每个T元素的生存期需要通过construct手动开启#include <memory> // std::allocator 头文件#include <string> // 用于测试自定义类型。

2026-01-07 22:23:17 908

原创 游戏服务器和一般高性能服务器的区别

游戏服务器和(如 Web 服务器、数据库服务器、计算集群)的核心区别在于:游戏服务器优先保障,而通用高性能服务器更侧重。

2026-01-07 20:52:10 530

原创 select和poll之间的性能对比

这种设计差异直接导致了性能上的差距。

2026-01-01 16:36:34 713

原创 poll的细节分析

是一个高效且灵活的 IO 多路复用工具,尤其适合中等规模的并发连接场景。对于更高性能的需求,可进一步考虑。的文件描述符数量限制和事件管理不便的问题。尽管其性能在大量 fd 时仍会下降,但在 Linux 环境下,结构体数组和轮询机制实现了对多个文件描述符的监听,解决了。实现对多个文件描述符(fd)的监听,其核心是利用。(Linux 特有)或。

2026-01-01 16:31:01 835

原创 select详细分析

是一种用二进制位(bit)表示状态的数据结构,每个位对应一个元素,0表示“否”(不监听或未就绪),1表示“是”(监听或就绪)。实现,监听文件描述符有最大数量限制(默认 1024),由内核参数。select通过位图高效管理文件描述符的监听状态,但其设计存在。(BSD),它们通过事件驱动机制避免了轮询开销,性能更优。,适合连接数较少的场景。对于高并发需求,更推荐使用。(每个文件描述符仅需1位存储)和。2.在IO多路复用中,(支持快速的位运算)。

2026-01-01 14:35:12 533

原创 二分查找细节理解

二分循环条件的选择,本质是匹配 “目标” 和 “边界收缩逻辑”若想让区间收敛到唯一索引(找极值 / 唯一值),用l < r;若想在区间内验证目标是否存在(找特定值),用l <= r。

2025-12-31 19:50:10 844

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

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

2025-12-26 22:50:47 631

原创 Qt贪吃蛇

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

2025-12-01 20:38:42 585

原创 零拷贝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 705

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

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

2025-11-28 09:51:20 872

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

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

2025-11-23 16:07:50 1119

原创 C++ functoin和bind

【代码】C++ functoin和bind。

2025-11-22 19:39:52 93

原创 力扣42接雨水

【代码】力扣42接雨水。

2025-11-19 16:10:16 129

原创 力扣92反转链表二

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

2025-11-19 13:26:04 95

原创 力扣76题

【代码】力扣76题。

2025-11-12 22:35:32 96

原创 进程间的通信

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

2025-11-12 16:44:13 960

原创 高性能MySql阅读

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

2025-10-29 20:03:51 844

原创 对信号的理解

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

2025-10-27 22:54:06 731

原创 webserver类续

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

2025-10-27 22:22:37 679

原创 WebServer类

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

2025-10-18 22:11:16 800

原创 leetCode第33题

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

2025-10-17 20:17:56 189

原创 util_timer定时器解读

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

2025-10-12 18:52:34 773

原创 My_shared_ptr

【代码】My_shared_ptr。

2025-10-10 20:21:27 98

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

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

2025-10-05 18:54:29 657

原创 分析递归的过程

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

2025-10-04 18:05:11 145

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

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

2025-10-02 18:01:03 744

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

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

2025-10-02 16:02:09 952

原创 异步日志系统

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

2025-10-01 19:16:34 1056

原创 日志系统解读

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

2025-10-01 16:08:57 439

原创 Web服务器项目解读

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

2025-09-21 15:37:04 971

原创 TCP粘包拆包问题

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

2025-09-11 11:35:48 765

原创 什么是IO多路复用

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

2025-08-30 20:56:22 511

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

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

2025-08-29 13:43:40 1099

空空如也

空空如也

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

TA关注的人

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