- 博客(1589)
- 收藏
- 关注
原创 Linux 用户态内存分配:glibc malloc
多线程场景下,arena是glibc malloc实现高效并发的核心,相当于每个线程专属的内存“小仓库”。从定义上来说,Arena是glibc malloc内部管理的一个独立的堆内存分配区域,每个Arena都拥有一套独立的内存管理数据结构,包括空闲列表(bins)、内存块(chunks)等 ,这些数据结构用于管理和维护该Arena内的内存分配与释放操作。Arena主要分为两种类型:主分配区(main arena)和非主分配区(non-main arena)。
2026-06-29 22:16:54
304
原创 Linux内核进程:一文搞懂进程创建与退出的底层逻辑
大家好,我是蟹老板~今天我们继续聊 Linux 进程~,面试别人和被别人面试,进程的创建与退出永远是绕不开的坎。说真的,很多人写了无数次 fork,连它到底怎么在内核里创建出进程的都没掰扯明白,更别说 vfork、clone 这些弯弯绕绕了。今天趁着周六有空,带大家从头到尾捋一遍——进程是怎么“生”出来、又是怎么“死”干净的。文章有些长~万字预警。
2026-06-22 15:33:40
153
原创 搞懂glibc malloc:主流用户态内存分配器核心原理精讲
多线程场景下,arena是glibc malloc实现高效并发的核心,相当于每个线程专属的内存“小仓库”。从定义上来说,Arena是glibc malloc内部管理的一个独立的堆内存分配区域,每个Arena都拥有一套独立的内存管理数据结构,包括空闲列表(bins)、内存块(chunks)等 ,这些数据结构用于管理和维护该Arena内的内存分配与释放操作。Arena主要分为两种类型:主分配区(main arena)和非主分配区(non-main arena)。
2026-06-22 15:16:48
297
原创 .tar.gz 的双后缀之谜:先打包,后压缩,缺一不可
今天下午摸鱼翻代码,新来的实习生凑过来问我:“哥,为什么这 Linux 里的文件后缀怎么跟老太太的裹脚布一样有 .tar.gz 两个后缀啊?直接 .tgz 不行吗,非要这么啰嗦?我看着屏幕,手里的瑞幸突然就不香了。这种问题,要是搁我十年前刚进厂那会儿,带我的师傅估计直接一巴掌呼过来,然后甩我一句:“去读读 Unix 哲学!但现在我这发际线也退得差不多了,脾气也磨没了,只想和你们这帮年轻人唠唠,这种看似“脱裤子放屁”的设计,背后藏着多少程序员的浪漫和辛酸。
2026-06-12 14:50:42
195
原创 从内核视角,看Linux文件读写过程
原作者:Linux教程今天咱们来聊一个「看似简单、实则硬核」的——。我们每天敲 cat file.txt、用 fread() 读文件、或者 fwrite() 写日志,有没有思考过为什么读写这么快?为什么改了文件不立刻落盘?很多朋友觉得读写过程难搞懂,什么“系统调用”、“虚拟文件系统”、“页缓存”听着就头大,其实只要顺着“用户操作→内核响应→硬件执行”的逻辑拆解,就能轻松搞懂文件读写的底层原理。今天我们从的角度,拆解文件读写过程,搞懂“我们写的内容,到底是怎么存到磁盘里的”。
2026-06-08 17:03:23
480
原创 Linux 内核:为何必须使用 copy_from_user?
原作者:Linux教程在 Linux 里,用户态与内核态之间的数据传递是一项高频且基础的操作,你或许会疑惑,为啥数据从用户态进入内核态,不能简单粗暴地直接访问,而非得借助copy_from_user呢?接下来我们将围绕这两个关键问题展开深入讲解。这两个问题,是理解 Linux 内核数据传递机制的核心,也是每一个 Linux 开发者必须掌握的关键知识点。
2026-05-27 14:34:16
364
原创 Linux启动机制深度剖析:BIOS/UEFI、GRUB、内核初始化
有时候咱们的系统有特殊需求,比如用了特殊的硬件,默认的initramfs里没有对应的驱动,这时候就需要自定义initramfs。Fedora、CentOS这些主流发行版,用dracut工具就能轻松搞定,它会自动检测系统硬件,把需要的驱动打包进去,咱们也能手动添加或删除驱动,适配自己的系统。Arch Linux用的是mkinitcpio工具,操作也很简单,新手跟着教程走就能完成。咱们以Nginx服务为例,教大家写一个简单的unit文件,新手也能学会。
2026-05-18 14:42:15
446
原创 Linux:谁把根目录卸载了?
我们平时说的硬盘、SSD,本质只是一堆能存储数据的物理扇区,本身没有“文件”和“目录”的概念。而文件系统,就是给这些原始存储做的一层“智能管理层”,相当于存储设备的管家,负责把零散的物理空间,整理成用户能看懂、能操作的目录和文件结构。它的核心作用,是把底层硬件的物理寻址、数据读写,转换成用户层的简单操作。我们敲一行ls看文件、cp复制文件,底层都是文件系统在做转换:定位文件存储位置、记录权限属性、管理存储空间,屏蔽了硬件操作的复杂性,让我们不用关心数据存在磁盘哪个扇区,只需专注于文件本身的操作。
2026-05-14 14:59:00
436
原创 SRAM 与 DRAM:计算机内存的技术底层与差异
内存就如同计算机的,区别于硬盘负责长期存储的特性,它承担着CPU运行程序、处理数据时的临时存取任务,读写速度直接决定了系统响应效率和多任务流畅度。在内存的核心谱系中,与是两大支柱性存在,二者同属随机存取存储器,底层架构、工作机理与性能特质却有着云泥之别,近乎两套完全独立的硬件运行逻辑。
2026-05-11 14:01:52
485
原创 深入底层:Linux MMU 工作原理全解
MMU,全称Memory Management Unit(内存管理单元),是集成在CPU内部的专用硬件组件,也常被称为分页内存管理单元(PMMU)。它的核心使命很简单:接收CPU发出的内存访问请求,完成“虚拟地址”到“物理地址”的转换,同时管控内存访问权限,确保系统稳定、安全运行。这里要注意一个关键细节:MMU是硬件组件,不是软件程序——它由逻辑电路构成,能以极高的速度完成地址转换,这也是它能支撑CPU高速运行的核心原因。
2026-05-09 14:22:46
486
原创 XDP 深度详解:颠覆传统 Linux 内核协议栈
XDP,全称 eXpress Data Path,即快速数据路径,是基于 eBPF(Extended Berkeley Packet Filter)机制的一项 Linux 内核技术。它就像是一位技艺高超的网络数据处理大师,能够在内核空间中对数据包进行高性能的处理和转发。通过巧妙地利用 eBPF 的强大功能,XDP 可以在数据包到达网络驱动层的第一时间,就对其进行针对性的高速处理。XDP 为用户提供了一个极为灵活的编程接口,这就好比给了开发者一个充满无限可能的 “网络实验室”。
2026-05-06 16:10:26
490
原创 吃透 Linux 调度机制:从 CFS 到实时调度(RT)的面试通关指南
但大家有没有想过,哪怕是多核CPU,同一时刻(即操作系统调度的基本单位)只能专注执行一个线程——这是硬件层面的硬限制,而让多任务“看起来并行”的关键,就是内核的调度机制。调度机制就像是CPU资源的“专属分配官”,核心工作就是定规则:谁先占用CPU、占用多久、什么时候切换。它的设计直接决定了系统够不够快、能处理多少任务、稳不稳定——比如服务器卡顿、应用响应慢,很多时候不是硬件不行,而是调度策略没适配好。
2026-04-20 15:45:27
410
原创 图解 ARM SMMU:新手也能懂的原理
但很多人不知道,异构计算和设备虚拟化这两个技术的背后,有一个容易被忽略却至关重要的“隐形枢纽”——ARM SMMU(系统内存管理单元)。它就像一座架在处理器和外设之间的桥梁,专门管I/O设备的地址翻译,说白了,它的性能好不好,直接决定了整个系统的I/O内存管理效率,甚至影响到我们平时用的虚拟机、高清视频、云服务能不能顺畅运行。以前大家都用DMA+物理地址访问的方式,看似省事,实则问题一堆。比如多个虚拟机共享一个物理设备时,不同虚拟机的地址空间怎么隔离?会不会出现地址冲突、数据泄露?
2026-04-15 14:50:06
509
原创 一文读懂 sysfs:Linux 内核设备模型与文件系统实现
sysfs 是 Linux 内核中基于内存的虚拟文件系统,通常挂载于/sys目录 ,它并不占用实际的磁盘空间,而是将内核中的对象以一种层次化的目录结构呈现给用户态。sysfs 的核心在于以 kobject 为基础,组织和展示内核对象的层次关系。kobject 是 Linux 设备模型中的基本数据结构,它包含了引用计数、层次结构等关键信息,每个 kobject 在 sysfs 中都对应一个目录,使得内核中的对象能够以直观的文件系统形式被用户态访问和管理。动态性。
2026-04-14 14:12:10
466
原创 Linux 网络编程核心:环形缓冲区的设计与实现
环形缓冲区,光听名字就能脑补出它的大致形态——它物理上是一段连续的内存空间,逻辑上却能实现首尾衔接,像个循环的环。在这个环形的世界里,数据遵循 FIFO(先进先出)的原则进行存储和读取,就像排队一样,先来的先处理。它通过一对读写指针来管理数据的进出,写指针指向数据写入的位置,读指针指向数据读取的位置。当写指针到达缓冲区末尾时,会自动回到开头继续写入;读指针也是如此。这种独特的设计,使得它能够高效地循环复用内存空间,避免了传统缓冲区的诸多问题,成为了解决生产者 - 消费者模型中速度差异的有力工具。
2026-04-07 15:07:02
380
原创 Linux内核Page Cache全景解析
聊Page Cache之前,先给大家建立一个直观认知:Linux系统中,内存的读写速度是磁盘的上千倍,内核为了填平这层速度鸿沟,特意在内存中开辟了一块“专属缓存区”,这就是Page Cache(页高速缓冲存储器),相当于给磁盘数据建了个“内存中转站”。从本质上讲,Page Cache是内核专门用于缓存文件数据的内存区域,64位系统默认以8KB为单位(32位系统4KB),和内存页大小保持一致,这样能最大程度减少内存与磁盘的数据交换开销。
2026-04-01 16:50:11
457
原创 搞懂 Linux 进程调度核心:一睡眠与唤醒的底层逻辑
作为一名 Linux 开发领域的博主,发现进程阻塞和资源等待问题简直是大家的 “心头大患”。就拿网络 I/O 操作来说,当我们的程序发起网络请求后,数据传输需要时间,这期间进程若一直占用 CPU 资源空转,无疑是巨大的浪费。又比如在多进程同步场景下,进程可能需要等待共享资源的解锁,盲目等待只会拖慢整个系统的运行效率。而进程的睡眠与唤醒机制,是 Linux 内核实现高效 CPU 资源调度的核心。它能让进程在等待资源时主动进入睡眠状态,让出 CPU 给其他更需要的进程,等资源就绪后再被唤醒继续执行。
2026-03-30 16:44:41
400
原创 一文吃透 Linux 文件描述符:揭开「一切皆文件」的底层逻辑
在 Linux 系统中,文件描述符(File Descriptor)是一个非负整数,它是进程访问文件或其他 I/O 资源(如套接字、管道等)的唯一标识。简单来说,文件描述符就像是一个 “资源索引”,它指向内核中被打开的文件或资源,是进程与内核之间进行文件操作的桥梁。需要注意的是,文件描述符本身并不是文件,而是一个指向文件或资源的标识符。每个进程都维护着一个独立的文件描述符表(File Descriptor Table),这个表记录了该进程当前打开的所有文件描述符及其对应的内核文件对象。
2026-03-26 14:57:01
397
原创 腾讯 C++ 二面真题:std::make_shared 与构造函数传指针的核心区别
回顾一下,make_shared和构造函数传裸指针创建shared_ptr对象主要有以下几方面区别。内存分配上,make_shared一次分配搞定对象和控制块的连续内存,构造函数传裸指针则需两次分配,效率和缓存友好性上make_shared更优。异常安全方面,make_shared把对象创建、控制块分配和构造放一个函数,原子操作保障异常安全;构造函数传指针若创建对象后控制块构造抛异常,会内存泄漏。内存释放时机,make_shared因对象和控制块同块内存,要等强弱引用计数都为 0 才释放;
2026-03-23 16:57:03
382
原创 C++ RAII 到底是什么?
自定义资源管理类时,遵循一定的规则是确保代码正确性和可靠性的关键。其中,“五法则” 和 “零法则” 是两个重要的指导原则。
2026-03-20 17:43:34
439
原创 新手也能看懂的 Linux 共享内存
共享内存,简单来说,是 Linux 中一种能够让多个进程直接访问同一块物理内存空间的技术。在传统的进程通信方式中,比如管道(Pipe)和消息队列(Message Queue),数据在传递时需要进行多次拷贝,先从一个进程的用户空间拷贝到内核空间,再从内核空间拷贝到另一个进程的用户空间。这就好比你要把一份文件从一个房间送到另一个房间,每次都要经过一个中转站,先把文件放在中转站,然后再从中转站取走送到目标房间,效率相对较低。
2026-03-17 14:43:16
436
原创 C++ 多线程:数据竞争
为了进一步简化锁的操作,提高代码的可读性和可维护性,可以封装通用的监控类,将锁的管理逻辑封装在类中,就像为锁穿上了一层智能的 “外衣”,只需要关注业务逻辑,而无需担心锁的细节。public:在这个Monitor类中,使用了std::mutex来保护共享数据data,并通过重载operator()运算符,提供了一种简洁的方式来执行对data的操作。
2026-03-16 15:54:51
417
原创 底层逻辑:C++ 类型萃取(Type Traits)解析
类型萃取,从本质上来说,是一种强大的 C++ 模板元编程技术。它允许我们在编译期获取并利用类型的各种信息,比如判断一个类型是否为整数类型、是否为指针类型、是否为常量类型等。通过这些信息,我们可以编写更加通用、高效且类型安全的代码。简单来讲,类型萃取就像是一个智能的 “类型探测器”,它能在代码编译阶段就对各种类型进行 “探测” 和 “分析”,并根据探测结果做出不同的决策。在 C++ 的世界里,类型萃取是泛型编程的重要支撑。泛型编程的目标是编写与类型无关的代码,以提高代码的复用性。
2026-03-12 14:21:57
432
原创 C/C++为何依赖头文件,而 Java/Python 无需?
/ math.h - 头文件(接口声明)// math.c - 源文件(功能定义)在C/C++开发体系中,编译器需预先获知函数、类、变量的存在性及接口规范,方可完成代码的语法校验与编译。头文件的核心作用便是提供此类接口信息,相当于编译器可参考的“接口说明书”。
2026-03-11 14:53:38
453
原创 C++ 析构函数到底怎么用?原理、场景、实战一篇讲透
析构函数是一种特殊的成员函数,它就像是一个默默守护的 “清洁工” ,专门负责在对象的生命周期结束时,进行必要的清理工作。与普通函数不同,析构函数的名字很有特点,是在类名前面加上一个波浪号 “\”。比如,对于一个名为 “Student” 的类,它的析构函数就是 “\Student ()”。析构函数没有返回类型,这一点和构造函数一样,而且它也没有参数,所以不能被重载,一个类只能有一个析构函数。当对象即将被销毁时,析构函数就会自动被调用,就像下课铃响了,值日生会自动开始打扫教室一样。
2026-03-10 15:26:12
422
原创 快手 C++ 面试题:如何突破封装访问私有成员?
关于如何拿到类中私有成员变量的值,就跟大家分享到这里。我们重点需要关注回答思路:我们重点需要关注的就是这个回答思路:正确的方式是什么?其他的方案有哪一些缺陷?它的合理使用场景是什么?通过这种回答呢就能够比较严谨的体现我们对它的一个理解。往期精选干货| C/C++开发从迷茫到进阶,一站式成长指南覆盖选方向、找工作、冲大厂、定路线、备面试、练实操全场景,帮你精准避坑,高效进阶:👉【就业避坑】C++ 就业前景全解析:为什么劝退声不断,大厂核心岗仍刚需 C++?👉【后端进阶】
2026-03-09 15:56:39
432
原创 搞懂这道题,再也不怕面试官问 move/forward 和完美转发
掌握std::move和std::forward的关键,不在于死记底层代码,而在于理解它们的“语义本质”:std::move:“我不管这是什么,把它变成可以移动的右值,我要转移它的资源”;std::forward:“我不改变它的本质,原封不动地把它传递给下一个函数”。
2026-03-07 15:00:55
430
原创 MySQL连接池(C++实现):原理、调优
做过高并发的同学都懂,数据库往往是压测时第一个扛不住的环节 —— 尤其是 MySQL连接的创建销毁,简直是性能杀手。而MySQL连接池,正是解决这一问题的 “智能系统”。它提前创建一定数量的数据库连接并维护起来,当应用程序需要访问数据库时,直接从连接池中获取可用连接,使用完成后再将连接归还到池中,避免了频繁创建和销毁连接的开销。但很多人对连接池的原理不了解,在实际使用中要么配置不当导致性能浪费,要么遇到连接失效、池满阻塞等问题。
2026-03-06 16:23:54
483
原创 C/C++ 后端项目:从零实现死锁检测
/ 线程 ID// 锁的地址(作为唯一标识)// 该锁被多少个其他线程等待(入度计数)} node;node n;// 当前顶点对应的线程与锁信息// 邻接表指针,指向依赖的下一个线程} vertex;// 图的邻接表:每个线程指向其依赖的线程int num;// 当前图中线程节点数量// 记录每把锁当前被哪个线程持有// 已记录的锁数量死锁检测的核心在于将资源竞争关系建模为有向图,并检测其中是否存在环路。图的动态构建。
2026-03-05 17:47:50
490
原创 面试官最爱问:进程和线程到底有啥区别?
CPU 寄存器值累加器(存计算结果)、程序计数器(PC,存下条指令地址)、栈指针(存栈顶位置)等记录车间设备参数(如机床转速、卡尺当前读数)进程状态由 PCB 管理,含 “就绪 / 运行 / 阻塞” 等状态(如进程因等待网络请求进入 “阻塞” 态)记录车间生产进度(如 “待料中”“加工中”“已完工”)地址空间信息页表 / 段表(映射虚拟内存到物理内存)、内存权限(如代码区只读、数据区可读写)记录车间布局(如 “物料区在东、设备区在西”)+ 区域规则(如 “物料区禁止吸烟”)
2026-03-04 17:43:29
410
原创 CPU 如何切换任务?从内核视角理解两种上下文
作为 C++ 开发者,你一定写过多线程程序吧?比如用 Qt 的 QThread 做界面渲染,或者用 pthread 搞音视频解码,跑起来感觉 "多任务并行" 丝滑无比。但你有没有突然好奇:就那几颗 CPU 核心,怎么能同时扛住浏览器、编译器、音乐播放器一堆程序?难道 CPU 真的会分身术?其实真相很扎心 ——CPU 根本不会同时干多件事!它所谓的 "多任务",本质就是高速切换任务的 "障眼法",而这背后的核心操作,就是咱们今天要扒的「CPU 上下文切换」。
2026-03-03 20:28:25
447
原创 科大讯飞 C++ 一面真题:构造函数为何不能是虚函数?调用虚函数有何风险?
构造函数不能是虚函数:因为 vptr 还没准备好(机制冲突),而且构造是 “接生”,虚函数是 “干活”(语义矛盾),C++ 标准直接禁止;构造函数中调用虚函数,多态会失效:只会执行当前构造类的版本,还可能访问未初始化成员,尽量别这么做;析构函数要当虚函数(如果是基类):不然多态场景下会内存泄漏,纯虚析构要记得写实现。其实 C++ 的很多 “奇怪规矩”,背后都是 “避免未定义行为”—— 理解了底层逻辑,你就不会觉得 “C++ 故意刁难人”,反而会觉得 “这些规矩真香”。附录常见问题 FAQ。
2026-03-02 21:12:50
986
原创 一文读懂:基于 UDP 的 QUIC 可靠传输协议核心原理
QUIC 不是没有缺点:比如稳定性不如 TCP(毕竟 TCP 已经用了几十年),某些老设备不支持,还有 UDP 限速的问题。但就像 “智能手机刚出来时,有人嫌它续航差,但没人能阻止它取代功能机”——QUIC 解决的是 TCP 几十年没解决的痛点,是网络发展的必然趋势。IETF标准化持续推进主流浏览器均已支持Nginx 1.25.0正式支持QUIC各大云厂商积极推广是时候拥抱QUIC了!无论是为了提升用户体验,还是为了技术储备,QUIC都值得你深入了解和实践。
2026-02-28 17:10:02
1127
原创 C++ 面试必考点:string 类
在C++编程中,string类是处理字符串的核心工具,它提供了丰富的方法来简化字符串操作。相比于C风格的字符数组,string类更加安全、便捷且功能强大,还能避免C风格字符串处理中常见的内存管理问题和边界错误。
2026-02-27 17:39:20
1050
原创 Linux 高性能异步 IO:io_uring
系统调用开销过高:无论是同步 IO 还是传统异步 IO,每次 IO 请求都需要通过系统调用陷入内核态。对于高并发场景,百万级的系统调用会带来巨大的上下文切换开销,成为性能瓶颈。数据拷贝冗余:用户态与内核态之间的数据传输需要经过多次拷贝(如用户缓冲区→内核缓冲区→设备缓冲区),内存拷贝的耗时在高吞吐量场景下不可忽视。扩展性与易用性失衡:POSIX AIO 为了兼容多平台,牺牲了性能;Linux AIO 性能尚可,但仅支持 Direct IO,且接口设计复杂,难以集成到复杂应用中。减少系统调用。
2026-02-26 16:20:16
1163
原创 C++高并发精髓:无锁队列深度解析
在高性能场景中,并发数据传输的效率直接决定系统吞吐量。传统锁队列(如std::queue+std::mutex)在20线程以上高并发下,CPU时间大量消耗于内核态锁竞争(futex系统调用),线程多数时间处于等待状态,吞吐量停滞不前,甚至可能导致死锁、优先级反转等问题。而无锁编程(Lock-Free Programming)作为一种非阻塞同步范式,旨在通过原子操作和内存序控制,实现线程间的高效数据交换,从而避免上述问题。
2026-02-08 14:21:06
928
原创 C++11 进阶:线程池手动实现,看完直接上手
线程池这东西说白了就是管理任务和线程的配对,掌握核心原理,剩下的都是语法糖这套线程池虽然只有百来行,但五脏俱全!支持任意函数、任意参数、返回值获取、线程安全、资源自动回收……简直是C++并发入门的“黄金样板”!不过老铁们注意啊:实际项目中还得考虑异常安全、任务拒绝策略、动态扩缩容啥的。但作为基础框架,它已经把核心思想给你焊死了——复用线程 + 安全队列 + 条件唤醒,三大心法,缺一不可!
2026-01-30 15:13:33
1073
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1