- 博客(29)
- 收藏
- 关注
原创 多进程和多线程比较
摘要: 多进程和多线程的核心差异在于资源开销、内存共享及稳定性。多进程独立内存空间,隔离性好但开销大,适合CPU密集型任务(如视频编码)和高稳定性场景;多线程共享内存,轻量但需加锁,适合IO密集型任务(如网络请求)和高频通信场景。选择原则:计算密集用多进程(利用多核),IO密集用多线程(低延迟)。工程中常混合使用,如游戏服务器多进程拆分模块,进程内多线程处理IO。
2026-01-07 21:53:36
802
原创 Pytorch经典卷积神经网络-----激活函数篇
在神经元的数学表达式 (y = h(wx+b)) 中,h、w、b 分别代表激活函数、权重参数、偏置参数,三者是构成单个神经元的核心要素,共同实现对输入信号的加权变换与非线性映射其中h则为激活函数一个非线性函数,用于对线性变换结果 (wx+b) 进行映射,让神经元具备非线性表达能力。核心作用:如果没有激活函数,无论神经网络有多少层,最终输出都是输入的线性组合(多层线性变换等价于单层线性变换),无法拟合复杂的非线性任务(如图像分类、语音识别)。
2025-12-18 19:42:40
820
原创 Prim算法生成最小权值
摘要: Prim算法是一种基于贪心策略的最小生成树(MST)求解算法,适用于带权无向连通图。其核心思想是从单个顶点出发,逐步选择连接生成树内外顶点且权值最小的边进行扩展,直至覆盖所有顶点。相较于Kruskal算法,Prim算法更适用于稠密图,时间复杂度可通过优化(如优先队列)降至接近线性。算法实现依赖lowcost[]和adjvex[]数组记录边权与连接关系,稠密图中邻接矩阵+线性查找(O(n²))效率较高,稀疏图则适合邻接表+堆优化(O(m log n))。代码示例展示了邻接矩阵下的实现流程,涵盖初始化、
2025-12-08 15:20:55
382
原创 哈夫曼树和哈夫曼编码
哈夫曼树(Huffman Tree)是一种带权路径长度最短的二叉树(也叫最优二叉树);哈夫曼编码是基于哈夫曼树生成的变长前缀编码,核心作用是 “数据压缩”—— 让出现频率高的字符用短编码,频率低的用长编码,大幅减少数据存储 / 传输体积。打个生活化比方:发短信时,“的”“了”“我” 这些高频字用 1 个字符(如 “0”),“疆”“霾” 这些低频字用 3 个字符(如 “110”),整体短信字数会少很多;哈夫曼树就是用来 “分配编码长度” 的规则,哈夫曼编码就是最终给每个字符定的 “长短码”。
2025-12-07 22:10:12
1113
1
原创 栈的具体应用-----中缀转后缀(简单逆波兰式的计算)
使用一个栈来存储操作数。如果是运算符,则从栈中弹出两个操作数(注意顺序:后弹出的是左操作数)。采用pair保存相关运算符的栈外优先级和栈内优先级,栈顶运算符的优先级大于当前运算符的优先级,就弹出栈顶运算符,在遍历结束后,将栈中剩余的所有运算符弹出到结果字符串。无括号,运算符优先级由位置决定,计算机可线性扫描直接计算,效率高。三:代码:(注意:代码为简单代码,没有判断中缀是否合法,小数,超过一位数以及出现空格的情况,需要可额外添加相关功能),人类可读,但计算机处理时需考虑运算符优先级和括号,较复杂。
2025-11-12 17:18:34
230
原创 机器人控制与实时系统的关键技术——RTSI
RTSI的核心原理是通过硬件同步时钟确定性调度和低延迟链路,消除实时系统中的时间不确定性,确保多设备、多任务在微秒级精度下协同工作。这一机制是实现高精度机器人控制(如力控装配、高速轨迹跟踪)、工业自动化等场景的技术基础,其价值在于将“不可预测的系统行为”转化为“可量化、可控制的确定性过程”。
2025-09-02 17:00:12
553
原创 万向锁问题(矩阵解释)
α:绕X轴的滚转角(Roll)β:绕Y轴的俯仰角(Pitch)—— 中间旋转轴,是触发万向锁的关键γ:绕Z轴的偏航角(Yaw)三个轴的旋转矩阵定义如下:绕X轴旋转α角的矩阵R_X(α)RXα1000cosα−sinα0sinαcosαRXα1000cosαsinα0−sinαcosα绕Y轴旋转β角的矩阵R_Y(β)RYβcosβ0sinβ010−sin。
2025-08-26 10:08:10
897
原创 提升系统稳定性和可靠性的特殊线程(看门狗线程)
看门狗线程是现代多线程程序中重要的稳定性组件,通过主动监控和自动恢复机制,降低系统因线程异常导致的故障概率。在实际开发中,需根据业务需求设计合理的监控策略,并充分测试边界情况(如高并发、资源竞争),确保看门狗机制本身的健壮性。是一种特殊的线程,主要用于监控程序中其他线程或进程的运行状态。其核心功能是在被监控的目标线程出现异常(如卡死、无响应、执行超时等)时,采取相应的恢复措施(如重启目标线程、通知系统故障等),从而保障整个系统的稳定性和可靠性。
2025-06-03 18:46:35
776
原创 malloc是如何分配内存的(malloc详解)
现代实现通过分层设计(小内存走堆区链表,大内存直接映射)和算法优化(快速适应、内存池)提升性能,同时提供调试工具辅助排查问题。(Memory Allocation)是C语言中用于动态分配内存的标准库函数,其核心机制涉及操作系统内存管理和堆内存分配算法。适用于频繁分配相同大小内存的场景(如线程池、对象池)。将未使用的内存块通过链表连接,每个块包含元数据(大小、状态等)。分配的内存地址需满足系统对齐要求(如64位系统为8字节对齐),以提高访问效率。分配的内存块大于请求大小(因对齐或元数据开销)。
2025-06-03 15:08:14
1623
原创 Cookie 和 Session:Web 身份验证的核心机制
Cookie 是服务器发送到客户端浏览器并存储在本地的一小段文本数据,用于跟踪用户状态,下次请求时浏览器会自动携带对应 Cookie 到服务器。
2025-06-03 15:01:07
708
原创 什么是缺页中断(缺页中断详解)
处理器在访问内存时,发现页表中对应页面的“存在位”(Present Bit)为0,触发缺页中断,暂停当前程序的执行。从外存(如swap分区或文件系统)读取缺失的页面到物理内存的页框中,并更新页表的“存在位”和物理地址映射。缺页中断是操作系统实现虚拟内存的基础,允许程序使用比物理内存更大的地址空间,提升内存利用率。中断处理完成后,处理器重新执行引发缺页中断的指令,此时页面已在内存中,访问正常进行。,负责将缺失的页面从外存(如硬盘)加载到物理内存中,并更新页表映射关系。)置换到外存,为缺失的页面腾出空间。
2025-06-01 19:16:20
2938
原创 C++读写锁以及实现方式
读写锁是线程同步的一种基本方式,C++中的读写锁(Read-Write Lock)允许。这种锁适用于读多写少的场景,可以显著提升并发性能。在基本实现基础上,增加。
2025-06-01 14:16:26
620
原创 进程调度算法详解
例如:用户A有2个进程,用户B有1个进程,总CPU时间按2:1分配给A和B,每个用户的进程再平分其份额。:每个进程分配固定时间片(Time Quantum),时间片用完后被抢占并放入队列尾部。进程执行顺序:P1(2) → P2(2) → P3(2) → P1(1) → P3(6)进程间调度是操作系统的核心功能之一,其目标是合理分配CPU时间,提高系统效率和响应性。三个队列Q1(时间片=2)、Q2(时间片=4)、Q3(时间片=8)。:为每个进程分配优先级,优先级高的进程优先执行,可抢占或非抢占。
2025-05-28 20:53:26
756
原创 fork()+exec()创建新进程(僵尸进程及孤儿进程)
理解这两个系统调用是掌握UNIX/Linux进程管理的基础,在开发多进程应用(如服务器、shell脚本解释器)时尤为重要。是创建和运行新进程的核心系统调用。以下是它们的详细解释和典型用法。在UNIX/Linux系统中,
2025-05-28 20:39:22
867
原创 静态库与共享库详解
通过合理选择静态库或共享库,可以优化程序的体积、可维护性和运行效率。实际开发中,系统库(如C标准库)通常采用共享库,而第三方库或定制化功能可能采用静态库。在软件开发中,库(Library)是一组预先编译好的代码和数据的集合,用于实现特定功能并供其他程序调用。根据编译和链接方式的不同,库主要分为。静态库和共享库均需解决“符号引用”与“符号定义”的匹配问题,区别在于链接时机(编译时 vs 运行时)。链接器(Linker)将库中被调用的函数代码直接复制到目标程序的二进制文件中,形成完整的可执行文件。
2025-05-28 20:33:05
1199
原创 auto关键字,移动语义和完美转发详解
auto:通过类型推导简化代码,提高可读性移动语义:通过资源所有权转移避免不必要的拷贝完美转发:保持参数值类别不变,实现零开销转发。
2025-05-27 22:36:37
2232
原创 C++单例模式详解
C++ 单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。该模式常用于日志记录器、配置管理器、数据库连接池等场景。以下从实现方式、线程安全、内存管理等方面进行详细解析。一、单例模式的核心要求私有构造函数:防止外部通过new创建实例。静态实例变量:存储类的唯一实例。全局访问方法:提供获取实例的静态接口。禁止拷贝和赋值:防止通过复制或赋值创建新实例。二、常见实现方式1. 懒汉式(Lazy Initialization)特点。
2025-05-26 22:15:40
1242
原创 操作系统虚拟地址与物理地址
虚拟内存(Virtual Memory)之所以能解决物理内存容量限制的问题,核心在于它通过软硬件结合的内存抽象机制,将物理内存与磁盘空间统一管理,使程序“看到”的连续内存空间(逻辑地址/虚拟地址)可以远大于实际物理内存。二、虚拟内存的核心机制:分页与地址映射1. 逻辑地址空间与物理内存的解耦逻辑地址空间(虚拟地址空间)由CPU架构决定,与物理内存容量无关。32位系统支持4GB逻辑地址空间((2^{32})字节)。64位系统支持TB级甚至更大的逻辑地址空间。
2025-05-26 22:11:19
990
原创 MySQL事务详解
MySQL有众多引擎,支持事务的引擎最常用的为InnoDB,InnoDB 是 MySQL 中事务支持的标准选择,除非有特殊需求(如分布式架构),否则无需考虑其他引擎。多个事务并发执行时,彼此之间互不干扰,每个事务看到的数据状态要么是其他事务执行前的状态,要么是其他事务执行后的状态,不会看到中间的临时状态。比如事务 A 在 “可重复读” 级别下查询数据,事务 B 在期间修改了数据并提交,事务 A 再次查询时仍会看到修改前的数据(避免不可重复读)。脏读:允许一个事务读取另一个未提交事务的数据。
2025-05-23 13:46:49
261
原创 TCP协议详解
TCP是面向连接的,也就是说应用程序在使用TCP前需要建立连接,传输完成后断开连接,类似于打电话,打电话的时候双方进行一个短暂的“连接”,等你们交流结束,挂断电话,就进行断开连接过程。当服务器端接收到客户端发送的请求关闭报文,如果服务器端没有其它的数据需要发送,会将第二次发送的ACK报文和第三次发送的FIN报文一起发送,此时就形成了三次挥手。重复丢弃:由于TCP存在重传机制,当报文在网络中滞留过长时间而触发重传,接收方接收到两个报文,接收方通过序列号识别重复数据段并丢弃,确保应用层只收到一次数据。
2025-05-20 21:53:27
2165
原创 C++三大特性之继承特性(菱形继承)
是面向对象编程的核心特性之一,它允许一个类(派生类,也称子类)继承另一个类(基类,也称父类)的属性和方法,从而实现代码复用和多态性。c++支持一个类从多个基类继承,也支持一个类派生出多个派生类,就可能引发菱形继承的问题。在基类中用虚关键字(virtual)修饰的函数,可以在派生类中进行重写。:与构造顺序相反,先调用派生类析构函数,再调用基类析构函数。在C++存在三大继承(公有继承,私有继承与保护继承)。// 使用基类指针调用派生类函数(多态))只会保留一份基类的副本。// 重写基类的虚函数。
2025-05-18 22:43:50
473
原创 C++三大特性之封装特性(友元机制)
它通过将数据(属性)和操作数据的函数(方法)绑定在一起,并隐藏对象的内部实现细节,只暴露必要的接口,从而实现数据保护和模块化设计的特性。封装是 C++ 面向对象编程的基石,通过访问控制和信息隐藏,实现了数据保护、接口简化和模块化设计,使代码更安全、可维护和可扩展。如果一个类被声明为另一个类的友元类,那么这个友元类的所有成员函数都可以访问被声明为友元的类的私有成员。外部成员无法直接访问到私有成员value,但可以通过公有接口set()改变value的值。// 可以直接访问MyClass的私有成员。
2025-05-18 22:18:27
414
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅