- 博客(140)
- 收藏
- 关注
原创 Linux:线程互斥,线程锁
本文介绍了多线程编程中的互斥概念及其实现方法。首先解释了临界资源、临界区和互斥的基本概念,指出互斥能保证同一时间只有一个线程访问共享资源。通过一个售票系统的代码示例,展示了多线程并发操作共享变量时可能出现的数据不一致问题(如票数变为负数)。文章详细分析了产生问题的原因在于非原子操作,并介绍了使用互斥量(mutex)的解决方案,包括初始化、加锁解锁操作及销毁互斥量的接口。最后给出了两种互斥量的封装方式:常规版本和RAII风格的互斥锁,后者利用C++的构造/析构机制自动管理锁的生命周期,确保线程安全的同时提高代
2026-05-06 22:49:11
529
原创 Linux:线程优缺,线程控制
本文摘要: 线程相比进程具有创建代价小、切换开销低、资源共享等优势,适合I/O密集型和计算密集型任务,但也存在性能损失、健壮性降低等缺点。Linux线程通过pthread库控制,关键操作包括创建(pthread_create)、终止(pthread_exit/pthread_cancel)、等待(pthread_join)和分离(pthread_detach)。线程ID本质是地址空间中的虚拟地址,与内核LWP不同。线程共享进程的代码段、数据段等资源,但拥有独立的栈和寄存器等私有数据。合理使用多线程能提升程序
2026-05-06 22:49:08
351
原创 Linux:理解物理内存和页表,(重点)理解线程
本文深入探讨了线程概念及其在Linux系统中的实现原理。首先解释了进程与线程的关系:进程是资源分配单位,线程是执行单位;Linux中线程实为轻量级进程,共享进程地址空间。其次详细剖析了物理内存管理机制,包括4KB页框划分、struct page结构体描述,以及多级页表设计(二级页表+页目录)如何解决内存碎片问题。最后阐述了线程的执行原理:通过页表映射使不连续的代码区在虚拟地址空间连续,线程得以执行不同函数;Linux内核本身无线程概念,需依赖线程库封装系统调用来实现轻量级进程。文章还涉及缺页异常处理机制(硬
2026-05-01 13:56:52
484
1
原创 Linux:理解可重入函数,volatile关键字,SIGCHID信号
文章讨论了三个关键概念:1) 可重入函数与不可重入函数的区别,通过链表插入示例说明重入可能导致的内存泄漏问题;2) volatile关键字的作用,解释其在信号处理中防止编译器优化的必要性;3) SIGCHLD信号处理,展示父进程如何通过信号处理函数清理子进程,避免僵尸进程的产生。特别指出,在Linux中设置SIGCHLD动作为SIG_IGN可自动清理子进程,但这并非所有UNIX系统的通用解决方案。文章通过代码示例演示了这些概念的实际应用。
2026-05-01 13:56:27
364
原创 算法:离散化模板
摘要:离散化是一种将大范围数据压缩到连续小范围的技术,主要用于数据去重和坐标压缩。其核心步骤包括:1)排序原始数据;2)使用unique函数去重;3)通过lower_bound查找元素新下标。文中提供了静态数组和动态vector两种实现方式,均包含排序、去重和映射三个关键步骤。特别提醒unordered_map可能效率较低,建议使用二分查找实现。该方法适用于数据范围大但数据量不大的场景,能有效优化存储和计算效率。
2026-04-29 11:45:14
35
原创 算法:线段树
本文系统介绍了线段树数据结构及其应用。线段树是一种基于分治思想的二叉树结构,用于高效处理区间查询和修改操作。文章首先阐述了线段树的基本概念和构建方法,然后详细讲解了单点修改、区间查询、区间修改(含懒标记)等核心操作及其时间复杂度分析。接着,文章通过多个经典例题(如区间和、区间最值、区间方差等)展示了线段树的实际应用,并介绍了权值线段树、势能线段树等变种。最后,文章探讨了线段树与数学问题的结合,如GCD维护和方差计算。全文通过代码示例和图示,深入浅出地讲解了线段树的原理和实现,适合算法学习者系统掌握这一重要数
2026-04-29 11:44:11
506
原创 Linux:理解中断
文章摘要: 本文详细解析了操作系统的中断机制。硬件中断通过CPU针脚感知外设信号,由中断控制器管理多设备请求,通过中断向量表定位服务程序。时钟中断由晶振定期触发,推动进程调度。操作系统本质是一个死循环,在时钟中断驱动下运行。软中断(如系统调用)通过CPU指令触发,由标准库封装调用细节。其他异常(如缺页、除零)也转为软中断处理。最后用信号模拟实现了一个简易OS调度器,展示了中断在进程调度中的作用。全文揭示了操作系统如何通过硬件/软件中断实现设备响应和任务调度。
2026-04-21 21:22:06
401
原创 Linux:信号保存与捕捉
本文介绍了Linux系统中信号处理的三个关键表(block、pending、handler)及其操作方式。主要内容包括:1.信号的基本概念:递达、未决和阻塞状态的区别;2.内核中信号表示的结构体task_struct及其三个表的作用;3.信号集操作函数(sigemptyset、sigaddset等)和信号屏蔽操作(sigprocmask);4.信号捕捉流程和sigaction函数的使用;5.通过代码示例演示了信号阻塞、未决状态检查及信号处理过程。文章重点阐述了信号从产生到处理的全过程,包括内核态与用户态的切
2026-04-21 17:28:22
538
1
原创 Linux:认识信号,理解信号的产生和处理
本文介绍了Linux系统中的信号机制。信号是进程间异步通知的一种方式,属于软中断。主要内容包括:1.信号的基本概念,通过生活场景类比理解信号;2.Linux系统中1-31号普通信号及其处理方法(忽略、默认处理、自定义捕捉);3.信号的多种产生方式(键盘输入、kill命令、系统调用、软件条件和硬件异常);4.核心转储(coredump)的概念及其与普通进程终止的区别。文章通过代码示例演示了信号的注册、处理和不同产生方式,并分析了硬件异常信号的持续产生原因。最后通过实例展示了如何检测进程退出状态中的coredu
2026-04-12 17:41:32
557
原创 Linux:进程间通信-System V 共享内存
共享内存原理与应用摘要 共享内存是最高效的进程间通信方式,通过让不同进程的虚拟地址映射到同一物理内存区域实现数据共享。核心实现步骤包括:1)使用ftok生成唯一key值;2)通过shmget创建/获取共享内存;3)shmat将内存映射到进程地址空间;4)shmdt解除映射。系统调用shmctl用于控制内存块属性(如IPC_RMID删除内存)。共享内存优势在于零拷贝访问和实时性,但需自行处理同步问题。示例代码展示了服务端创建共享内存、客户端连接的完整流程,通过字符读写演示进程间通信。注意共享内存生命周期独立于
2026-04-12 17:40:45
396
原创 算法:组合数学
本文系统介绍了组合数学中的核心概念与计算方法。主要内容包括:1)排列组合的基本定义与计算公式;2)四种求组合数的实用方法(循环法、杨辉三角、阶乘逆元表、卢卡斯定理);3)隔板法及其应用场景;4)错排问题的递推公式与实现;5)卡特兰数的五种计算方法及其在括号序列、出栈顺序等问题中的应用;6)容斥原理的数学表达与实现模板。文章通过典型例题和代码实现,展示了如何根据数据范围选择最优解法,涵盖了组合数学中的经典问题和实用技巧。
2026-03-10 17:09:12
421
原创 算法:基础数论
本文系统介绍了数论中的核心概念与算法,主要包括:1. 最大公约数(gcd)与最小公倍数(lcm)的定义及欧几里得算法;2. 质数判定与筛法(埃氏筛、线性筛);3. 算术基本定理与质因数分解;4. 约数求解与欧拉函数;5. 费马小定理与乘法逆元;6. 同余方程与中国剩余定理(CRT及扩展CRT)。重点阐述了gcd与lcm的关系(gcd×lcm=ab)、欧几里得算法的时间复杂度(O(logn))、质数筛法的优化(线性筛)、欧拉函数的积性性质、逆元的四种求法(费马小定理、扩展欧几里得、递推法、阶乘逆元),以及同余
2026-03-10 14:21:03
905
原创 Linux:匿名管道(实现个进程池)和命名管道
摘要:本文详细介绍了Linux系统中的管道通信机制,包括匿名管道和命名管道。匿名管道通过pipe()函数创建,仅适用于有血缘关系的进程间单向通信,具有字节流、进程同步等特性。命名管道通过mkfifo()创建,允许无关进程通信,通过文件系统路径标识。文章深入分析了管道的工作机制、4种通信场景及特性差异,并提供了进程池的实现代码,展示了父子进程间任务分发的具体应用。最后通过命名管道实现了server-client通信模型,演示了实际应用场景。全文从原理到实践,系统性地讲解了Linux管道通信的核心概念和技术实现
2026-01-17 14:02:16
838
原创 Linux:认识ELF格式文件,理解库链接过程
文章摘要:本文详细解析了ELF(Executable and Linkable Format)文件的结构及其在程序编译、链接和运行中的作用。ELF文件包含四种类型:可重定位文件(.o)、可执行文件、共享目标文件(.so)和内核转储文件。其结构由ELF头、程序头表、节头表和节(Section)组成。静态链接通过合并.o文件和库生成可执行文件,而动态链接则推迟到程序运行时,利用全局偏移表(GOT)实现地址无关代码(PIC)。文章还探讨了ELF文件加载到内存的过程,包括节合并为段(Segment)的机制,以及进程
2026-01-17 14:01:32
695
原创 Linux:动静态库的制作和使用
本文详细介绍了C语言中的静态库和动态库。静态库(.a/.lib)在编译时链接到可执行文件,运行时无需依赖;动态库(.so/.dll)在运行时加载,可被多个程序共享。文章详细讲解了静态库的创建方法(使用ar工具)、使用方式(通过-L、-I、-l选项)以及三种应用场景。对于动态库,重点说明了生成方法(使用gcc的-shared和-fPIC选项)、运行时的搜索路径问题及四种解决方案(系统路径拷贝、软链接、环境变量配置、ldconfig更新)。最后通过具体示例展示了如何在实际项目中应用这两种库。
2026-01-13 17:28:25
616
原创 Linux:硬链接与软链接
本文介绍了Linux系统中硬链接和软链接的概念、创建方式及核心特性。硬链接是给文件inode新增的别名,与原文件共享同一inode,不能跨分区或为目录创建;软链接是存储原文件路径的独立文件,可跨分区并为目录创建。两者关键区别在于:硬链接与原文件共用inode,删除原文件不影响访问;软链接有独立inode,原文件删除后链接失效。硬链接适用于文件备份,软链接适合创建快捷方式和版本管理。通过ln命令创建硬链接(无参数)和软链接(-s参数),ls -l可查看链接信息。
2026-01-13 17:28:02
813
原创 Linux:Ext系列文件系统
本文深入探讨了文件系统的底层原理与实现机制。首先从机械硬盘的物理结构入手,详细介绍了磁头、磁道、扇区等基本概念,以及CHS和LBA两种寻址方式。然后阐述了文件系统的核心组件,包括块(Block)、分区(Partition)、inode等概念,重点解析了ext2文件系统的结构设计,包括超级块、块组描述符、块位图、inode位图等关键数据结构。文章还详细说明了inode如何通过直接、间接指针映射数据块,以及目录文件如何通过存储文件名与inode号的映射关系构建文件系统层次结构。最后通过实际操作演示了分区挂载的过
2026-01-06 14:44:02
1049
原创 Linux:深刻理解缓冲区
本文详细介绍了计算机系统中的缓冲区机制及其实现原理。主要内容包括:1)缓冲区的分类(输入/输出缓冲区)及其作用;2)三级缓冲区体系(用户级、内核级、语言级)的工作原理;3)缓冲区刷新机制(全缓冲、行缓冲、无缓冲)及验证方法;4)标准输入/输出/错误的区别与重定向实现;5)自定义文件操作函数的封装实现。通过代码示例和现象分析,阐述了缓冲区如何提高I/O效率,以及不同刷新策略的应用场景。最后展示了如何通过重定向分离标准输出和标准错误信息,并实现了一个简单的文件操作函数库。
2026-01-06 14:43:29
766
原创 Linux:理解IO,重定向
本文介绍了Linux系统级文件操作的基础知识,重点讲解了文件描述符和重定向的实现原理。主要内容包括:1)系统调用open、close、read、write等函数的使用方法;2)文件描述符的分配规则及其底层实现机制;3)重定向的本质是通过修改文件描述符指向来实现;4)使用dup2系统调用实现输入/输出重定向;5)在自主shell中实现重定向功能的具体代码实现。文章通过大量代码示例详细演示了文件描述符的操作方式,以及如何在自定义shell程序中处理重定向命令。
2026-01-01 14:42:51
652
原创 写给迷茫时的自己
我的人生没有白走的路,对了,我就是庆幸,错了我就长知识了。我的人生没有敌人,全都是老师,要么得到,要么学到就。我的人生没有失败,要么就是成功,要么就是成长,。我允许一切的事情发生,终将都有利于我。所以,朋友,少去想一点,多去干一点,才能知道答案。我是不会被任何事情所困扰的。
2025-12-03 19:43:13
216
2
原创 C语言的取地址取的是物理内存的地址吗?(简单验证)
我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理OS必须负责将虚拟地址转化成物理地址。所以说,这里的地址不是物理地址,是虚拟地址。
2025-11-19 18:05:13
300
原创 C++11:引用折叠,完美转发,可变参数模板,defult和delete,final和override,委托构造函数,继承构造函数
本文介绍了C++11引入的几项重要特性及其应用: 引用折叠规则:详细说明了右值引用和左值引用的组合规则,以及如何通过模板实现万能引用。 完美转发:阐述了std::forward的实现原理及其在保持参数属性方面的作用。 可变参数模板:讲解了参数包的基本用法、包扩展技术及其在STL容器emplace系列接口中的应用。 移动语义:介绍了默认移动构造和移动赋值的生成规则,以及default和delete关键字的使用。 继承控制:说明了final和override关键字在类继承体系中的作用和使用方法。 构造函数改进:
2025-11-12 18:20:21
933
原创 C++:用哈希表封装unordered_map,unordered_set(代码版)
用哈希表封装unordered_map,unordered_set(代码版)
2025-11-04 22:14:34
701
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅