自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 收藏
  • 关注

原创 从硬件中断到信号机制:打通操作系统异步底层的完整学习笔记

这篇文章系统梳理了操作系统底层异步机制的学习历程,形成完整知识闭环。主要内容包括: 硬件中断机制 中断是操作系统夺回CPU控制权的根基 时钟中断作为系统"心跳"驱动调度 特权级与地址空间实现安全隔离 信号机制 用户态"软中断"完整复刻硬件中断流程 信号处理自动屏蔽防止递归 sigaction精细控制信号行为 异步编程约束 可重入函数是信号处理的硬性要求 volatile保证内存可见性 典型应用如SIGCHLD回收子进程 整个体系从硬件中断到用户态信号形成完美对应,所有

2026-06-17 15:28:12 395

原创 从手写 kill 崩溃到吃透内核底层原理

这篇博客记录了作者深入学习Linux进程信号的完整过程。从最初编写kill程序崩溃的问题出发,逐步探索了信号的本质和实现机制。文章详细解析了信号产生、保存和处理的完整生命周期,包括硬件异常触发、PCB位图存储、内核态用户态切换等核心概念。作者通过手绘笔记图和实际代码案例,解释了常见信号行为(如Ctrl+C、段错误)的底层原理,并分享了自己踩过的坑(如无限循环错误、core文件生成)。最后总结了信号的四大产生方式和处理流程,形成了一个完整的知识体系。这篇博客不仅是一份学习笔记,更展示了如何通过实践和思考将零散

2026-05-31 17:30:02 321

原创 System V IPC 全链路深度解析 —— 从信号量原子性到内核多态再到物理内存共享

本文深入探讨了操作系统中的IPC(进程间通信)机制及其并发控制原理,核心要点如下: IPC的必要性:进程独立性要求与协作需求之间的矛盾催生了IPC机制,使不同进程能够安全共享资源。 并发控制核心概念: 共享资源、互斥、临界资源、临界区、原子性 信号量作为资源预定机制(如电影院票务系统)解决并发安全问题 System V IPC三剑客: 信号量:同步互斥 消息队列:异步通信(内核链表实现) 共享内存:最高效的数据共享方式 统一设计架构: 内核采用四层框架管理所有IPC对象 通过C语言结构体继承实现多态(ker

2026-05-30 23:13:53 342

原创 从零吃透 Linux System V 共享内存:从原理到代码实战全记录

Linux共享内存学习笔记:从原理到实战 本文系统性地总结了Linux共享内存的学习过程,涵盖了核心原理、关键函数和实战经验。首先分析了管道通信的局限性,引出共享内存零拷贝的优势;详细讲解了内核管理机制和key/shmid的区别;重点剖析了ftok、shmget等5个核心函数的使用方法和常见坑点;最后提供了完整的C++封装实现,包含服务端和客户端的通信示例。文章特别强调了实际开发中的关键问题:key的生成逻辑、共享内存残留处理以及后续需要引入的同步机制。通过面向对象封装和系统调用结合的方式,展现了Linux

2026-05-25 23:16:40 377

原创 命名管道测试小Demo

本文分享了作者在实现Linux命名管道(FIFO)封装过程中的经验与思考。文章首先介绍了封装类的整体结构,包括核心的Pipe.hpp和服务端/客户端实现。重点剖析了开发过程中遇到的五个关键问题:文件描述符本质、管道存在性判断方法、创建责任归属、unlink函数特性等。作者通过实践验证了命名管道的核心特性:磁盘特殊文件实现进程通信、读写端相互阻塞、服务端负责创建等。文章还总结了代码中的优秀实践(如面向对象封装、错误处理)和可优化点(如显式关闭文件描述符)。最终强调动手实践对深入理解系统编程的重要性。

2026-05-23 10:39:58 348

原创 利用AI整理进程池创建的思路和细节

本文深入剖析了Linux进程池实现中的关键细节,重点讲解了管道通信与回调机制的设计要点。作者通过踩坑经验指出:子进程必须关闭从父进程继承的多余管道写端,否则会导致进程无法正常退出;回调函数的设计实现了框架与业务的彻底分离;Channel类封装了管道和子进程的管理逻辑。文章还分析了优雅退出机制的设计哲学,强调通过管道状态而非信号通知来控制子进程生命周期。这些核心细节决定了进程池的稳定性和可扩展性,是Linux系统编程中容易被忽视但至关重要的知识点。

2026-05-22 16:54:05 346

原创 创建进程池处理任务

本文实现了一个基于管道的进程池系统,通过父进程管理多个子进程执行不同任务。系统包含4种任务函数(磁盘同步、数据下载、日志打印、状态更新),使用函数指针数组组织。关键技术点包括:1)采用回调机制实现框架与业务分离,子进程通过DoTask函数读取管道指令执行任务;2)使用Channel类封装管道写端和子进程信息;3)通过关闭历史管道写端解决子进程继承问题,确保进程正常回收。该设计实现了进程池的高效管理和任务分发,具有框架与业务解耦、生命周期可控等特点,适用于需要多进程协作的场景。

2026-05-22 16:48:35 370

原创 进程间通信

管道是 Unix 中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个 “管道”管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用 FIFO 文件来做这项工作,它经常被称为命名管道。命名管道是一种特殊类型的文件(管道文件只在内存,但在磁盘上存在,始终为空)

2026-05-22 11:50:27 351

原创 动静态库的生成与使用

本文介绍了Linux环境下静态库和动态库的创建与使用方法。首先通过Makefile分别生成静态库(.a)和动态库(.so),并整理成标准库目录结构。然后详细说明了三种使用静态库的方式:安装到系统路径、使用编译选项(-I,-L,-l)以及创建软链接。对于动态库,重点介绍了通过环境变量LD_LIBRARY_PATH和配置文件来指定库路径的方法。这些操作步骤为后续项目开发中处理库依赖提供了实用基础,涵盖了从库创建到实际应用的全过程。

2026-05-17 10:10:39 235

原创 ELF、动静态链接与虚拟地址空间 终极闭环知识体系

本文系统梳理了程序链接与加载的全流程,揭示了静态链接与动态链接的本质差异。核心发现包括:1)链接分为编译期磁盘操作和运行时内存操作两个阶段;2)动态链接通过PIC、GOT/PLT机制解决库加载地址不确定性问题;3)虚拟地址分配时机不同(主程序编译期确定,动态库加载时确定)。文章构建了从源码到执行的完整认知链条:C源码→编译生成.o→链接生成可执行文件/动态库→进程创建→加载运行,并详细解析了各阶段的关键技术原理。最终指出动态链接机制的设计演进逻辑:每个复杂特性(如延迟绑定)都是为了解决前序方案带来的新问题,

2026-05-16 09:54:25 350

原创 Linux 下 从 ELF 可执行文件 到 进程虚拟地址空间的加载、映射与运行底层原理

本文系统梳理了Linux程序从源码到执行的完整链路,包含五个关键环节:编译生成ELF可重定位文件、链接合并目标文件与库、进程虚拟地址空间初始化、加载到物理内存、CPU执行指令。重点解析了ELF格式结构、动静态库链接规则、虚拟地址规划原理、进程内存管理机制(mm_struct、页表)以及硬件地址转换流程(MMU)。整个过程体现了编译器、操作系统和硬件的协同设计:编译器规划虚拟地址,操作系统实现地址空间管理,硬件完成地址转换,共同实现代码复用、进程隔离和内存高效管理的目标。

2026-05-13 17:08:27 440

原创 Ext系列文件系统

本文全面介绍了磁盘硬件结构及文件系统原理。主要内容包括: 硬件层面 磁盘物理结构:磁头、磁道、柱面、扇区的组织方式 CHS寻址原理及LBA线性寻址转换 软件层面 文件系统核心概念:块、分区、inode节点 ext2文件系统架构:超级块、块组描述符、位图、inode表等组件 文件操作原理:增删改查对磁盘结构的实际影响 链接机制 硬链接:多个文件名共享同一inode 软链接:独立inode存储目标路径 两种链接的特性对比及应用场景 关键实现 目录文件与路径解析原理 大文件存储的间接索引机制 文件系统挂载的本质

2026-05-07 23:22:30 370

原创 Linux之缓冲区

无论是 C 库 IO 缓冲区、vector 的 2 倍扩容,还是 STL 空间配置器,底层的设计哲学完全一致:用用户态的「预分配 + 缓存 + 批量处理」,把高频、零散的高成本内核系统调用,合并成低频、批量的调用,从而极大提升程序性能。把数据从「用户态语言级缓冲区」,通过write系统调用,拷贝到「内核态文件缓冲区」,这个动作才叫 “把数据交给了操作系统”。数据到了内核缓冲区,不一定立刻写到了磁盘!!

2026-05-03 22:48:05 441

原创 基础IO(2)

files012。

2026-04-29 17:34:27 324

原创 基础IO(1)

文件 =文件内容文件属性(元数据)后续所有文件操作,本质上就分为两类:对文件内容的读写 / 修改对文件属性的修改(如权限、大小、时间戳等)文件操作的本质,是进程通过 IO 对磁盘文件的内容和属性进行读写。任何文件访问都依赖路径,相对路径的本质是使用进程的当前工作目录。打开文件的过程,是将磁盘文件加载到内存,后续操作都是基于内存副本完成的。用户态的文件操作(C 库 / C++ 流),本质上都是通过文件描述符,间接操作内核中的文件对象,最终访问磁盘文件。文件描述符fd。

2026-04-27 20:27:28 395

原创 Linux进程控制(2)

正常终止(代码跑完)exit_code是进程的返回值(如return 0对应正常终止但出错退出exit_code!= 0(如exit(1)对应被信号杀死signumber!= 0,此时exit_code无意义。

2026-04-21 19:50:21 409

原创 Linux进程控制(1)

本文介绍了Linux进程创建与终止的核心机制。在进程创建方面,重点讲解了fork函数的工作原理:通过复制父进程创建子进程,采用写时拷贝技术实现进程独立性,并分析了fork的常见用法和失败原因。在进程终止方面,系统梳理了三种终止情况(正常结束/错误结束/异常终止),详细解释了如何通过信号和退出码表示进程状态,对比了exit()和_exit()的区别,并从内核角度说明了进程终止时操作系统对PCB的处理流程。这些机制共同构成了Linux进程管理的技术基础。

2026-04-16 20:35:46 323

原创 Linux程序地址空间

分层布局:清晰的虚拟地址空间划分(代码 / 数据 / 堆 / 栈)保证了内存访问的有序性和安全性。惰性复制:COW 机制极大提升了fork的效率,是现代操作系统优化进程创建的核心手段。用户态代码到内核态内存管理程序视角:看到的是虚拟地址(如0x601054内核视角:通过页表映射到物理内存。fork 机制:利用写时复制(COW)优化了进程创建开销。最终结果:实现了进程间的完美隔离(独立性)。物理内存的局限性:物理内存大小有限(如 10 亿字节),无法直接给每个进程完整的 “大饼”。

2026-04-13 23:16:57 477

原创 Linux环境变量

摘要: 环境变量是操作系统用于配置运行环境的全局参数,如PATH存储命令搜索路径,实现程序快速定位。环境变量存储在内存中的临时表,由父进程(如bash)传递给子进程,实现全局共享。获取方式包括main函数的env参数、全局变量environ和库函数getenv()。本地变量仅限当前进程,而环境变量通过export升级后可被子进程继承。内建命令(如cd)由shell直接执行,不依赖PATH,而普通命令(如ls)需PATH查找二进制文件。环境变量临时设置仅当前会话有效,写入配置文件(如~/.bashrc)可永久

2026-04-11 18:10:29 394

原创 Linux命令行参数

C语言main函数可以接收命令行参数,通过int main(int argc, char *argv[])形式实现。argc表示参数个数(包含程序名),argv是指针数组存储所有参数(argv[0]为程序名,argv[argc]固定为NULL)。Linux命令本质都是C程序,通过解析这些参数实现不同功能(如ls -l)。需要注意参数以字符串形式存储,空格分隔参数,且VS2022等IDE也支持类似设置。命令行参数机制是程序与用户交互的重要方式,正确理解argc和argv对于开发命令行工具至关重要。

2026-04-10 17:19:08 395

原创 进程的切换

本文深入解析Linux内核进程管理机制。在进程调度方面,详细介绍了O(1)调度器的实现原理,包括活动队列和过期队列的双队列设计、优先级位图优化等,解释了其O(1)时间复杂度的实现原理。在进程管理数据结构方面,分析了task_struct中的多链表设计,包括全局链表、运行队列、子进程链表等,以及哈希表、红黑树等数据结构在进程管理中的应用。文章还阐述了进程上下文切换的机制,以及时间片轮转调度的实现方式。这些精心设计的数据结构和算法共同构成了Linux高效进程管理的核心机制。

2026-04-09 21:24:00 377

原创 进程优先级

是因为分时操作系统,给进程分配时间片,相对公平公正的调度策略,较为均衡的让不同的进程都能在一段时间内,都能得到cpu资源,符合人的需求和互联网的需求。所以更改优先级就不能改变的太狠了,不能过于频繁。

2026-04-08 16:41:32 239

原创 进程的状态

kernel源代码定义:R运行状态(running):并不意味着进程⼀定在运行中,它表明进程要么是在运行中要么在运行队列里。S睡眠状态(sleeping):意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。T停止状态(stopped):可以通过发送 SIGSTOP 信号给进程来停止(T)进程。

2026-04-01 11:44:56 435

原创 进程的引出及有关知识(1)

所有运行在系统里的进程都以task_struct双链表的形式存在内核里。进程=内核数据结构 + 自己程序的代码和数据。那么这个文件会建在哪个路径下————当前路径。通过系统调用创建进程---fork()就是当前进程的工作路径。本质:新的进程,往往是通过。

2026-03-28 17:06:24 372

原创 进程引出之前的铺垫

截止目前为止,我们所认识的计算机,都是由一个个的硬件组件组成存储器内存主要就是解决速度不匹配问题,数据可以提前加载,大部分情况下,处理数据的时候,就可以转换为CPU和内存之间的交互(内存速度快)。所以计算机的效率就以内存为主了(存储设备拷贝的效率),同时还可以让人们以较低的价格获得一台效率不错的机器,所以冯诺依曼为电脑提供了性价比。

2026-03-26 20:57:48 385

原创 map和set的使用

set的声明如下,T就是set底层关键字的类型set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参数。⼀般情况下,我们都不需要传后两个模版参数。set底层是⽤红⿊树实现,增删查效率是?,迭代器遍历是⾛的搜索树的中序,所以是有序的。

2026-01-05 11:41:31 620

原创 二叉搜索树

树的结构中(结点)除了需要存储key还要存储对应的value,增/删/查还是以key为关键字⾛⼆叉搜索树的规则进⾏⽐较,可以快速查找到key对应的value。key/value的搜索场景实现的⼆叉树搜索树⽀持修改,但是不⽀持修改key,修改key破坏搜索树性质了,可以修改value。key的搜索场景实现的⼆叉树搜索树⽀持增删查,但是不⽀持修改,修改key破坏搜索树结构了。场景:简单中英互译字典,树的结构中(结点)存储key(英⽂)和vlaue(中⽂),搜索时输⼊英⽂,则同时查找到了英⽂对应的中⽂。

2025-12-30 10:16:05 589

原创 C++之多态

必须是基类的指针或者引用调用虚函数被调用的函数必须是虚函数,并且完成了虚函数重写/覆盖说明:要实现多态效果,第⼀必须是基类的指针或引⽤,因为只有基类的指针或引⽤才能既指向基类对象⼜指向派⽣类对象;第⼆派⽣类必须对基类的虚函数完成重写/覆盖,重写或者覆盖了,基类和派⽣类之间才能有不同的函数,多态的不同形态效果才能达到。

2025-12-28 18:03:47 827

原创 C++之继承

基类private成员在派⽣类中⽆论以什么⽅式继承都是不可⻅的。这⾥的不可⻅是指基类的私有成员还是被继承到了派⽣类对象中,但是语法上限制派⽣类对象不管在类⾥⾯还是类外⾯都不能去访问它。基类private成员在派⽣类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派⽣类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。实际上⾯的表格我们进⾏⼀下总结会发现,基类的私有成员在派⽣类都是不可⻅。基类的其他成员在派⽣类的访问⽅式?==?

2025-12-24 09:54:43 692

原创 C++之模板

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2025-11-24 22:21:45 1105

原创 stack 和 queue

函数说明接口说明stack()构造空的栈empty()检测stack是否为空size()返回stack中元素的个数top()返回栈顶元素的引用push()将元素val压入stack中pop()将stack中尾部的元素弹出队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。

2025-11-20 11:18:27 829

原创 C++之list

构造函数接口说明构造的list中包含n个值为val的元素list()构造空的list拷贝构造函数用(first,last)区间中的元素构造list。

2025-11-17 22:37:14 601 1

原创 C++之vector容器

vector的文档介绍使用STL的三个境界:能用,明理,能扩展构造函数声明接口说明vector()无参构造构造并初始化n个val拷贝构造使用迭代器进行初始化构造。

2025-11-08 11:34:37 1180

原创 C++之string类

这种拷贝方式,称为浅拷贝。

2025-11-06 11:45:21 852

原创 编译和链接

在 ANSI C 的任何⼀种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执⾏的机器指令(⼆进制指令)。第2种是执⾏环境,它⽤于实际执⾏代码。

2025-10-29 21:11:08 1013

原创 C语言之文件操作

磁盘(硬盘)上的⽂件是⽂件。但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的角度来分类的)。函数名 功能 适⽤于fgetc 字符输⼊函数 所有输⼊流fputc 字符输出函数 所有输出流fgets ⽂本⾏输⼊函数 所有输⼊流fputs ⽂本⾏输出函数 所有输出流fscanf 格式化输⼊函数 所有输⼊流fprintf 格式化输出函数 所有输出流。

2025-10-29 20:19:25 811

原创 Date类自主实现后的反思

昨天把Date类实现了,然后测试了几个例子,虽然也能通过,但是发给AI,再对比一下大佬写的,本来觉得自信满满,结果发现漏洞百出。

2025-10-25 16:39:26 839

原创 STL简介

不仅是一个可复用的组件库,而且。

2025-10-25 11:09:58 418

原创 C++之模板初阶

class 类模板名// 类内成员定义// 类模版public:_size = 0;// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误,具体原因后面会讲// 扩容++_size;

2025-10-25 10:48:41 800

原创 C/C++内存管理

int main()//new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;//内置类型几乎是一样的free(p3);delete p4;free(p5);return 0;

2025-10-24 18:19:07 747

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除