- 博客(655)
- 资源 (1)
- 收藏
- 关注
原创 内存泄漏-munmap操作问题
解决munmap地址不变munmap的addr必须是mmap返回的原始起始地址(或映射区内的页对齐子地址);长度对齐munmap的length必须与mmap的页对齐长度一致(或页对齐的子长度);校验返回值:必须检查mmapmunmap的返回值,及时处理错误;避免越界:禁止跨映射区解除,禁止重复解除。
2025-12-18 10:41:25
653
原创 怎么保证brk的内存完全释放?
要最大程度地保证brk内存的释放,关键在于减少内存碎片和主动引导glibc进行清理。对于新项目或特定场景,使用更现代的内存分配器(如jemalloc)往往是更根本的解决方案。希望这些具体的方案能帮助你解决这个棘手的问题!如果你能分享更多关于你的应用场景(例如,是长期运行的服务,还是短生命周期的工具),或许我可以提供更针对性的建议。
2025-12-18 10:30:36
229
原创 大内存通过mmap分配,释放后什么情况不能通过munmap直接归还OS
虽然mmap分配的大内存通常能被munmap直接归还,但在系统VMA数量耗尽、munmap参数错误或glibc分配策略改变等情况下,可能无法顺利归还。规范编程、理解系统限制和库行为是避免问题的关键。
2025-12-18 10:29:23
259
原创 xshell能连上ubuntu24而vscode连接不上_临时关闭 Windows 防火墙
总而言之,临时关闭防火墙是一个有效的故障排除方法,但必须以审慎的态度对待。强烈建议您优先尝试为特定程序添加防火墙规则,如果必须关闭,请务必在操作完成后尽快重新开启,以保障计算机安全。希望这些信息能帮助您顺利完成操作!如果您在具体步骤中遇到任何问题,或者想了解更多关于配置防火墙规则的细节,随时可以告诉我。
2025-12-18 08:41:04
458
原创 布隆过滤器
布隆过滤器是一种空间效率极高的概率型数据结构,核心作用是快速判断「一个元素是否存在于集合中」。说「元素不在」→ 100%准确(绝对没在集合里);说「元素在」→ 可能误判(有小概率其实不在);极致省空间(比传统Set/哈希表省几个数量级)。布隆过滤器的核心是「用空间换时间+概率妥协」,适合「允许小概率误判、追求极致空间效率」的场景。按公式计算最优的m和k;实现均匀分布的哈希函数;对位数组进行高效的置1/检查操作。
2025-12-14 21:43:30
630
原创 std::promise 重难点
自定义异常需继承并实现what()// 自定义异常(专业写法)private:string msg;public:// 必须实现what(),且标记noexcept// 子线程抛自定义异常try {throw BusinessException("订单不存在");cout << "业务异常:" << e.what() << endl;// 订单不存在t.join();return 0;核心规则通俗记忆专业要点绑定规则。
2025-12-14 19:25:31
880
原创 大白话Proactor模式
Reactor处理IO就绪事件(“数据可以读了,你自己来拿”);Proactor处理IO完成事件(“数据已经给你读好了,你直接用”)。Proactor模式的核心是**“异步IO请求 → 操作系统完成IO → 处理完成结果”**,通俗易懂的讲就是:你只管“下单”(发起IO请求),剩下的交给别人做,做好了通知你“收货”(处理结果)。原生Proactor(Linux AIO)仅适用于文件IO;网络IO的Proactor需用“Reactor+线程池”模拟;
2025-12-13 18:50:12
930
原创 大白话Reactor模式
用epoll/select批量监控所有连接(经理盯面板);连接有事件才处理(顾客有需求才喊服务员);分工明确(迎宾管接客,点餐员管服务)。定义统一的接口(服务员手册);封装Reactor核心(经理),处理epoll的增删改查;实现Acceptor(迎宾)和Connection(点餐员),处理具体事件。实际项目中不用自己写全套(有成熟库如muduo、Asio),但理解这个模式,就能看懂Redis、Nginx这些高性能软件的底层逻辑了。
2025-12-13 18:32:58
882
原创 QT 架构笔记
QT 6 的设计目标是解决 QT 5 时代积累的模块依赖复杂、跨平台适配成本高、多线程性能瓶颈等问题,通过将庞大的 QT Widgets、QT Gui 模块拆分为更细粒度的组件,如将原 QT Gui 中的图形渲染功能独立为 QT Shader Tools,将字体处理模块分离为 QT Font Database。是 QT 跨平台实现的核心。Qt Quick Controls 提供了轻量级的 QML 类型,用于为桌面、嵌入式和移动设备创建性能良好的用户界面,这些控件具有统一的外观和感觉,同时支持主题定制。
2025-12-09 08:50:01
583
原创 第20章_程序的执行_《深入理解Linux内核(第三版)》
ELF格式的核心地位:ELF是Linux的主流可执行格式,其程序头表、节头表、入口地址、操作系统标识是理解加载流程的基础,必须掌握“段与节的区别”“程序头表的作用”。可执行格式与执行域的协同:格式负责“解析文件”,执行域负责“兼容系统ABI”,二者结合实现“跨格式、跨系统”程序执行,这是Linux兼容设计的核心。execve系统调用的流程:从用户态封装到内核态解析、地址空间重建、入口设置,每一步的关键操作(如路径解析、权限检查、格式匹配)必须清晰,尤其是“地址空间替换”与“PID不变”的矛盾统一。
2025-11-23 18:24:24
55
原创 CMakeLists.txt和Makefile的差别
特性Makefile核心角色构建脚本(直接执行)构建配置文件(生成构建脚本)跨平台性差(主要支持类 Unix)好(核心优势)语法独特、严格、偏向命令式现代、简洁、偏向声明式可读性较低,尤其是复杂项目较高依赖管理手动管理或借助外部工具自动推导功能基础编译链接强大且丰富(查找库、安装、测试等)适用项目规模小型中大型学习曲线较陡(语法特殊)中等(概念多但逻辑清晰)生态系统较小庞大(广泛用于开源项目)
2025-11-21 23:03:58
64
原创 -o0、-o1、-o2、o3优化的差别
特性-O0(无优化)-O1(基础优化)-O2(充分优化)-O3(极致优化)核心目标快速编译,易于调试基本性能提升最佳性价比,平衡性能与编译时间极致性能编译速度非常快快较慢非常慢可执行文件大小大中小可能最大运行速度非常慢中快可能最快可调试性非常好一般差非常差内存占用 (编译时)低中高非常高风险无低低中等 (可能引入bug)适用场景开发/调试快速测试,对性能有一定要求生产环境默认计算密集型,已充分测试的代码。
2025-11-21 21:49:43
88
原创 CMake的Debug 模式的编译选项_复习
除了默认选项,你通常还需要添加自己的编译标志,比如开启更多警告、启用地址 sanitizer 等。指定构建类型: 使用命令行参数。默认行为: CMake 会自动设置-g和-O0(GCC/Clang) 等基础调试选项。自定义选项推荐使用和。结合生成器表达式来精准控制。开启严格的警告 (启用 Sanitizers () 来捕获内存错误。调试符号与优化: 根据需求选择-g-g3和-O0-Og。
2025-11-21 21:40:19
70
原创 C++14和C++17异同
总的来说,C++14 主要是对 C++11 的完善和优化,而 C++17 则是一次意义重大的更新,它带来了更多能够改变编程范式、提升代码质量和运行效率的特性。在实际项目中,如果条件允许(编译器等工具链支持),升级到 C++17 通常是值得的。你可以从使用处理可选值、用避免字符串拷贝、用结构化绑定处理多返回值等场景开始,逐步体验现代 C++ 带来的便利与强大。
2025-11-21 21:21:33
690
原创 进程间通信方式_复习
进程间通信的核心是“突破地址空间隔离”,不同IPC方式的差异本质是数据存储位置(内核/内存/网络)和同步机制的不同。实际开发中需根据“效率、可靠性、适用范围”选择合适的方式,同时注意资源清理(如删除消息队列、共享内存、信号量),避免系统资源泄漏。
2025-11-21 08:58:35
47
原创 第19章_进程通信_《深入理解Linux内核(第三版)》
资源持久化:IPC资源独立于进程生命周期,创建后需显式释放(进程退出不自动销毁),由内核统一管理。标识方式:通过“键值(key)”和“标识符(ID)”关联——键值是用户态进程创建/访问IPC资源的“索引”,标识符是内核分配的唯一标识(对应用户态可见的资源句柄)。权限控制:基于ipc_perm结构实现类文件权限(所有者、组、其他用户的读/写/执行权限),与文件系统权限模型兼容。IPC资源的“键值-标识符-权限”三重管理:理解ipc_perm。
2025-11-19 09:05:31
585
原创 Dante 音频 + 视频专用协议
Dante音频+视频专用协议融合方案不是简单叠加,而是优势互补的系统级创新音频优势保留:Dante提供专业级无损音频和微秒级同步,这是任何视频协议无法单独实现的视频传输增强:通过与SRT/NDI/RTMP等视频协议集成,Dante突破了自身视频能力的局限,适应更广泛场景统一管理:Dante Controller和DDM平台提供单一控制点,简化复杂系统的管理和维护选择建议。
2025-11-18 08:28:55
321
原创 拉流和推流协议
速度排名推流:WebRTC (最快) > SRT > RTSP > HTTP-FLV > RTMP > HLS/DASH (最慢)拉流:RTSP (最快) > WebRTC > HTTP-FLV > LL-HLS > DASH > 标准HLS (最慢)最新发展方向WebRTC标准化:WHIP/WHEP成为IETF标准,简化与传统流媒体集成低延迟HLS:LL-HLS成熟,延迟降至2-3秒,兼顾兼容性和实时性QUIC应用:Media over QUIC (MOQ)开始商用,连接建立时间减少66%
2025-11-18 00:10:53
517
原创 分辨率、帧率、码率
FFmpeg 是一个开源的跨平台音视频处理库,包含了音视频的编解码、封装、解封装、滤镜、播放等功能。核心库:libavcodec:音视频编解码库libavformat:音视频封装/解封装库libavfilter:音视频滤镜库libavdevice:输入/输出设备库libavutil:通用工具库在// ... 其他像素格式在中,AVRationalint num;// 分子int den;// 分母帧率通常表示为AVRational24fps →{24, 1}25fps →。
2025-11-17 23:49:08
728
原创 第18章_Ext2和Ext3文件系统_《深入理解Linux内核》
重点难点Ext2的块组布局与超级块、inode的作用Ext2的多级间接块地址映射(计算最大文件大小)inode的结构与块指针分布Ext3日志机制的实现(日志记录、提交/恢复流程)Ext2的磁盘空间分配策略(块/inode分配)Ext3三种日志模式的区别与适用场景Ext3与Ext2的兼容性设计日志与数据的同步机制(避免数据不一致)第18章围绕Ext2和Ext3的实现展开,Ext2的核心是“高效的磁盘布局+多级块映射”,解决了小文件快速访问和大文件存储的需求;
2025-11-17 23:30:48
774
原创 Linux 系统下使用 C 语言实现的简单 TCP 服务器
上述代码只能处理一个客户端连接,处理完后程序就会退出。是 Linux 下最高效的 I/O 多路复用技术,适合处理高并发场景。
2025-11-17 23:23:29
861
原创 Linux内核态和用户态的区别
核心结论:Linux内核态与用户态是基于「特权隔离+资源管控」的核心设计,通过CPU特权分级、地址空间隔离、严格切换机制,实现系统安全、稳定与资源有序分配,两者在特权级别、资源访问、运行职责、故障影响等维度存在本质差异,且配合完成所有系统操作。
2025-11-17 23:08:16
509
原创 std::shared_ptr 为什么要计数?使用场景?
自动管理生命周期:无需手动调用deleteshared_ptr根据计数自动判断何时释放对象。安全共享所有权:多个指针可以放心地指向同一个对象,不用担心“谁该释放”“何时释放”的问题。避免双重释放和内存泄漏:计数为0时才释放对象,确保对象只被释放一次;只要有指针引用,对象就不会被提前释放。计数的目的通过引用计数,实现了“多个指针共享同一个对象”的安全管理,核心是解决双重释放和内存泄漏问题。核心场景:多线程共享对象、容器存储动态对象、复杂结构的循环引用(配合weak_ptr。
2025-11-16 22:06:53
877
原创 详解std::enable_shared_from_this
是一个工具,用于让一个已经被管理的对象能够安全地获取指向自身的。核心方法是,它返回一个与现有shared_ptr共享所有权的shared_ptr。核心原理是基类内部维护了一个weak_ptr,当第一个shared_ptr指向对象时,这个weak_ptr被初始化。就是通过来获取shared_ptr的。使用条件类必须公有继承。对象必须由管理。不要在构造函数中调用。典型应用场景需要将对象自身的指针作为参数传递给其他函数,同时希望延长对象的生命周期。在异步回调中,确保回调执行时对象仍然有效。
2025-11-16 22:00:36
806
原创 第17章_页框回收与交换_《深入理解Linux内核(第三版)》
当页框回收无法满足内存申请(free页框持续<min,且无更多可回收页),内核触发,选择“最该杀死”的进程释放内存,这是内存管理的“最后防线”。重难点核心内容易混淆点/注意事项LRU链表机制4个LRU链表(active_anon/inactive_anon/active_file/inactive_file)的维护混淆“匿名页/文件页”与“active/inactive”的分离逻辑;忘记PG_active标志的作用swap机制。
2025-11-15 18:00:46
811
原创 第16章_访问文件_《深入理解Linux内核(第三版)》
第16章「访问文件」是Linux内核中用户态进程与文件数据交互的核心枢纽,承接第12章(虚拟文件系统VFS)、第15章(页高速缓存),连接第9章(进程地址空间)与第14章(块设备驱动),最终实现“用户请求→内核处理→数据传输”的完整链路。本章核心聚焦4种文件访问方式的内核实现:缓存I/O读写、内存映射(mmap)、直接I/O(O_DIRECT)、异步I/O,以下按“整体框架→分模块详解→重难点突破”的逻辑分步拆解。文件访问是用户态程序最核心的需求之一(如读配置文件、写日志、加载可执行程序),本章的内核代码本
2025-11-15 17:40:32
1103
原创 YUV内存对齐问题
内存对齐是计算机体系结构中的一个基本概念。它指的是数据在内存中的起始地址必须是某个特定值(通常是 2、4、8 或 16 的倍数)的整数倍。内存对齐是为了提升性能和满足硬件要求而对数据在内存中存储地址的限制。在 YUV 平面格式中,对齐主要影响每一行像素数据的长度。为了对齐,行的末尾会被填充额外的字节。FFmpeg 通过AVFrame结构体中的linesize数组来告知用户每个平面每行的实际字节数(包含填充)。在所有涉及到访问视频帧像素数据的操作中,你都必须使用linesize而不是简单地用。
2025-11-13 23:54:04
866
原创 FFmpeg中的像素
像素(Pixel)是「图像元素」(Picture Element)的缩写,是数字设备(屏幕、相机、硬盘)中图像的最小基本单位。它无法再分割,所有数字图像(照片、视频帧)都是由无数个像素按矩阵排列组成。FFmpeg 中所有像素格式都在中通过AV_PIX_FMT_YUV420P, // 平面格式:Y、U、V 分开存储,U/V 4:2:0 采样AV_PIX_FMT_YUYV422, // 打包格式:Y0 U Y1 V 交替存储AV_PIX_FMT_RGB24, // 打包格式:R G B 连续存储。
2025-11-13 08:59:57
619
原创 第15章_页高速缓存_《深入理解Linux内核(第三版)》
定义:页高速缓存是内核在RAM中开辟的一块内存区域,以“页(4KB/2MB等,与硬件页框大小一致)”为基本单位,缓存磁盘文件的逻辑数据(包括普通文件、块设备文件、管道等)。核心作用空间换时间——将频繁访问的磁盘数据暂存于内存,后续访问直接从内存读取,避免频繁读写磁盘(磁盘访问延迟通常是内存的10万倍以上)。缓存对象:以“文件页”为主,每个缓存页对应文件的一个“逻辑偏移量”(如文件的第0个页、第1个页),而非物理磁盘块(早期缓冲区高速缓存缓存磁盘块,本章会讲两者的整合)。
2025-11-13 00:26:14
764
原创 Qt 信号与槽机制深入理解
Qt 信号与槽机制深入解析与代码实践在这个示例中,MyClass 类声明了三个信号:signalWithoutParams () 是一个无参数信号;signalWithParams (int, const QString&) 是一个带两个参数的信号;valueChanged () 被重载为两个版本,分别接收 int 和 QString 类型的参数。同时,类中还声明了三种不同访问权限的槽函数。1.2 Q_OBJECT 宏的作用与实现原理。
2025-11-12 23:59:20
881
原创 第14章_块设备驱动程序_《深入理解Linux内核(第三版)》
通用块层的biorequest三者的关系(抽象与适配的核心)。I/O调度算法的选择逻辑(硬盘vs闪存设备的差异)。驱动中请求处理与中断的同步(异步I/O的核心)。页缓存与块设备的交互(数据一致性保障)。基于Linux 2.6内核框架,实现一个自定义I/O调度器优先级划分:将I/O请求分为“高优先级”(,如数据库日志写)和“普通优先级”(默认),高优先级请求优先被处理;请求合并:仅合并相同优先级、连续扇区的请求(不同优先级请求不合并);排序规则。
2025-11-12 23:42:14
635
原创 第13章_I/O体系结构和设备驱动程序_《深入理解Linux内核(第三版)》
第13章是Linux内核“硬件交互层”的核心,核心目标是解决“内核如何与I/O设备通信”的问题——通过抽象的I/O体系结构屏蔽硬件差异,通过设备驱动程序作为“内核与硬件的中间翻译官”,最终为用户态提供统一的设备访问接口(如通过下的设备文件操作硬件)。本章逻辑链:I/O硬件交互基础→设备驱动程序模型(统一管理)→设备文件(用户态入口)→具体设备驱动(字符、块设备),所有重难点均围绕“抽象适配”“性能优化”“统一接口”展开。要理解驱动程序,必须先掌握内核与I/O设备的底层交互方式,核心组件包括I/O端口、I/
2025-11-12 09:04:47
791
原创 第12章_虚拟文件系统_《深入理解Linux内核(第三版)
提供统一的文件操作API(POSIX兼容),屏蔽物理文件系统差异;管理已挂载文件系统的元数据(如挂载点、超级块信息);维护高效的缓存(目录项缓存、索引节点缓存),提升文件操作性能。通过4个核心数据结构(super_block、inode、dentry、file)抽象物理文件系统的核心概念;通过统一的操作接口(super_operations、inode_operations、file_operations)屏蔽底层差异;通过dentry缓存和inode缓存提升文件操作性能;
2025-11-09 22:28:45
680
原创 第11章_信号_《深入理解Linux内核》
信号是Linux中用于传递异步事件的机制,本质是内核向进程发送的“通知”,用于告知进程发生了特定事件(如硬件异常、用户指令、内核触发的状态变化)。信号与其他IPC(如管道、共享内存)的区别:信号是“异步通知”,无需进程主动轮询;传递的是“事件标识”,而非大量数据。信号的核心作用:进程间异步通信(如kill命令发送信号终止进程);通知进程异常(如除零操作触发SIGFPE内核向进程传递状态(如闹钟超时触发SIGALRM。
2025-11-08 22:44:26
999
原创 Linux文件类型详解:.a、.so、.ko
是三种关键的二进制文件类型,分别对应静态库、动态库和内核模块。(Kernel Object)是Linux内核的可加载模块,用于动态扩展内核功能(如驱动、文件系统)。(Shared Object)是动态链接库,程序运行时按需加载,多个进程共享同一份库代码。通过合理选择文件类型,开发者可以优化程序性能、降低部署复杂度,并实现灵活的功能扩展。编译时,静态库的代码会被完整复制到最终可执行文件中。(Archive)文件是多个目标文件(在Linux系统中,
2025-11-03 23:32:39
485
原创 第十章_系统调用_《深入理解Linux内核(中文第3版)》
触发机制:int 0x80(兼容)vs sysenter(高效),核心是特权级切换和内核入口查找;参数传递:用eax存系统调用号,ebx/ecx等存参数,超过6个参数用内存地址传递;地址检查:通过get_userput_user和修正代码,处理用户态无效地址,保证内核安全;返回流程:用eax传递返回值(成功非负,失败负错误码),iretsysexit切换回用户态;核心工具(系统调用表)、TSS(sysenter栈切换)、修正代码(地址错误处理)。
2025-11-03 23:03:29
922
原创 第九章_进程地址空间管理_《深入理解Linux内核(中文第3版)》
第九章是虚拟内存机制的核心实现章节,核心目标是内核如何为进程构建、管理虚拟地址空间,实现“按需分配、内存共享、安全隔离”。结合书中第九章(以下简称“本章”)内容,按“基础概念→核心数据结构→关键流程→实践接口”的逻辑,一步一步拆解重难点,所有内容均对应指定文件第九章具体小节。在学具体机制前,先明确本章的核心定义与划分,这是理解后续内容的前提:Linux将进程的4GB虚拟地址空间分为两部分(本章核心划分):关键意义:用户态进程无法直接访问内核态地址(硬件保护),需通过系统调用或异常陷入内核态,确保内存安全(本
2025-11-03 22:09:36
999
原创 Fuzzing知识框架简单入门
C++ 模糊测试是发现深度漏洞的有效手段。从小开始:先用简单种子文件开始测试,逐步完善语料库。持续集成:将模糊测试集成到 CI/CD 流程中,实现持续的安全测试。多工具结合:不同模糊测试工具各有优势,可结合使用提高漏洞发现率。耐心等待:有效的模糊测试通常需要长时间运行(数小时甚至数天)。
2025-11-02 17:03:15
852
C++基于Lambda表达式的匿名函数对象设计:现代C++编程中STL算法与函数式编程的高效实现
2025-11-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅