- 博客(214)
- 收藏
- 关注
原创 理解互斥锁:从硬件原子指令到临界区保护
线程切换通过寄存器上下文保存实现数据私有性,每个线程都感觉自己独占CPU。锁的实现分为硬件级(关中断)和软件级(原子指令),现代OS主要采用后者。xchgb原子交换指令是关键,它能保证操作的不可分割性、所有权转移和内存可见性。锁机制的核心在于:1)单条指令的原子性;2)锁凭证的私有性;3)修改对所有CPU核心的可见性。
2026-04-19 20:05:07
65
原创 Linux线程同步与互斥(一):互斥量与锁的理解
介绍了多线程编程中的资源共享与互斥问题。通过售票系统案例,分析了线程并发操作共享变量导致的数据不一致问题,如票数减为负数等。关键问题在于判断和修改(ticket--)操作之间的时间窗口,以及ticket--本身不是原子操作。介绍了互斥锁(mutex)的解决方案,包括锁的初始化、加锁、解锁和销毁操作,并提供了C和C++两种实现方式。通过CPU的原子交换指令保证锁的原子性。展示了如何封装互斥锁类,实现RAII风格的资源管理。
2026-04-19 17:26:52
430
原创 解决 Ubuntu 下 man 手册找不到 pthread 函数的问题
在Linux C多线程编程中,即使包含pthread.h头文件,使用man命令查询pthread_mutex_t等函数时可能提示无手册条目。这是因为Ubuntu默认未安装POSIX线程库文档,这些内容被单独打包在manpages-posix-dev中。解决方法是通过sudo apt install manpages-posix-dev安装该包,即可获取线程、互斥量等POSIX接口的完整手册。安装后可通过man 3 pthread_mutex_t等命令查询。
2026-04-19 13:38:51
171
原创 Linux 【线程封装】
介绍了Linux系统下轻量级进程和线程的实现原理及封装方法。首先通过clone系统调用演示了创建轻量级进程的过程,重点讲解了栈空间分配和资源共享标志的设置。然后分析了mmap内存映射机制及其在进程间通信中的应用,探讨了线程栈空间的共享特性。展示了一个基于pthread的C++线程封装类,包括线程创建、分离、终止等功能的实现,以及命名空间、模板等现代C++特性的应用。
2026-04-18 21:53:32
458
原创 Linux线程(三): 线程控制:退出、等待、分离
介绍了Linux系统中线程的基本概念和操作方式。主要内容包括:1. 线程标识获取方法,区分用户态线程ID(pthread_t)和内核轻量级进程ID(LWP);2. 线程创建函数pthread_create的使用方法及参数传递技巧;3. 线程等待(pthread_join)和终止的三种方式(return/pthread_exit/pthread_cancel);4. 分离线程的概念和使用场景;5. 多线程编程中的竞态条件问题及解决方案
2026-04-16 17:26:02
382
原创 Linux线程(二): 线程控制之创建
阐述了线程相关核心概念与实现机制。首先从硬件层面解析了TLB(快表)的工作原理及其在地址转换中的加速作用,深入剖析了缺页中断的触发条件与处理流程。其次,对比了进程与线程的资源共享特性,重点讲解了POSIX线程库的使用方法,包括线程创建、属性设置等关键API。针对不同应用场景,文章详细区分了计算密集型和I/O密集型任务的特点及线程配置策略,并揭示了Linux线程的本质实为轻量级进程(LWP)。最后,通过实例代码演示了多线程编程实践,同时指出了线程过多可能导致的问题及优化方向。
2026-04-14 15:34:15
324
原创 Linux线程(一):从进程到线程,揭开并发执行的面纱
Linux线程是进程内部的执行分支,作为CPU调度的基本单位。进程承担资源分配,线程共享进程资源但拥有独立执行流。Windows采用PCB+TCB设计,内核维护成本较高。分页式存储通过虚拟地址和页表映射解决内存碎片问题,采用多级页表结构(页目录+页表)实现地址转换,配合TLB提升效率。线程优点包括创建/切换快、资源占用少、利于多核并行;缺点涉及性能损失、健壮性降低和编程复杂度高。线程异常会导致进程终止,合理使用多线程可提升CPU/IO密集型任务效率。
2026-04-12 15:18:35
867
原创 C 盘被微信占满?微信C盘空间清理指南
微信电脑版默认将聊天文件自动存储在C盘,长期占用大量空间。解决方法:1. 定位微信数据位置;2. 安全清理:可删除Cache/Temp等缓存文件,谨慎处理Image/Video等媒体文件,切勿删除Msg文件夹;3. 迁移存储路径到其他磁盘;4. 关闭自动下载功能防止重复占用空间。操作时需注意备份重要数据,避免误删核心文件导致聊天记录丢失。
2026-04-12 09:19:24
985
原创 Linux进程信号(五):可重入函数、volatile与SIGCHLD信号
阐述了操作系统内核态与用户态的隔离机制、可重入函数特性、volatile关键字作用及SIGCHLD信号处理。内核通过特权级别(CPL)实现权限隔离,用户态需通过系统调用陷入内核态。可重入函数需避免使用全局变量,信号处理中尤需注意。volatile防止编译器优化导致的内存不可见问题。SIGCHLD信号处理介绍了自动回收和异步回收两种策略,强调需使用非阻塞waitpid避免僵尸进程。这些机制共同保障了系统安全性、稳定性和资源管理效率。
2026-04-10 20:17:40
551
1
原创 Linux进程信号详解(四):信号捕捉
Linux信号处理机制及其与操作系统运行原理的关系。信号处理时机分为立即处理和延迟处理,其中自定义信号处理函数需经历四次态切换(用户态-内核态-用户态-内核态)。对比了signal和更健壮的sigaction函数,后者支持精确控制信号屏蔽和获取额外信息。操作系统运行本质上是中断驱动的,包括硬件中断(如时钟中断)和软中断(如系统调用)。时钟中断以固定频率触发调度,使OS实现抢占式多任务。解释了死循环实际仍受时间片调度,以及内存错误等如何通过软中断转化为信号处理。
2026-04-08 22:02:43
466
原创 Linux 信号处理:Core vs Term 解析
介绍了信号处理中的CoreDump机制。信号分为Core和Term两类:Core信号会终止进程并生成coredump文件(如SIGQUIT、SIGSEGV等),Term信号仅终止进程(如SIGINT、SIGTERM等)。CoreDump是进程内存的快照,可用于调试。云服务器通常禁用此功能,可通过ulimit命令临时或永久开启。文中提供了测试程序演示除零错误(SIGFPE)触发coredump,并使用gdb分析core文件定位错误位置。
2026-04-06 21:59:21
231
原创 Linux进程信号详解(三):信号保存
解析了Linux信号处理机制中的核心概念。重点阐述了信号递达、未决和阻塞的区别,指出阻塞是屏蔽信号递达而忽略是处理后的主动丢弃。介绍了内核中信号的三要素表示(blocked位图、pending位图、handler函数指针),并提供了信号集操作函数的使用方法。通过代码示例演示了如何通过sigprocmask阻塞信号并观察pending变化,强调了解除阻塞后信号才会递达的特性。
2026-04-06 21:20:05
960
原创 Linux进程信号详解(二):信号产生
介绍了Linux系统中信号的产生方式及其处理机制。主要内容包括:1)通过终端按键(Ctrl+C、Ctrl+\、Ctrl+Z)产生信号的基本操作;2)使用kill命令向指定进程发送信号的方法;3)通过kill()、raise()和abort()等系统函数产生信号的实现原理;4)硬件异常(如除零错误、野指针访问)与信号的对应关系。
2026-04-05 20:46:56
387
原创 vscode下载+插件
介绍了VSCode的下载安装指南及实用技巧。针对国内下载慢的问题,提供了3种加速方法:修改下载链接替换为国内CDN(推荐)、使用国内镜像直链、借助下载工具。安装时建议勾选创建桌面快捷方式和添加PATH环境变量。安装完成后,推荐首先安装中文语言包,并列举了C/C++开发必备插件清单(如Remote-SSH、C/C++扩展包等)和GDB调试插件。全文提供了详细的操作步骤,帮助新手快速完成VSCode的下载安装和基础配置。
2026-04-05 19:42:59
469
原创 Linux进程信号详解(一):信号快速认识
介绍了Linux信号机制,通过生活实例(如快递处理)类比信号处理的异步特性。信号产生后会被保存,在合适时机处理,方式包括忽略、默认和自定义动作。分析了键盘信号(如Ctrl+C发送SIGINT)的处理过程,并通过代码示例验证信号捕捉。同时阐述了前后台进程的核心区别:前台进程独占终端输入并响应键盘信号,后台进程则不具备这些特性。解释了前台进程唯一性的硬件限制,以及孤儿进程自动后台化的机制。
2026-04-04 22:10:36
560
原创 进程间通信:消息队列、信号量与内核管理
SystemV IPC机制提供了三种进程间通信方式:消息队列、信号量和共享内存。消息队列支持有类型的数据块传输,通过msgget/msgsnd/msgrcv等函数实现;信号量作为计数器用于进程同步互斥,通过semget/semop等函数操作;共享内存是最快的IPC方式但需配合信号量使用。这些资源都通过内核统一管理,具有生命周期随内核、需手动删除的特点。核心区别在于:消息队列传输结构化数据,信号量提供同步机制,共享内存实现高效数据共享。三者配合可构建复杂的进程通信系统,其中信号量是保证共享资源安全访问的关键。
2026-04-04 14:58:45
754
原创 Git【企业级开发模型】
介绍了企业级软件开发中的Git分支管理模型,重点阐述了GitFlow工作流程。文章首先分析了企业开发中Dev与Ops团队的目标冲突,以及DevOps文化如何通过标准化流程解决这一问题。随后详细说明了四大开发环境(开发、测试、预发布、生产)及其对应的分支策略,包括master、develop、feature、release和hotfix五种核心分支的使用场景和操作规范。
2026-04-02 23:59:35
488
1
原创 System V 共享内存 —— 进程间通信方式
共享内存是最高效的IPC机制,它允许多个进程直接访问同一块物理内存区域,避免了数据在用户态和内核态之间的拷贝开销。与管道相比,共享内存通过内核分配物理内存并映射到进程地址空间,使得进程间通信无需系统调用,极大提升了性能。内核使用shmid_ds结构管理共享内存,包含大小、权限、引用计数等信息。
2026-04-02 19:28:38
522
原创 Git【多人协作二】
介绍了Git多人协作开发中功能分支的使用方法。通过为每个需求创建独立分支(如feature-order和feature-comment),开发者可以并行工作而互不干扰。讲解了功能分支的创建、推送、合并及删除流程,包括如何接手同事的分支工作,以及最终将功能合并到主分支的步骤。提供了常用命令速查表,涵盖分支创建、推送、拉取、删除等核心操作。这种基于功能分支的开发模式能有效避免代码冲突,提高团队协作效率。
2026-04-01 21:09:32
593
原创 Git【多人协作一】
介绍了Git多人协作开发的基本流程: 环境搭建:创建远程dev分支,开发者A/B分别克隆仓库并建立本地分支关联;协作开发: 开发者A修改文件并推送 开发者B基于旧版本修改导致推送冲突;冲突解决:通过git pull合并冲突,手动修改后重新提交推送;分支合并:将测试通过的dev分支合并到master主分支 工作模式:先推送→失败则拉取→解决冲突→重新推送→最后合并到master并删除开发分支
2026-03-31 15:08:40
370
原创 vscode|无法连接到远程扩展主机服务器 (错误: CodeError(AsyncPipeFailed(Os { code: 2, kind: NotFound, message: “No such
VSCode远程SSH连接失败问题解决 摘要:本文记录了一个典型的VSCode Remote-SSH连接错误(CodeError:AsyncPipeFailed),该错误表现为远端文件/目录不存在导致连接中断。虽然本地网络和服务器状态正常,但VSCode在远端执行命令时出现问题。通过清理远程服务器上的VSCodeServer缓存(vscode-server目录)成功解决了该连接问题。
2026-03-30 21:36:29
57
原创 Git【标签操作】
Git标签功能为特定提交赋予易记名称(如v1.0),解决commitid难记的问题。标签分为轻量标签和附注标签,后者支持添加说明信息。通过git tag命令可创建、查看标签,git push --tags推送到远程仓库。标签适用于版本发布(如v1.0.0)、里程碑标记等场景,支持快速回退到指定版本。管理标签时,可删除本地标签(git tag -d)或远程标签(git push origin :refs/tags/v1.0),实现灵活的版本控制。
2026-03-30 20:12:20
397
原创 Git【远程操作】
介绍了Git远程仓库的基本概念与操作方法。主要内容包括:1. 分布式版本控制系统与集中式的区别,强调Git的本地完整版本库特性;2. 远程仓库的作用(备份、协作、托管)及主流平台选择;3. 详细讲解了SSH密钥配置、克隆远程仓库、推送/拉取代码的操作流程;4. 介绍了.gitignore文件的使用方法;5. 提供了Git命令别名配置技巧。
2026-03-30 19:30:24
683
原创 为什么要配置环境变量?
摘要: 环境变量是操作系统与程序间的"全局通讯录",核心PATH变量记录可执行程序的位置。配置环境变量能:1)省去输入完整路径的麻烦,提升命令行效率;2)确保程序正确找到依赖(如Maven需JAVA_HOME定位JDK);3)便于开发者切换不同环境配置(如开发/生产环境)。不配置会导致软件无法直接运行、依赖缺失、环境切换困难等问题。
2026-03-29 23:31:02
1688
3
原创 VSCode常见快捷键大全
VSCode高效快捷键指南:整理了VSCode最实用的快捷键组合,分为五大类:1.基础操作(文件新建/保存/关闭);2.代码编辑(复制/移动/格式化);3.多光标编辑(批量修改神器);4.查找替换(快速定位内容);5.导航视图(跳转定义/错误排查)。
2026-03-29 21:24:13
424
原创 进程间通信(三):命名管道
命名管道(FIFO)是一种特殊文件类型,用于不相关进程间的通信。与匿名管道不同,命名管道通过文件系统路径标识,允许多个无亲缘关系的进程访问同一内核缓冲区进行数据交换。其核心特性包括:数据仅存于内核缓冲区不落盘、默认阻塞式打开规则、半双工通信模式。文章介绍了命名管道的创建方法(mkfifo)、通信机制,并通过文件拷贝和C/S通信两个案例展示了具体应用场景。命名管道相比普通文件通信具有更高效率,适用于需要临时数据交换的进程间通信场景。
2026-03-29 20:56:13
396
原创 Git【管理分支】
讲解了Git分支的核心概念与实用技巧。通过平行宇宙比喻解释分支原理,说明分支是并行开发的利器。重点介绍了分支创建、切换、合并(包括快进合并和冲突解决)等基本操作,演示了如何通过git checkout -b快速创建分支,使用git merge --no-ff保留合并历史。针对实际开发场景,说明了紧急bug修复流程(使用git stash保存现场)和分支管理策略(如master-dev-feature三级分支模型)。
2026-03-29 14:12:11
535
原创 关于【进程池阻塞 + 子进程未回收问题】
本文分析了进程池实现中常见的文件描述符泄漏问题,指出子进程因继承父进程所有管道写端而导致read阻塞无法退出的核心原因。解释了管道读写机制,并给出两种解决方案:1)倒序关闭管道;2)在子进程中主动关闭继承的写端。通过修复代码演示了如何正确处理文件描述符,避免子进程阻塞和僵尸进程问题,实现进程池的正常回收。该问题本质是父子进程间文件描述符继承导致的死锁现象,正确管理文件描述符是进程间通信的关键。
2026-03-28 21:55:40
398
原创 Git入门指南(二):基本操作
本文介绍了Git基础操作中的关键功能:1. 使用git status/diff查看文件修改状态和差异;2. 版本回退操作(git reset)的三种模式及注意事项;3. 撤销修改的三种场景处理(工作区、暂存区、已提交);4. 文件删除与恢复的正确操作流程;5. 通过git reflog找回误操作的历史记录。。
2026-03-28 11:22:02
731
原创 Git入门指南(一):从零开始,掌握Git基础操作
Git是一款分布式版本控制系统,专为解决文件版本管理混乱问题而设计。它能精确记录文本文件的每次修改,支持版本回溯、多人协作等功能。安装简单,支持Linux/Windows等多平台,通过git init初始化仓库后,文件修改需经工作区→暂存区→版本库的规范流程。核心操作包括git add添加文件、git commit提交版本,配合git log可查看完整修改历史。Git通过.git目录存储所有版本数据,是开发者管理代码版本的必备工具。
2026-03-27 22:11:57
1075
原创 MySQL 在 Ubuntu 环境安装
Ubuntu 安装 MySQL 只需 sudo apt install mysql-server ;安全初始化用 mysql_secure_installation;远程连接修改 bind-address + 创建授权用户;MySQL 8.0 默认 utf8mb4,无中文乱码问题;服务管理、防火墙、密码重置均有完整方案
2026-03-26 09:59:03
414
原创 MySQL 在 Centos 7环境安装
本文讲解了 CentOS 7 下 MySQL 5.7 的完整安装流程,核心步骤为清理 MariaDB 冲突环境→配置官方 Yum 源→安装 MySQL 服务→启动并配置登录密码→设置 UTF-8 编码,同时解决了安装过程中的秘钥过期、中文乱码、密码登录失败等常见问题。
2026-03-26 09:53:58
412
原创 进程间通信(二):实现一个高可用的进程池
管道通信具有原子性和容量限制(Linux下4KB),当写入数据小于PIPE_BUF时保证原子性。父子进程通过管道通信时,输出到显示器不会相互干扰。 介绍了基于匿名管道的进程池实现方案,包含四个核心类:TaskManager管理任务,Channel封装单个通信信道,ChannelManager管理所有信道,ProcessPool作为主控类。进程池采用预创建子进程的方式,主进程通过管道向子进程发送任务码,子进程执行对应任务,实现了任务的均衡分配。
2026-03-25 20:00:14
555
原创 进程间通信(一):从IPC基础到管道通信
进程间通信(IPC)是操作系统实现进程协作的关键机制。阐述了进程隔离的必要性及通信需求,介绍了IPC的四种目的:数据传输、资源共享、事件通知和进程控制。分析了管道通信机制,包括匿名管道的工作原理、系统调用接口及实现方式。通过代码示例展示了父子进程如何通过pipe()创建管道、fork()共享文件描述符,并建立单向通信通道。强调管道符合“Linux一切皆文件”的设计理念,其本质是让不同进程访问同一块内核缓冲区。
2026-03-24 14:47:21
644
原创 VS Code Remote-SSH 连接失败:提示过程试图写入的管道不存在
解决VSCode远程SSH连接失败的三种方法:1)在VSCode设置中指定SSH配置文件绝对路径;2)将OpenSSH路径添加到系统环境变量;3)清理known_hosts文件中的服务器记录。检查发现密钥指纹添加成功,但密码认证仍失败,可能是密码输入错误导致。建议重新确认密码是否正确输入。
2026-03-23 20:35:58
190
原创 MySQL【用户管理】
MySQL用户管理是数据库安全的重要环节。通过创建特定用户并分配最小必要权限,可避免直接使用root账户带来的风险。用户信息存储在mysql.user表中,包含主机、用户名和加密密码等字段。创建用户需注意密码策略和主机限制,避免使用'%'开放所有主机访问。授权使用GRANT命令,遵循最小权限原则;撤销权限使用REVOKE。权限修改后需执行FLUSH PRIVILEGES刷新。不要将MySQL端口暴露在公网,防止暴力破解和数据泄露风险。
2026-03-22 15:15:54
371
原创 MySQL【事务下】
事务机制通过原子性、隔离性等特性确保数据库状态的安全切换,核心包括:1. 一致性保障:事务将数据库从一个合法状态切换到另一个合法状态,失败时回滚避免中间状态;2. 并发控制场景:分为读-读(无冲突)、读-写(需隔离级别控制脏读等问题)和写-写(需锁机制防止更新丢失);3. InnoDB实现:通过隐藏列(事务ID、回滚指针等)和undo日志构建多版本链,支持MVCC机制;4. ReadView机制:决定事务可见性,RR级别首次快照读生成后复用,RC级别每次快照读重新生成,这是两者本质区别。
2026-03-22 11:27:32
502
原创 MySQL【视图】
视图是数据库中的虚拟表,由查询语句定义,不存储实际数据但能动态反映基表变化。创建视图使用CREATE VIEW命令,可简化复杂查询、隐藏敏感数据。视图与基表数据双向影响,查询视图与普通表操作相同。使用视图时需注意性能影响、索引限制等规则,建议避免在视图定义中使用ORDER BY。视图提供数据安全性和查询便利性,是数据库管理的重要工具。
2026-03-21 21:57:58
351
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅