- 博客(14)
- 收藏
- 关注
原创 【c++】muduo库(四)tcp服务器
创建 TcpConnection 后,把连接/消息/写完成回调下发给它,并设置关闭回调指向 TcpServer::removeConnection,最终在子 loop 中调用 connectEstablished 完成 Channel 注册。每个 TcpConnection 内部持有 Channel 监听套接字的读/写/错误/关闭事件,回调再调用用户注册的业务回调(连接、消息、写完成、关闭),实现从内核事件到业务逻辑的逐层传递。写事件消费至空时关闭写事件,必要时触发高水位/写完成或执行延迟的。
2025-12-21 18:33:23
748
原创 【c++】muduo库(三)事件循环
tcp服务器的核心组件,负责接收新的连接,通过channel监听socket的可读事件来处理新连接,连通了socket和channel。负责,创建独立的事件循环线程,管理EventLoop对象的生命周期,提供线程安全的启动和停止机制,支持线程初始化回调。具体实现方式是什么?EventLoopThreadPool 如何进行资源管理与生命周期控制,以避免内存泄漏和悬挂指针问题?如何避免运行中的性能瓶颈?管理多个事件循环线程,提供线程安全的启动和停止,,实现高效的负载均衡,支持动态任务分配。
2025-12-21 17:47:14
877
原创 【c++】muduo库(一)基础组件
线程池可与异步I/O框架(如epoll)协同工作,将I/O事件由Reactor分发,计算任务交由线程池处理,避免线程阻塞在I/O上,从而最大化系统吞吐量。例如:拷贝std::string需分配新内存+复制字符(O(n)复杂度),移动std::string仅转移指针(O(1)复杂度),在高并发场景(如每秒10万+任务),std::move能大幅减少内存碎片和CPU占用,是性能优化的核心手段。弱回调则不会增加对象的引用计数,当对象被销毁后,回调函数能立即检测到对象已失效,从而安全地放弃执行。
2025-12-20 21:40:10
739
原创 【c++】muduo库(二)网络基础知识
I/O 处理流fd→Poller活跃事件 →→ 用户回调(读操作使用Buffer,写操作触发send/flush,可能注册/取消定时器)定时任务流TimerQueue通过timerfd触发 → 回调在所属EventLoop线程执行跨线程任务流runInLoop写入eventfd唤醒目标EventLoop→ 保证任务在正确线程执行 → 减少锁竞争。
2025-12-20 20:27:32
673
原创 【mysql】 缓存策略
读:读缓存->不存在则访问mysql->写redis写:(以效率为主)先写缓存并设置过期时间,写mysql,等待mysql同步到redis(过期时间:网络传输+上述操作;设置200ms过期时间)
2025-11-23 22:36:19
259
原创 【mysql】事务 mvcc 锁
c:依赖redolog,提交时redolog刷盘,崩溃时重新修改。技术支持: https://github.com/0voice。i:依赖undolog,mvcc读取历史版本+锁机制。行级锁:对表的索引加锁,包括聚集索引和辅助索引。为了提升mysql并发处理sql语句的性能。并发控制的单元,要么都做,要么都不做。a:依赖undolog,失败时回滚。聚集索引记录的隐藏行。表级锁:对页或表加锁。
2025-11-23 21:38:53
534
原创 【mysql】mysql 索引原理以及sql优化
物理存储(InnoDB):由段(数据段、索引段、回滚段等)、区(1MB)、页(默认 16kB,可通过 innodb_page_size 修改)组成。多路设计原因:形成矮胖结构降低磁盘 IO,节点可容纳更多索引信息,快速锁定叶子节点,无需中序遍历即可实现范围查询,便于高效组织磁盘数据。针对辅助索引,直接通过辅助索引b+树就能获取查询的值(辅助索引树一般低于聚集索引树),无需回表(在select中尽量写我们所需要的字段)普通索引(二级索引)的索引表中,不包含全量数据,需要主键二次查询,获取所有数据。
2025-11-22 22:20:09
528
原创 【mysql】sql语句 索引 视图 存储过程 触发器
1 连接器,客户端与数据库建立连接的入口,主要完成接受连接、管理连接(连接池管理)、校验用户信息。2 依赖主键 第一范式基础上,消除部分函数依赖,确保非主键列完全依赖于主键或联合主键。查询学过课程编号为 ‘1’ 并且也学过课程编号为 ‘2’ 的同学的学号、姓名。查询 ‘c++高级架构’ 课程比 ‘音视频’ 课程成绩高的所有学生的学号;查询至少有一门课与学号为 ‘1’ 的同学所学相同的同学的学号和姓名;查询学过 ‘谢小二’ 老师所教的所有课的同学的学号、姓名。(减少表连接,加速查询)
2025-11-22 22:12:21
988
原创 【c++】协程相关问题
工作窃取:每个核对应一个调度器,当自身就绪队列为空时,从其他调度器的队列 “窃取” 协程执行。3 执行调度:通过coroutine_resume切换上下文,开始执行协程函数。4 IO阻塞:协程执行中触发IO,则yield挂起,保存上下文并返回调度器。协程是用户态切换,速度更快。3 协程使用协作式调度,主动yield,实现无锁并发,逻辑清晰。3 上层业务代码无需感知非阻塞细节,仍然以阻塞式编写,?2 事件循环检测到IO就绪时,调度器唤醒协程,执行read。5 切换调度:挂起协程后,从就绪队列选择下一个协程。
2025-11-10 01:15:44
351
原创 【c++】tcp相关问题
2 被动关闭方(ESTABLISHED→CLOSE_WAIT):回复 ACK 包,ack=u+1,此时进入 “半关闭” 状态(仍可发数据)。4 主动关闭方(FIN_WAIT_2→TIME_WAIT):回复 ACK 包,ack=v+1,被动关闭方接收后进入 CLOSED 状态。快速重传:无需等待超时,收到 3 个相同的重复 ACK(即三次请求同一个报文),立即重传未被确认的报文,效率更高,但会导致更加拥塞。2 服务端(LISTEN→SYN_RCVD):回复 SYN+ACK 包,seq=y,ack=x+1。
2025-11-09 23:17:07
897
1
原创 【c++】linux网络入门基础知识
用于io多路复用,对于服务器端接受请求的socket,将其注册到epfd实例中,当请求满足注册类型ev时,epoll_wait返回events中的就绪事件。让单个进程、线程同时监听多个io事件,当线程就绪时才处理,解决传统阻塞io中一个线程只能解决一个io的低效问题,从而在有限线程下实现高并发。每当有新的任务到来,线程池就调用空闲线程去执行,节省创建、销毁线程的系统开销。多线程编程中,锁的作用是保护问共享资源的访问,比如一次自增操作,需要寄存器的三次操作,缺点:cpu空转,且如果等待时间长,性能会下降。
2025-11-09 22:35:21
299
原创 【c++】基于reactor实现的简单p2p对话功能
即只有两个客户端没有服务端。当第二次握手“client端”还未接收期间,就接受到了“server端”的第一次握手,此时直接进入SYN_RECV状态,接受到第二次握手后,直接进入ESTABLISHED状态。
2025-11-06 15:42:16
266
原创 【解决方案】javaEE无法使用javax.servlet
https://baijiahao.baidu.com/s?id=1656351194485443518&wfr=spider&for=pc
2021-05-29 16:29:54
488
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅