<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[有趣的中国人的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/m0_68617301</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; m0_68617301]]></copyright><item><title><![CDATA[从阻塞 IO 到 epoll：把 Linux 网络 IO 一次讲透]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/159997689</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/159997689</guid><author>m0_68617301</author><pubDate>Thu, 09 Apr 2026 22:07:00 +0800</pubDate><description><![CDATA[本文系统梳理了Linux网络IO的核心机制，从阻塞IO到epoll的实现原理。首先解析IO操作的本质分为等待数据就绪和数据拷贝两个阶段，重点分析了不同IO模型的区别。深入探讨了IO多路复用技术如何通过一个线程同时监控多个文件描述符，详细剖析select/poll的底层实现机制及其性能瓶颈。特别揭示了内核等待队列的工作方式，以及select/poll每次被唤醒后必须全量遍历所有fd的设计缺陷，为理解epoll的优化原理奠定基础。全文以清晰的逻辑主线串联起Linux网络IO的关键概念，帮助读者建立系统性的认知框]]></description><category></category></item><item><title><![CDATA[从网卡收到数据到 epoll 被唤醒：把 Linux 网络接收链路真正串起来]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/159931995</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/159931995</guid><author>m0_68617301</author><pubDate>Tue, 07 Apr 2026 23:23:02 +0800</pubDate><description><![CDATA[本文详细剖析了Linux网络数据从网卡接收至epoll唤醒的完整链路：首先网卡通过DMA将数据写入Ring Buffer，触发中断后由软中断处理封装成sk_buff；随后数据经过IP层和TCP层协议栈处理，根据四元组找到对应socket并放入接收队列；最后内核通过唤醒机制通知epoll_wait返回。文章重点串联了网卡收包、DMA传输、中断处理、协议栈解析、socket队列和epoll监控等关键环节，揭示了数据在内核中的真实流动路径，帮助读者构建完整的Linux网络接收链路认知框架。]]></description><category></category></item><item><title><![CDATA[【操作系统原理】线程预热]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/156099755</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/156099755</guid><author>m0_68617301</author><pubDate>Sat, 20 Dec 2025 00:36:06 +0800</pubDate><description><![CDATA[本文介绍了操作系统虚拟地址到物理地址的转换机制，重点讲解了分页管理、两级页表结构和缺页异常处理。主要内容包括：1）4KB分页的优势在于统一内存管理粒度和实现虚拟内存；2）物理内存通过页框和struct page管理；3）32位系统两级页表将地址拆分为10位页目录索引、10位页表索引和12位页内偏移；4）地址转换采用移位和掩码操作；5）页表项包含权限和状态信息；6）缺页异常时CR2寄存器保存出错地址；7）多线程共享页表，缺页异常会影响线程执行。理解这些机制是掌握多线程并发的基础。]]></description><category></category></item><item><title><![CDATA[【操作系统原理】信号]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/156099588</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/156099588</guid><author>m0_68617301</author><pubDate>Sat, 20 Dec 2025 00:24:55 +0800</pubDate><description><![CDATA[本文介绍了Linux信号机制的核心概念与应用。信号是Linux提供的异步事件通知机制，本质是操作系统向进程发送的&quot;紧急通知&quot;。文章详细讲解了信号的分类（1-31为普通信号，34-64为实时信号）、三种处理方式（默认/忽略/自定义）以及信号的常见来源（终端按键、命令调用、硬件异常等）。重点剖析了内核管理信号的机制，包括block（阻塞表）、pending（未决表）和handler（处理表）三张表的概念。文章推荐使用sigaction而非signal进行信号处理，并提供了SIGINT、SIG]]></description><category></category></item><item><title><![CDATA[【操作系统原理】IPC之命名管道、共享内存、消息队列、信号量]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/156099403</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/156099403</guid><author>m0_68617301</author><pubDate>Sat, 20 Dec 2025 00:11:42 +0800</pubDate><description><![CDATA[IPC 的核心思路（非常重要）

进程不能直接“互相读写内存”，系统的做法是：

让不同进程去访问同一份 OS 管理的共享资源
（内核缓冲区 / 共享内存段 / 消息队列对象 / 信号量对象 / 文件对象）

所以 IPC 本质就是：借助 OS 提供的系统调用 + 通信媒介]]></description><category></category></item><item><title><![CDATA[【操作系统原理】进程间通信之管道]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/156099263</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/156099263</guid><author>m0_68617301</author><pubDate>Sat, 20 Dec 2025 00:03:13 +0800</pubDate><description><![CDATA[本文介绍了操作系统中的进程间通信（IPC）机制，重点分析了管道（pipe/FIFO）的工作原理和应用场景。文章首先阐述了进程隔离性导致直接内存访问不可行，必须通过OS提供的共享资源实现通信。详细讲解了匿名管道的核心模型、四种关键情形（空读阻塞、满写阻塞、写端关闭读EOF、读端关闭写SIGPIPE）以及五大特征（亲缘限制、同步机制、生命周期、字节流特性、半双工）。命名管道FIFO解决了非亲缘进程通信问题。文章还探讨了进程池的管道应用模式，对比了不同IPC方式的适用场景，并强调工程实践中需注意关闭无用文件描述符]]></description><category></category></item><item><title><![CDATA[【操作系统原理】软硬链接与动静态库]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/156099126</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/156099126</guid><author>m0_68617301</author><pubDate>Fri, 19 Dec 2025 23:48:27 +0800</pubDate><description><![CDATA[本文深入解析了软链接与硬链接的本质区别、静态库与动态库的生成与链接机制，以及程序从可执行文件到运行的完整链路。硬链接共享inode，删除不影响数据；软链接独立存储目标路径，可跨文件系统。静态库通过ar打包.o文件，链接时拷贝代码；动态库采用位置无关代码，运行时加载共享内存。程序运行流程包括ELF文件映射、mm_struct地址空间创建、PC指向入口点等关键步骤，动态库通过LD_LIBRARY_PATH或系统路径加载。全文通过技术对比和流程拆解，系统性地阐述了Linux文件链接与程序加载的核心机制。]]></description><category></category></item><item><title><![CDATA[【操作系统原理】重定向和文件系统]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/156098959</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/156098959</guid><author>m0_68617301</author><pubDate>Fri, 19 Dec 2025 23:37:04 +0800</pubDate><description><![CDATA[本文深入剖析了Linux文件系统与文件描述符(fd)的底层实现原理。从用户态的简单文件操作出发，揭示了内核态的完整处理链路：fd→task_struct→files_struct→fd_array→struct file→VFS→具体文件系统。详细讲解了fd分配机制、0/1/2标准流的由来、文件系统磁盘结构(inode、data block等)、路径解析过程，以及文件创建/删除的本质。重点强调了fd只是进程私有的索引，struct file才是内核中的&quot;打开文件对象&quot;，并通过VFS的多态]]></description><category></category></item><item><title><![CDATA[【C++11】Lambda 表达式、可变参数、emplace_back 系列]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/155111994</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/155111994</guid><author>m0_68617301</author><pubDate>Fri, 21 Nov 2025 22:45:12 +0800</pubDate><description><![CDATA[本文摘要： Lambda表达式本质是编译器生成的匿名函数对象，通过捕获列表管理外部变量访问，支持按值/引用捕获和mutable修饰。 堆上对象可通过私有构造函数+静态工厂方法实现，禁用拷贝构造确保只能通过new创建。 可变参数模板提供类型安全的参数传递，C++17折叠表达式简化了可变参数处理。 emplace_back相比push_back能避免临时对象构造，直接在容器内存中创建元素。 （字数：150字）]]></description><category></category></item><item><title><![CDATA[【操作系统原理】文件fd]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/155111806</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/155111806</guid><author>m0_68617301</author><pubDate>Fri, 21 Nov 2025 22:31:28 +0800</pubDate><description><![CDATA[本文介绍了Linux系统中文件与文件描述符(fd)的底层实现机制。从应用层视角看，文件操作通过open/read/write等系统调用完成；内核视角则涉及struct file、fd数组、VFS等关键结构。文章详细解析了open调用时内核如何创建struct file对象并分配fd，解释了标准输入/输出/错误(0/1/2)的初始化过程，并阐述了VFS通过file_operations实现&quot;一切皆文件&quot;的多态机制。核心内容包括文件描述符本质是进程fd数组的下标，struct file代表打]]></description><category></category></item><item><title><![CDATA[【C++11】右值引用]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/155035099</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/155035099</guid><author>m0_68617301</author><pubDate>Wed, 19 Nov 2025 18:48:50 +0800</pubDate><description><![CDATA[本文从C++的左右值概念切入，系统讲解了右值引用、移动语义和完美转发的原理与应用。首先区分了左值（可寻址）和右值（临时值），然后通过字符串类的移动构造实现，展示了如何通过&quot;偷指针&quot;减少拷贝开销。接着以list容器为例，说明需要为push_back同时提供左值和右值版本，让临时对象走移动构造的&quot;绿色通道&quot;。文章深入浅出，通过string和list两个典型案例，将右值引用相关概念串联成完整知识体系，为理解现代C++性能优化提供了清晰路径。]]></description><category></category></item><item><title><![CDATA[【操作系统原理】Linux 进程控制]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/155034685</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/155034685</guid><author>m0_68617301</author><pubDate>Wed, 19 Nov 2025 18:11:10 +0800</pubDate><description><![CDATA[本文系统梳理了Linux进程控制的三大核心问题：进程本质、终止机制和父子进程协作。内核视角下，进程由task_struct（PCB）、mm_struct（内存管理）和代码数据三部分组成。fork系统调用通过复制父进程结构和COW机制创建子进程。进程终止流程包括释放资源、保留退出状态和等待父进程回收。重点区分了exit（用户态清理）和_exit（直接终止）的差异，并解析了僵尸进程的成因与危害。最后详解了wait/waitpid系统调用，包括阻塞/非阻塞等待模式（WNOHANG）和状态信息解析宏，为理解进程生命]]></description><category></category></item><item><title><![CDATA[【操作系统原理】进程调度的O(1)算法之双140队列]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/155004248</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/155004248</guid><author>m0_68617301</author><pubDate>Tue, 18 Nov 2025 23:06:43 +0800</pubDate><description><![CDATA[Linux O(1)调度器核心机制解析 本文深入讲解了Linux 2.6内核采用的O(1)调度器核心原理。该系统通过巧妙的数据结构设计，实现了恒定时间的进程调度： 优先级架构：将进程分为实时(0-99)和普通(100-139)共140个优先级队列，每个优先级对应独立队列 高效调度结构： 使用runqueue管理CPU的就绪进程 采用active/expired双数组结构：active存放当前调度队列，expired存放时间片耗尽的进程 通过bitmap快速定位最高优先级非空队列 调度流程： 从active数]]></description><category></category></item><item><title><![CDATA[【操作系统原理】进程地址空间初识]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/154920500</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/154920500</guid><author>m0_68617301</author><pubDate>Mon, 17 Nov 2025 06:00:00 +0800</pubDate><description><![CDATA[本文深入解析了进程地址空间的核心概念，包括虚拟地址与物理地址的转换机制、多级页表结构、缺页中断处理以及COW写时复制技术。文章详细介绍了Linux内存管理的关键数据结构mm_struct和VMA，并阐述了进程切换时CR3寄存器的作用。同时分析了虚拟地址的来源（编译-链接-加载流程）和虚拟内存的必要性。最后通过总图总结了整个虚拟内存系统的工作原理，并列出高频面试考点，帮助读者系统掌握操作系统内存管理机制。]]></description><category></category></item><item><title><![CDATA[【操作系统原理】进程优先级与命令行参数、环境变量详解]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/154664026</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/154664026</guid><author>m0_68617301</author><pubDate>Mon, 10 Nov 2025 23:50:01 +0800</pubDate><description><![CDATA[本文聚焦Linux系统中三个核心概念：进程优先级、命令行参数和环境变量。首先介绍进程优先级的本质与作用，包括NI和PRI值的含义及调整方法。其次解析命令行参数argc/argv的传递机制，展示从用户输入到程序执行的完整调用链。最后详解环境变量的继承特性、PATH搜索规则以及内建命令与外部命令的关键区别。文章通过代码示例、对比表格和流程图，帮助读者掌握进程调度、程序启动和环境配置的基础原理，并提供了可直接运行的实验清单。]]></description><category></category></item><item><title><![CDATA[【数据库初阶】事务]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/146457099</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/146457099</guid><author>m0_68617301</author><pubDate>Sun, 23 Mar 2025 15:56:08 +0800</pubDate><description><![CDATA[锁定索引记录之间的间隙（RR 隔离级别特有）。：确保查询命中索引，避免锁升级为表锁。：事务快照，判断数据版本可见性。：尽快提交事务，减少锁持有时间。]]></description><category></category></item><item><title><![CDATA[【数据库初阶】索引（1）]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/145952504</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/145952504</guid><author>m0_68617301</author><pubDate>Sun, 02 Mar 2025 00:59:22 +0800</pubDate><description><![CDATA[索引的主要作用是为了提高数据库查询的性能；不用加内存，不用改程序，不用调sql，只要执行正确的，查询速度就可能提高成百上千倍；但是会增加删除、更新、插入的效率。]]></description><category></category></item><item><title><![CDATA[【数据库初阶】表的查询语句和聚合函数]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/145370989</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/145370989</guid><author>m0_68617301</author><pubDate>Mon, 27 Jan 2025 00:18:39 +0800</pubDate><description><![CDATA[聚合函数用于对一组值执行计算，并返回单个汇总值。它们通常与GROUP BY子句结合使用，实现分组统计，但也可以直接用于整张表的汇总。]]></description><category></category></item><item><title><![CDATA[【数据库初阶】表的增删改语句]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/145065969</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/145065969</guid><author>m0_68617301</author><pubDate>Sat, 11 Jan 2025 00:21:15 +0800</pubDate><description><![CDATA[特性	DELETE	TRUNCATE
删除方式	逐行删除	删除所有行
是否可以删除特定行	可以，通过 WHERE 子句指定条件	不能，删除表中的所有数据
是否触发触发器	会触发 DELETE 触发器	不会触发触发器
是否重置自增列	不会	会重置自增列计数器
操作类型	DML（数据操作语言）	DDL（数据定义语言）
性能	较慢，逐行删除	更快，通过删除和重新创建表实现
能否回滚	可以，适用于支持事务的存储引擎	不可以，删除操作不可回滚
表结构是否改变	不改变表结构	不改变表结构
操作对日志的影响	会占用 un]]></description><category></category></item><item><title><![CDATA[【数据库初阶】MySQL中表的约束（下）]]></title><link>https://blog.youkuaiyun.com/m0_68617301/article/details/144972663</link><guid>https://blog.youkuaiyun.com/m0_68617301/article/details/144972663</guid><author>m0_68617301</author><pubDate>Tue, 07 Jan 2025 00:14:02 +0800</pubDate><description><![CDATA[2. 唯一键 UNIQUE KEY
2.1 基本概念
唯一性：唯一键确保每一行数据在指定的列（或列组合）中是唯一的，即不允许存在两个或更多相同的值。
NULL 值：与主键不同，唯一键允许列中有 NULL 值。多个 NULL 值在唯一键列中是允许的（这与主键不同，主键列不允许有 NULL 值）。
2.2 语法格式

唯一键可以通过 UNIQUE 关键字在创建表时定义，或者在已经存在的表中使用 ALTER TABLE 来添加。

2.2.1 创建表时使用唯一键
CREATE TABLE employees (
]]></description><category></category></item></channel></rss>