- 博客(140)
- 收藏
- 关注
原创 muduo库源码分析: One Loop Per Thread
当该TcpConnection对象注册到SubEventLoop之后,这个TcpConnection对象的任何操作(包括调用用户自定义的连接建立后的处理函数。)都必须要在这个SubEventLoop线程中运行,所以TcpConnection::connectEstablished()函数必须要在SubEventLoop线程中运行。那么我们怎么。
2025-04-12 21:07:33
883
原创 Linux内存管理--fork为例
创建一个新的进程涉及多个步骤,每个结构体和内存区域的分配方式不同,我们详细拆解 fork() 时的内存分配流程,并分析 task_struct、mm_struct、页表、堆栈、物理内存 分别从哪里申请。(进程描述符)用于存储进程的基本信息,如 PID、优先级、状态等。(内存描述符)存储了进程的虚拟地址空间信息,包括堆、栈、代码段等。页表(Page Table)是进程的虚拟地址到物理地址的映射数据结构。用户进程的虚拟地址访问时,Linux 采用按需分配(Demand Paging)策略,物理页的申请流程如下:
2025-03-09 20:12:17
862
1
原创 muduo库源码分析
1. 功能概述:- Channel类主要负责一个文件描述符的事件分发。它与一个文件描述符相关联,并封装了该文件描述符上的 I/O 事件及其对应的回调函数。- 它将底层的 I/O 复用机制(如epoll)与用户的业务逻辑进行解耦,使得用户可以专注于处理特定文件描述符上的事件,而无需关心底层的 I/O 复用细节。2. 工作原理:- Channel在构造时会关联一个文件描述符和一个EventLoop对象。它会在EventLoop中注册对特定事件(如可读、可写、异常等)的关注;
2025-03-04 20:21:05
857
原创 Reactor模式(单/主从)
优缺点优点:逻辑简单,避免业务阻塞I/O缺点:Reactor单线程可能成为I/O瓶颈(每秒处理10万+请求时)线程切换开销大(I/O线程与Worker线程频繁切换)适用场景:中小型系统(如API网关、低频交易系统)
2025-02-19 22:27:57
487
原创 第5章 共享内存范式:C语言层面
编译制导指令以#pragma omp 开始,后边跟具体的功能指令,格式如:#pragma omp 指令[子句[,子句].]。
2025-01-01 20:57:06
257
原创 第3章 并行循环调度的准则
此时total还需要进行同步…首先,让我们来定义一下要考察的类型。在本章中,我们假设每个循环的迭代都与其他循环是相互独立的,也就是说,一个迭代的执行,并不使用前一个迭代的结果。如果我们不认真处理如何,例如如何做循环调度就可能引起比较大的。并且,通常我们不可能提前知道循环迭代的时间,因此,是非常困难的。解决这些问题的方法是本章的重点。
2024-12-27 11:12:04
801
原创 第二章 并行为什么有时会慢?
高速缓存的定义:高速缓存(Cache)是一种小型、快速的内存存储,用于存放最近或最常使用的数据。它位于处理器和主内存(RAM)之间,目的是减少数据访问的延迟,提高数据访问速度。缓存的工作原理:当处理器需要访问内存中的数据时,首先检查高速缓存是否有这个数据(叫做缓存命中)。如果缓存中有这个数据,处理器直接从缓存获取,速度非常快(称为“缓存命中”)。如果缓存中没有该数据(叫做缓存未命中),则处理器从较慢的主内存中读取数据,并把这个数据加载到缓存中,供以后使用(称为“缓存未命中”)。
2024-12-26 21:32:53
1120
原创 第1章 R语言中的并行处理入门
先来总结一下 snow 包的操作:使用了scatter/gather范式:我们同时有多个R的实例在运行,它们可能在集群中的好几个机器上,也有可能在一个多核机器上,我们把其中的一个实例称为manáger,其他的称为worker。
2024-12-26 16:23:55
826
原创 consumer.hpp消费者管理模块
Consumer类封装了一个消费者的基本属性,包括消费者标识、订阅的队列名称、是否自动确认、以及一个回调函数。ptr:定义了一个类型,表示,方便后续使用智能指针管理Consumer对象。:回调函数类型,接收三个参数,分别为消息的标签、消息的基本属性和消息内容,用户可以自定义回调逻辑。构造函数:初始化Consumer对象时设置消费者标识、队列名称、自动确认标志以及回调函数。(消费者调用回调函数,将收到的消息推送给客户端)析构函数:销毁Consumer对象时记录日志,方便调试。
2024-08-16 10:17:21
824
原创 routine.hpp路由匹配模块
Routine类处理了不同类型的消息路由需求,特别是在处理Topic类型的复杂路由规则时,使用了动态规划来高效地完成匹配。
2024-08-16 09:00:00
544
原创 PageCache页缓存
PageCache负责使用系统调用向系统申请页的内存,给CentralCache分配大块儿的内存,以及合并前后页空闲的内存,整体也是一个单例,需要加锁.PageCache桶的下标按照页号进行映射,每个桶里span的页数即为下标大小.
2024-07-06 19:28:42
1673
原创 CentralCache中心缓存
有与ThreadCache相同数量的哈希桶,分别管理一个SpanList,Span,完成后挂到freeList,当ThreadCache对应的桶无内存时,再从对应的。
2024-07-04 18:01:50
719
原创 第八章 基于树的方法
多数投票方法是根据每个自举样本的分类结果进行投票,然后选择票数最多的类别作为最终分类结果。红色类的票数:6 绿色类的票数:4多数投票结果是“Red”
2024-06-23 08:58:02
245
原创 第六章线性模型选择+正则化
正则化(Regularization)是指在机器学习和统计学中,通过引入额外的约束或惩罚项来防止模型过拟合的一种技术。过拟合是指模型在训练数据上表现很好,但在测试数据或新数据上表现较差的现象。正则化通过限制模型的复杂度,从而提高模型在未见数据上的泛化能力。在回归分析中,常见的正则化方法包括L1正则化(Lasso回归)和L2正则化(Ridge回归)
2024-06-23 08:34:39
1263
1
原创 第五章重采样方法
(a) 第一个引导观测值不是原始样本中第j个观测值的概率: 每个观测值被选中的概率是1/n。因此,第j个观测值不被选中的概率是1 - 1/n。(b) 第二个引导观测值不是原始样本中第j个观测值的概率: 由于每次选择都是独立的,第二次选择和第一次选择相同,因此概率也是1 - 1/n。(f) 当n = 10,000时,第j个观测值在引导样本中的概率是多少?(e) 当n = 100时,第j个观测值在引导样本中的概率是多少?(d) 当n = 5时,第j个观测值在引导样本中的概率是多少?(b) 第二个引导观测值。
2024-06-22 17:55:21
978
原创 第四章分类问题
线性判别分析是一种用于分类和降维的技术。LDA假设各类别的协方差矩阵是相等的,因此其决策边界是线性的。二次判别分析是LDA的扩展,允许各类别有不同的协方差矩阵,因此其决策边界是二次的。
2024-06-22 17:24:36
1972
原创 第二章统计学习
(a) 灵活的方法更好,因为数据量大,预测变量少。(b) 不灵活的方法更好,因为预测变量多,数据量少,避免过拟合。(c) 灵活的方法更好,因为可以捕捉非线性关系。(d) 不灵活的方法更好,因为高方差噪声会导致灵活方法过拟合。通过以上分析,可以看出灵活和不灵活的方法在不同情况下的优劣。什么是过拟合ChatGPT过拟合(Overfitting)是指在机器学习和统计模型中,模型过于复杂,以至于它在训练数据上表现非常好,但在新数据(测试数据)上表现很差的现象。
2024-06-18 17:45:54
1049
原创 ThreadCache线程缓存
定长内存池利用一个自由链表管理释放回来的固定大小的内存obj。ThreadCache需要支持申请和释放不同大小的内存块,因此需要多个自由链表来管理释放回来的内存块.即。
2024-06-09 17:40:36
1310
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人