- 博客(40)
- 收藏
- 关注
原创 C入门基础
本文总结了C++中变量的链接属性与作用域规则,重点区分static、const、constexpr及extern对全局变量和函数的影响。强调constexpr默认内部链接,需用extern显式声明外部链接以实现跨文件共享。通过内联全局变量设计避免重复定义,提升效率。同时对比if-else与switch-case:前者适用于复杂条件与范围判断,后者在离散值匹配时更高效,尤其当编译器生成跳转表时可实现近常数时间访问。合理选择结构可优化代码性能与可读性。
2026-09-21 09:16:39
193
原创 pthread 线程创建与线程健壮性问题
本文介绍了使用pthread创建线程的基本方法,重点分析了线程健壮性问题。主要内容包括: pthread_create()函数的四个参数:线程ID、线程属性、线程入口函数和传递参数 使用static_cast进行安全的类型转换 线程创建后的并行执行流程 线程异常实验表明:一个线程发生异常(如空指针访问)会导致整个进程终止 空指针访问异常的原理是用户程序无法访问虚拟地址0 实验结果显示,当新线程出现段错误时,主线程也会随之终止,说明线程异常会影响整个进程的稳定性。 关键词:pthread、线程创建、线程健壮性
2026-07-15 17:31:23
185
原创 【无标题】
Linux线程实现采用轻量级进程(LWP)模型,通过复用进程控制块(task_struct)来模拟线程。关键点包括: 线程共享父进程地址空间(mm_struct),但拥有独立task_struct和栈等私有资源; 通过原生线程库(pthread)对用户隐藏底层LWP实现; 相比进程优势在于创建/切换成本低、CPU缓存利用率高; 线程数量需根据任务类型调整,过多会导致调度开销; 多线程程序易出现数据竞争问题,需同步机制保障健壮性。 这种设计完美契合线程理论要求,通过代码复用实现了高效简洁的线程支持。
2026-07-15 17:07:06
162
原创 【无标题】
本文深入解析了操作系统中的进程与线程概念。进程是系统资源分配的基本实体,拥有独立PCB、地址空间和页表,通过虚拟地址空间与页表映射实现资源访问。线程作为进程内部的执行流,共享进程资源但拥有独立栈空间和任务控制结构。Linux采用独特线程实现模型,通过mmap动态分配线程栈,并设置保护页防止溢出。进程与线程的关系体现为:进程承担资源分配,线程作为调度单位,一个进程可包含多个共享资源的线程。文章从内存布局、地址转换、软硬件协同等角度,系统阐述了操作系统中进程与线程的核心机制。
2026-07-15 16:19:12
368
原创 信号的保存、阻塞与递达
Linux信号机制核心概念解析 信号处理分为三个阶段:产生、保存和处理。信号递达指实际执行信号处理动作(默认/自定义/忽略)。信号未决描述信号产生后尚未处理的状态。通过信号阻塞机制,进程可主动屏蔽某些信号使其保持Pending状态,直到解除阻塞后才递达。关键区分点:阻塞是递达控制机制,忽略是处理方式;Pending是信号状态,Block是进程行为。信号阻塞独立于信号产生,可预先设置屏蔽未来信号。整个过程由内核统一管理,用户程序需通过系统调用介入。理解这些概念对掌握Linux信号处理机制至关重要。
2026-05-01 20:09:59
312
原创 进程与信号
本文探讨了父子进程与信号机制的关系,重点分析了子进程终止时的僵尸进程状态和信号通知机制。当子进程终止时,内核会将其置为僵尸状态并发送SIGCHLD信号通知父进程。父进程可以通过阻塞式或非阻塞式等待回收子进程,其中非阻塞式等待(使用WNOHANG标志)更为高效。文章通过代码示例验证了SIGCHLD信号的传递机制,并指出在多子进程场景下,父进程需要在信号处理函数中循环调用waitpid(-1, NULL, WNOHANG)来确保回收所有已退出的子进程。这种被动通知机制相比主动轮询更为高效,但需要注意标准信号的特
2026-05-01 20:06:22
399
原创 volatile与信号
文章摘要 volatile关键字在信号处理中解决编译器优化导致的变量可见性问题。当程序使用全局变量quit作为循环条件,并通过信号处理函数修改其值时,编译器优化可能导致主线程从寄存器读取旧值而非内存新值,使程序无法正常退出。使用volatile修饰变量可强制每次访问都从内存读取,确保异步修改的可见性。实验表明,高优化级别(-O3)下,未使用volatile的程序可能陷入死循环,而添加该关键字后程序行为符合预期,验证了其在异步场景中的必要性。
2026-05-01 19:59:57
414
原创 信号捕捉底层机制-机理篇2
本文介绍了Linux系统中两种信号捕捉方法:signal和sigaction,重点阐述了sigaction的使用方法和特性。sigaction通过struct sigaction结构体提供了更精细的信号控制能力,包括设置处理函数(sa_handler)、屏蔽信号集(sa_mask)和附加选项(sa_flags)。实验表明,在处理信号期间,同类型信号会被自动屏蔽,且标准信号不会排队处理,而是只保留一次未决状态。通过sigaddset可以额外屏蔽其他信号,确保处理过程不被干扰。相比简单的signal接口,sig
2026-05-01 19:54:10
368
原创 可重入和不可重入函数
可重入函数是指在执行过程中被中断后再次调用仍能正确运行的函数,不会破坏程序状态或导致数据不一致。以不带头结点的单链表头插操作为例,正常插入过程分为两步:新节点指向原头节点,再更新头指针。若在执行第一步后被信号中断,并在信号处理函数中再次调用插入操作,会导致两个插入过程交错修改共享头指针,最终可能丢失节点或破坏链表结构。这表明链表头插函数不可重入,因为它依赖共享状态且操作非原子化。在信号处理等异步场景中,应避免调用不可重入函数,防止重入冲突引发程序错误。
2026-04-27 21:41:58
387
原创 信号捕捉底层机制-机理篇
信号处理机制摘要 信号处理是Unix/Linux系统中进程间通信的重要机制,其核心流程可概括为: 信号产生与记录:信号通过系统调用、硬件异常或进程间通信产生,内核将其记录在目标进程的pending信号集中。 延迟处理机制:信号不会立即处理,而是等待"返回用户态前"的安全时机。 处理时机:当进程从内核态返回用户态时,内核会检查未决信号。若发现待处理信号: 构造用户态信号处理上下文 修改用户栈和返回地址 跳转执行用户定义的handler函数 特权级切换:整个过程涉及四次特权级转换,形成∞形执
2026-04-22 21:34:51
369
原创 信号捕捉底层机制-进程与OS
本文系统性地阐述了操作系统中的进程管理、虚拟内存与内核访问控制机制。主要内容包括: 进程基础结构:每个进程通过PCB(含mm_struct)管理独立的虚拟地址空间,使用页表实现虚拟到物理地址的映射,并通过写时拷贝优化进程创建。 内存管理机制:详细说明了用户空间与内核空间的划分(32位系统为0-3GB用户空间,3-4GB内核空间),所有进程共享统一的内核映射,保证内核代码单例性。 系统调用原理:解释了用户态到内核态的切换过程,强调特权级变化是关键区别,而非地址空间切换。 进程调度机制:分析了主动/被动调度方式
2026-04-22 21:33:15
453
原创 信号的保存的底层机制
本文系统性地介绍了 Linux 信号处理机制的核心原理与实现。信号处理分为三个阶段:生成、保存和递达。内核通过 pending 位图记录未决信号,使用 blocked 位图管理信号屏蔽,handler 数组存储处理函数。信号递达时,内核通过位运算判断信号状态(pending & ~blocked),并执行对应处理函数。文章详细解析了信号处理的底层数据结构(位图和函数指针数组)、状态转换逻辑(未决/递达)以及关键系统调用(sigprocmask)的实现机制,揭示了操作系统如何通过位运算和查表实现高效的
2026-04-22 21:30:10
394
原创 信号捕捉的底层机制-内核态和用户态初识
信号捕捉与处理机制是操作系统的核心功能之一。本文首先分析了普通信号可能丢失的问题,指出位图标记方式会导致短时间内重复信号的丢失,并介绍了Linux内核通过实时信号队列解决该问题的机制。随后详细阐述了用户态与内核态的区分,解释了系统调用的作用及其带来的性能开销,包括上下文切换、权限提升等过程。文章还深入探讨了STL容器如何通过预分配策略减少系统调用次数,以提高内存管理效率。最后,从进程上下文切换的角度,分析了寄存器在保存进程状态中的关键作用,包括可见/不可见寄存器的功能差异,以及PCB指针寄存器在快速定位进程
2026-04-22 21:24:52
435
原创 信号捕捉与不可捕捉机制(进阶篇)
信号捕获与异常处理机制总结 信号捕获与异常处理是程序错误处理的核心机制。操作系统通过信号机制(如SIGSEGV、SIGFPE)响应硬件异常,默认终止进程;高级语言则通过异常机制(throw/catch)抽象错误处理。两者本质相似: 信号机制:操作系统层面处理异常事件 异常机制:语言层面抽象错误处理 关键要点: 信号处理流程:产生→记录→延迟处理(通过PCB的pending信号位图) 终止类型差异: Term类信号直接终止进程 Core类信号会生成core dump文件供调试 调试价值:不同信号类型帮助快速定
2026-04-20 21:31:09
339
原创 信号的产生机制(来源全解析)
本文介绍了Linux信号产生与处理机制。主要内容包括:1) 键盘组合键(如Ctrl+C)触发SIGINT等信号的产生流程;2) 信号处理的三种方式(默认处理、忽略和捕捉),其中SIGKILL(9)是唯一不可被捕获或忽略的强制终止信号;3) 信号发送机制,包括前台进程概念和kill系统调用的使用;4) 信号处理的权限模型,强调信号发送本质是内核修改进程PCB位图;5) 信号默认处理行为特点,指出信号意义由其表示的事件而非默认动作决定。文章通过代码示例和表格对比,系统阐述了Linux信号机制的核心原理。
2026-04-20 21:29:41
379
原创 信号的处理方式与生命周期(核心机制篇)
信号机制的本质与实现 信号是Linux系统中进程间通信的基本机制,本质是操作系统内核通过修改目标进程PCB中的信号位图来实现事件通知。信号处理具有延迟性,进程通过位图记录接收到的信号状态(1~31号信号对应32位整数),由内核统一管理。 信号发送必须通过系统调用(如kill())完成,用户程序无权直接修改PCB。进程处理信号有三种方式:默认操作、自定义处理函数或忽略信号。常用的kill命令底层也是调用kill()系统调用,最终由内核修改目标进程的信号状态位。 整个信号机制的核心在于:所有信号操作最终都由操作
2026-04-20 21:24:48
373
原创 信号基础与整体框架
摘要:信号是操作系统向进程发送的异步事件通知机制,用于告知进程特定事件的发生。信号处理分为四个阶段:产生、保存、递达和处理。由于异步特性,信号可能不会立即处理,而是被记录为未决状态。处理方式包括默认操作、自定义处理函数或忽略信号(部分信号不可忽略)。内核通过位图记录未决信号,并在进程返回用户态时处理。该机制实现了进程间的事件通知,具有异步性、延迟处理和多种处理策略等关键特性。
2026-04-20 21:24:09
364
原创 Linux信号机制
信号处理机制摘要:信号是操作系统向进程发送的异步事件通知机制,用于指示特定事件发生(如Ctrl+C、定时器到期等)。信号处理分为四个阶段:产生、保存(未决状态)、递达和处理。信号具有异步性,可能延迟处理,因此内核使用位图记录未决信号。处理方式包括默认动作、自定义处理函数或忽略信号(部分信号不可忽略)。所有信号发送最终由内核通过修改目标进程PCB中的信号位图完成,用户需通过系统调用(如kill())触发信号发送。键盘组合键等硬件中断也会转换为信号发送给前台进程。
2026-04-20 19:44:38
417
原创 Linux 消息队列和信号量初了解
System V 消息队列是一种内核维护的进程间通信机制,采用FIFO队列结构传递结构化消息。消息包含类型字段,支持按类型选择性读取,实现双向通信。核心操作包括msgget创建队列、msgsnd发送消息、msgrcv接收消息和msgctl控制队列。信号量则用于解决并发访问共享资源时的同步问题,通过P/V操作保证互斥访问。两者都属于System V IPC机制,采用统一的设计模式,包括资源标识、获取和控制操作。消息队列适用于进程间数据传输,信号量则用于资源访问控制,共同构建安全的进程间通信环境。
2026-03-15 10:19:32
386
原创 共享内存通信
本文介绍了进程间通信(IPC)的核心机制,重点阐述了共享内存的实现原理。进程通过独立的内核数据结构、虚拟地址空间和页表实现隔离性,使得进程间默认无法直接共享数据。共享内存作为高效的IPC方式,通过将同一物理内存映射到多个进程的地址空间实现数据共享,避免了数据复制开销。其实现步骤包括创建共享内存、多进程映射和资源释放,并需要配合同步机制防止数据竞争。相比malloc分配的内存,共享内存由内核管理、支持多进程访问,是专门为IPC设计的通信机制。
2026-03-14 21:29:26
335
原创 Linux I/O 缓冲区、inode、软硬链接与磁盘结构全解析
摘要: Linux I/O缓冲区机制是提高程序效率的关键。标准库I/O函数(如printf、fprintf、fputs)通过用户态缓冲区暂存数据,减少系统调用次数,而系统调用write直接与内核交互,无缓冲。缓冲区刷新策略(行缓冲/全缓冲)影响输出时机,如终端输出时换行符触发刷新,而重定向到文件时可能因缓冲未满导致fork()后数据重复输出。write因无用户态缓冲,不受此影响。缓冲区的核心意义在于平衡I/O速度差异,提升性能。 (字数:150)
2026-03-14 15:48:45
409
原创 命名管道通信
命名管道(Named Pipe/FIFO)是一种进程间通信机制,允许无血缘关系的进程通过文件系统中的路径名访问同一管道。与匿名管道不同,命名管道通过文件路径实现资源共享,不依赖进程继承关系。其原理是多个进程打开同一FIFO文件时共享内核缓冲区,数据在内核中直接交换而不写入磁盘。创建使用mkfifo()系统调用,通信流程遵循Client-Server模型,通信结束后需用unlink()删除管道文件。命名管道的关键在于不同进程通过相同路径访问同一内核对象,实现跨进程通信。
2026-03-14 14:13:52
414
原创 匿名管道通信
匿名管道是一种基于内核缓冲区的进程间通信机制,其特点是没有文件名、仅存在于内存中,通过文件描述符继承实现父子进程间的单向数据传输。创建管道时会同时生成读端和写端文件描述符,父子进程通过fork()继承这些描述符后,需关闭不需要的端口来建立单向通信通道。典型应用场景包括父子进程间的数据传递,通信完成后需进行进程同步以避免资源泄漏。
2026-03-14 13:39:11
401
原创 进程间通信基础
进程间通信(IPC)是操作系统提供的机制,用于在独立进程间传递数据和协同工作。由于进程具有独立地址空间,无法直接访问彼此内存,必须通过共享资源实现通信。IPC方式包括管道、共享内存、消息队列等,本质区别在于公共资源的来源不同。管道作为典型IPC机制,利用内核缓冲区实现父子进程间高效通信,避免了磁盘I/O开销。其核心原理是通过创建内存级文件对象,使进程能够读写同一块内核缓冲区,完成数据交换。
2026-03-14 12:52:19
376
原创 C++中的多态
摘要:C++多态的实现基于虚函数机制,需要满足两个必要条件:(1)通过父类指针或引用调用函数;(2)在派生类中重写父类虚函数(函数名、参数列表和返回类型必须相同)。虚函数通过虚函数表实现动态绑定,每个含有虚函数的类会生成虚函数表,对象中包含指向该表的指针。特别地,基类析构函数应当声明为虚函数,以确保正确释放派生类资源。虚函数重写允许协变返回类型,且父类虚函数特性会自动继承给子类。正确使用虚函数机制是保证多态行为的关键。
2025-11-08 16:14:38
895
原创 C++中的继承
本文探讨了C++中子类和父类的赋值兼容规则及相关特性。主要内容包括:1)对象赋值的切割现象与指针/引用赋值的多态基础;2)继承函数的调用机制、重定义行为和功能扩展方法;3)作用域规则中的隐藏和删除机制;4)派生类默认成员函数(构造、析构、拷贝等)的实现原理;5)通过final关键字设计不可继承类的方法。重点阐述了派生类对象初始化顺序、成员隐藏规则以及多态实现的基础机制,为C++面向对象编程提供了关键技术参考。
2025-11-03 18:09:08
991
原创 基础IO-文件系统初步
本文摘要: 本文系统介绍了文件操作相关知识,包括文件基本概念、C语言文件接口和系统调用。文件由内容+属性组成,操作文件必须通过路径唯一标识。C语言提供fopen()等库函数进行文件读写,需注意不同模式(r/w/a等)的行为差异。底层系统调用open()使用标志位组合(O_RDONLY|O_CREAT等)和权限掩码机制(umask)控制文件访问。文件写入通过write()实现,操作系统将其视为字节流处理。最后通过示例代码演示了文件读写操作的具体实现方式。
2025-10-22 21:22:50
735
原创 进程的控制
本文主要介绍了进程创建与控制的相关概念和技术。 进程创建:通过 fork() 系统调用创建子进程,父子进程共享代码但拥有不同的返回值(父进程返回子进程 PID,子进程返回 0),从而实现不同逻辑分支。 进程退出:进程退出可返回状态码(exit())或直接终止(_exit()),区别在于是否刷新缓冲区。父进程需通过 wait() 或 waitpid() 回收子进程资源,避免僵尸进程。 进程等待: wait()和 waitpid() 提供更灵活的等待方式以及进程退出与程序装入的联系
2025-10-12 21:06:25
996
原创 进程初了解
本文介绍了操作系统中的进程管理机制。主要内容包括:1) CPU通过内存与外设交互以提高效率,程序运行必须加载到内存;2) 进程通过PCB(进程控制块)进行管理,操作系统将进程管理转化为对链表的操作;3) 进程状态包括运行、阻塞、挂起、僵尸和孤儿状态,其中僵尸进程会导致内存泄漏;4) 进程优先级通过PRI和NI值调整;5) 进程切换涉及上下文保护和恢复;6) 虚拟地址空间通过写时拷贝机制实现进程隔离,保证安全性。文章还解释了进程加载过程,说明程序内部使用虚拟地址而非物理地址。
2025-10-10 19:59:55
600
原创 STL六大组件-适配器篇
这篇文章实现了C++中的三种容器适配器:stack、queue和priority_queue。stack和queue通过模板类实现,支持vector/list等容器作为底层结构,提供了push/pop/top等基本操作。priority_queue基于堆结构实现,默认大根堆,可通过仿函数改为小根堆,包含向上/向下调整算法来维护堆结构。文中还介绍了堆的特性:大根堆的根是最大值,小根堆的根是最小值,适用于排序和Top K问题。这些适配器都是通过复用现有容器实现的,体现了STL的设计思想。
2025-10-10 12:40:32
378
原创 STL六大组件-容器篇
本文介绍了C++中stl中容器类的实现,重点讲解了深浅拷贝的区别及其实现方式。文章通过URL和网站的比喻形象地说明了浅拷贝(复制指针)和深拷贝(复制数据)的区别。代码部分展示了三种容的基本实现,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、容量操作(reserve/resize)以及字符串修改操作(push_back/append/insert/erase)。实现中特别关注了内存管理问题,如防止内存泄漏、正确处理字符串终止符'\0'等,解释了_size(有效字符数)和_capacity的区别
2025-10-10 11:56:21
694
原创 网络初认识
TCP/IP协议栈是网络通信的核心框架,分为数据链路层(ARP协议)、网络层(IP/ICMP)、传输层(TCP/UDP)和应用层。数据传输时通过封装添加各层头部信息,接收时通过分用解析。DNS实现域名到IP的转换,查询过程涉及递归器、根服务器、TLD服务器和权威服务器。Socket作为系统调用接口,使应用程序能访问协议栈功能,实现数据传输和控制。该体系结构清晰划分各层职责,确保网络通信的可靠性和效率。
2025-10-08 21:32:50
775
原创 模板和内存管理
C++模板与内存管理摘要 本文介绍了C++模板编程和内存管理相关知识。模板包括函数模板和类模板,通过泛型编程实现代码复用,编译器在预处理阶段实例化模板。类模板演示了vector的实现细节。引用传参可减少拷贝并修改实参,引用返回值可修改返回对象。 内存管理部分讲解了变量生命周期、静态/全局变量区别、操作系统内存管理机制。详细对比了malloc/free与new/delete的区别:new/delete会调用构造/析构函数,是操作符而非函数。介绍了operator new/delete和定位new的用法。最后指
2025-06-12 20:29:08
269
原创 vector
string与 vector区别,string更贴合字符串的操作,单项信息,vector存储的种类更多vector插入数据如何实现的?为什么是2倍和1.5倍,增加的多少是一种选择,从空间资源浪费程度上上合理选择vector是有一定缺陷的,要付出代价的v[4] 终止程序v.at(4)抛异常函数模板:[fast,last)左闭右开push_back,insert,resize,reserve等可能都会导致迭代器的失效memxx,按字节拷贝处理list和vector是相辅相成的。
2025-06-12 20:21:40
915
原创 CPP篇:类和对象
是一种在中允许的特性。C++是如何支持函数重载的,为什么C语言不支持c++改变函数名修饰规则,编译后加上参数而C语言只有函数名,C 语言采用的是,编译器仅仅通过来确定调用哪个函数预处理:头文件展开。宏替换,条件编译,去掉注释编译:检查语法,生成汇编代码汇编:把汇编代码转成二进制机器码链接:将两个目标文件连接在一起引用:类型+&+参数 赋别名取地址:& + 参数。
2025-05-27 21:11:53
626
原创 GNU Make基础篇
本文介绍了GNU Make的基本概念和makefile的编写规则。makefile用于定义编译和链接的依赖关系,通过规则指定目标文件、依赖文件和生成命令。文章详细讲解了makefile的框架、示例、工作方式、书写规则、通配符使用、文件搜寻、伪目标、多目标、静态模式以及自动生成依赖性的方法。通过这些内容,读者可以掌握如何编写和使用makefile来管理项目的编译过程。
2025-05-19 21:26:17
108
原创 CPP篇:类和对象
类和对象基础概念总结 本文介绍了C++中类和对象的核心概念: 类成员存储机制:对象只存储成员变量,成员函数存放在公共代码段以节省空间 this指针:隐含参数,指向当前对象,用于成员函数访问成员变量 构造函数:对象初始化时自动调用,可重载,包括全缺省和无参构造函数 析构函数:对象生命周期结束时自动调用,用于资源清理 拷贝构造函数:用已有对象初始化新对象,需注意引用传参避免无限递归 运算符重载:扩展运算符功能,须遵循特定规则
2024-12-03 21:33:15
980
原创 项目报告:基于OpenCV的人脸识别技术 (1)
OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,在BSD许可下发布,支持学术和商业用途。其主要特性包括:
2024-11-10 20:09:38
1637
原创 Markdown
Markdown的更改通过查找Markdown语法,指示文本中的内容的格式发生变化。接下来让我们一起去看看Markdown语法的使用吧
2024-09-26 19:29:02
1558
空空如也
vs2013一打开出现图示乱码
2023-11-08
安装Ubuntu 时最后发生错误无法打开
2023-10-03
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅