- 博客(54)
- 收藏
- 关注
原创 进程间通信详解(二):System V IPC 三件套全面解析
System V IPC 包含共享内存、消息队列、信号量三种机制:共享内存通过映射内核内存实现高效数据共享,需配合信号量等实现同步,适合高频大数据交互。消息队列支持带类型的异步消息传递,接收方可按类型过滤,适用于任务分发、日志收集等解耦场景。信号量通过整数计数器控制资源访问,支持互斥锁、资源池等同步逻辑,是构建复杂同步的基石。三者核心 API 分别为shmget/shmat、msgget/msgsnd、semget/semop,生命周期均需显式释放。实际应用中常组合使用(如共享内存 + 信号量),需注意
2025-06-10 22:22:31
400
原创 用递归算法解锁「子集」问题 —— LeetCode 78题解析
题目链接: 78. 子集 - LeetCode题目描述:给定一个整数数组 nums,返回该数组所有可能的子集(幂集)。示例:输入: nums = [1,2,3]输出: [[], [1], [2], [3], [1,2], [1,3], [2,3], [1,2,3]]
2025-06-09 23:44:19
464
原创 进程间通信详解(一):管道机制与实现原理
本文介绍了 Linux 操作系统中最基础的进程间通信方式——管道(Pipe),包括匿名管道与命名管道的工作机制、创建方式、使用场景及其底层实现原理。通过示例代码演示如何使用 pipe() 与 mkfifo() 在父子进程及无亲缘关系进程之间实现数据传输,并对文件描述符的读写特性、阻塞行为及典型问题进行详细解析。适合作为学习 IPC 的入门篇。
2025-06-09 22:23:31
1110
原创 深入理解链接与加载:从静态库到动态库的全流程解析
本文围绕库、静态链接、动态链接、ELF 文件、目标文件等展开。库是可复用的二进制代码,分静态库和动态库。静态链接在编译阶段合并依赖,生成可执行文件;动态链接在运行时加载库,节省内存。ELF 文件有可重定位、可执行等类型,具头、程序头表、节头表和节等结构。目标文件是编译生成的 ELF 格式二进制文件。还介绍了动态库加载路径问题及解决方案,总结了链接与加载的本质和分工。
2025-06-08 22:06:00
640
原创 Linux 文件系统与 I/O 编程核心原理及实践笔记
本文深入探讨了文件系统的概念与操作机制。从狭义角度分析,文件存储在磁盘上,由文件系统通过inode和block结构管理;广义上,Linux将硬件设备、进程信息等抽象为文件(如/proc、/sys),统一使用文件接口访问。文章详细讲解了文件元数据和内容操作的区别,揭示了进程通过文件描述符与内核交互的底层原理,并对比了系统调用和库函数的关系。最后通过实例演示了文件权限位掩码、系统调用接口的使用方法,以及文件描述符在进程中的管理机制。
2025-06-07 23:57:12
1028
原创 操作系统进程管理解析:从 fork 到 exec 的全流程实战与底层原理
本文系统解析操作系统进程管理核心知识。进程创建通过fork函数实现,利用写时拷贝(COW)技术共享内存,仅在写入时复制数据,提升效率。进程终止分为正常与异常两类,_exit、exit和return退出方式各有特点,需注意缓冲区刷新差异。进程等待通过wait和waitpid回收资源,避免僵尸进程,支持阻塞与非阻塞模式获取子进程状态。进程程序替换借助exec函数簇,覆盖地址空间加载新程序,fork+exec组合实现多任务场景下的程序动态切换,完整呈现进程生命周期管理的关键机制与实践流程。
2025-06-07 16:14:39
612
原创 进程地址空间与虚拟内存管理
虚拟内存技术通过地址虚拟化解决了物理内存的三大痛点:地址冲突、内存碎片和资源浪费。其核心思想是为每个进程创建独立的虚拟地址空间,并通过页表映射到物理内存,实现按需加载和写时拷贝机制。程序地址空间是静态的虚拟地址布局,而进程地址空间则是动态实例,由内核数据结构mm_struct和vm_area_struct管理。通过fork创建子进程时,初始共享物理内存,当发生修改时才触发写时拷贝,确保进程隔离。Linux虚拟内存管理通过红黑树和链表高效组织VMA,实现灵活的内存分配与保护。
2025-06-06 09:32:06
708
原创 环境变量深度解析:从配置到内核的全链路指南
环境变量是操作系统中以Key=Value形式存储的运行时参数,通过environ全局指针访问,具有进程级作用域。常见环境变量包括PATH、HOME、PWD等,可通过env命令查询或export命令修改。在C语言中,可通过main参数或getenv/setenv系统调用访问环境变量。环境变量会被子进程继承,但修改仅对当前进程及其子进程有效。PATH变量决定了命令的搜索路径,可通过修改.bashrc文件永久配置。编程时需注意putenv的内存管理问题,避免访问已释放的内存。
2025-06-06 00:00:00
846
原创 Linux 进程调度与管理:从内核管理到调度机制的深度解析
本文系统解析 Linux 进程管理核心机制,阐述进程作为程序执行实例的本质,以task_struct为核心控制块通过双向链表组织进程,ps/top可查看进程信息,fork创建子进程时实现代码共享与数据独立;详解进程 R/S/T/Z 等状态,区分僵尸进程(父进程未回收 PCB)与孤儿进程(由 init 接管释放资源);分析 PRI 与 NI 协同的优先级管理,nice值影响优先级;解析进程切换的步骤、触发条件及开销;介绍 Linux 2.6 的 O (1) 调度器,通过 active/expired 双队列、
2025-06-04 23:46:01
2066
2
原创 操作系统入门:核心概念与设计逻辑
本文围绕计算机系统底层原理展开,先介绍冯・诺依曼体系结构的核心组成(运算器、控制器、存储器、输入 / 输出设备)及 “存储程序和程序控制” 的设计思想,强调其以二进制存储、顺序执行指令的特点。继而聚焦操作系统,阐述其分层结构(狭义内核与广义系统程序)、“承上启下” 的角色定位(管理硬件资源、为应用提供运行环境)及核心功能(通过结构体和数据结构描述、组织资源),并解析系统调用的本质 —— 作为应用与硬件交互的安全接口,通过库函数封装简化操作。全文从硬件架构到软件逻辑,揭示计算机系统高效协同的底层逻辑。
2025-06-04 23:13:18
1023
原创 二分查找的边界艺术:LeetCode 34 题深度解析
本文探讨了在有序数组中查找目标值区间边界的问题。通过分析二分查找的二段性特性,提出两种边界查找策略:左边界采用左中位数,右边界使用右中位数。文章详细说明了两种边界的判定条件、指针移动规则及终止条件,并给出代码实现。最后总结出通用二分模板,强调二段性是解决边界问题的核心,指出中位数选择和条件判断的差异是模板关键。该方案将二分查找时间复杂度控制在O(log n),适用于各类边界场景。
2025-06-03 23:21:20
1039
原创 Linux 基础开发工具全解析:从环境搭建到高效调试的一站式指南
本文围绕 Linux 基础开发工具展开,介绍 apt、Vim、GCC、Make/Makefile、Git、GDB/CGDB 等工具。apt 作为包管理器,简化软件安装、更新与卸载;Vim 通过模式化操作提升编码效率;GCC 支持多语言编译,具备优化与调试能力;Make/Makefile 实现项目自动化构建;Git 用于版本控制,管理代码迭代;GDB/CGDB 作为调试工具,可监控变量、修改变量值及设置条件断点。这些工具贯穿开发全流程,助力开发者高效完成从环境搭建到代码交付的工作,是 Linux 开发的核心技
2025-06-03 21:56:23
706
原创 Linux 权限管理入门:从基础到实践
Linux权限管理是系统安全的核心机制,通过控制用户对文件/目录的访问权限实现多用户环境下的资源保护。权限分为读(r/4)、写(w/2)、执行(x/1)三种,用数字(如755)或字母(rwx)表示,分别对应所有者、组用户和其他用户的权限。目录权限具有特殊性:执行权限(x)是访问前提,写权限(w)允许创建/删除文件。重要权限设置包括:文本文件644、可执行文件755、敏感文件600。粘滞位可防止用户删除他人文件,是目录特有的安全机制。掌握chmod命令和权限计算方法对系统管理至关重要。
2025-06-02 23:36:21
1757
原创 Linux 基础指令入门指南:解锁命令行的实用密码
Linux基础指令操作指南摘要:本文介绍了Linux系统中常用的基础指令及其操作方法。主要内容包括:文件与目录操作指令(ls、pwd、cd、touch、mkdir、rmdir、rm)、文本处理和系统查询指令(man、cp、mv),详细说明了各指令的语法格式、功能作用以及常用选项参数。通过实际示例展示了如何运用这些指令完成日常系统操作任务,如查看目录内容(ls)、切换路径(cd)、创建/删除文件(touch/rm)、复制移动文件(cp/mv)等。这些基础指令是Linux系统操作的核心技能,掌握它们能有效提高
2025-06-02 22:47:55
915
原创 函数栈帧深度解析:从寄存器操作看函数调用机制
本文深入解析32位x86架构下函数调用的内存机制与寄存器协作过程。函数调用通过栈区(遵循LIFO原则)和核心寄存器(ESP、EBP等)协同实现:1)主函数构建栈帧并压入参数;2)call指令保存返回地址并跳转;3)被调函数通过EBP建立新栈帧,完成运算后恢复原栈帧;4)调用者清理参数栈。整个过程展现了寄存器精确控制栈操作(ESP)、数据寻址(EBP)与指令流(EIP)的精密配合,以及通过保存旧EBP形成的栈帧链式结构,确保函数调用的正确执行和内存安全。
2025-06-01 23:57:36
712
原创 C++11 智能指针:从原理到实现
本文深入探讨了C++11智能指针的实现原理与使用方式。智能指针通过RAII技术自动管理内存资源,有效解决了传统C++手动内存管理的诸多问题。文章重点分析了三种智能指针:unique_ptr实现独占所有权,禁止拷贝但支持移动语义;shared_ptr通过引用计数实现共享所有权;weak_ptr作为弱引用可解决循环引用问题。每种智能指针都配有详细代码示例,展示了创建、操作和资源管理的关键用法。最后还通过简化实现揭示了unique_ptr和shared_ptr的内部工作机制,包括引用计数和自定义删除器的实现细节。
2025-06-01 18:00:57
816
原创 【C++】异常
有时catch到一个异常对象后,需要对错误进行分类,其中的某种异常错误需要进行特殊的处理,其他错误则重新抛出异常给外层调用链处理。捕获异常后需要重新抛出,关键字抛出一个异常对象。这个对象可以是任何类型(通常是继承自。,允许程序在遇到异常情况(如内存不足、文件打开失败)时,就可以把捕获的对象直接拋出。包含可能抛出异常的代码,当程序遇到错误时,使用。try-catch块。处理特定类型的异常。
2025-05-31 15:23:54
675
原创 【C++】封装哈希表实现 unordered_map、unordered_set
封装哈希表实现 unordered_map、unordered_set
2025-05-27 23:18:04
739
原创 【C++】unordered_map、unordered_set 的使用
unordered_map、unordered_set 的常见使用方式
2025-05-25 21:53:34
1087
原创 【数据结构】红黑树
红黑树是一种自平衡的二叉搜索树,通过颜色标记节点和旋转维持平衡。红黑树并不会像 AVL树那样保持严格的自平衡,它的平衡严格度比较宽松,只保证了最长路径是2倍最短路径。红黑树的五大特性:设 N 为树中节点数量, 2h - 1 <= N < 2^2 * h^ - 1,h ≈ logN,最坏情况也就是 2 * logN,时间复杂度为O(logN)。红黑树节点的结构就是在二叉搜索树节点的基础上增加一个父结点指针、一个颜色属性,颜色属性通常用枚举来表示。红黑树结构存一个根结点指针就可以了。2.2 红黑树的插入
2025-05-21 22:49:46
1106
原创 【C++】set、map 容器的使用
set的声明如下,T就是set底层关键字的类型set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。一般情况下,我们都不需要传后两个模版参数。set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历是走的搜索树的中序,所以是有序的。
2025-05-18 23:44:58
764
原创 【数据结构】二叉搜索树
左子树所有节点的键值小于当前节点的键值。右子树所有节点的键值大于当前节点的键值。左右子树也必须是二叉搜索树。二叉搜索树中可以支持插入相等的值,也可以不支持插入相等的值,具体看使用场景定义,系列容器底层就是二叉搜索树,其中map/set不支持插入相等值,支持插入相等值。
2025-05-18 20:15:17
1347
原创 【C++】继承
继承是一种面向对象编程机制,允许一个类(派生类)获取另一个类(基类)的成员变量和成员函数,并可以在此基础上进行扩展或修改。通过继承,派生类可以复用基类的代码,同时可以添加新功能或重写基类方法以实现多态。继承支持不同的访问控制(public、protected、private),决定了基类成员在派生类中的可见性。下面我们看到Person是基类,也称作父类。Student是派生类,也称作子类。(因为翻译的原因,所以既叫基类/派生类,也叫父类/子类)
2025-05-15 16:13:54
861
原创 STL - stack 和 queue 及容器适配器模式的介绍
std::stack是 C++ 标准库中的一种容器适配器(Container Adapter),它基于其他容器(如 std::deque、std::vector 或 std::list)实现,提供==后进先出(LIFO, Last-In-First-Out)==的数据结构行为。它不是一个独立的容器,而是通过限制底层容器的接口来实现栈的功能。std::queue。
2025-05-15 08:53:01
1006
原创 C++入门基础
定义命名空间,需要用到namespace关键字,在它的后面接上命名空间的名字,再接一对{},{}中即为命名空间的成员。命名空间中可以定义 变量/函数/类等。namespace 本质是定义一个域,这个域和全局域各自独立,不同的域可以定义相同名称的变量。C++中域有函数局部域,全局域,命名空间域,类域,块作用域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响。
2025-05-06 20:41:56
1100
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人