- 博客(36)
- 收藏
- 关注
原创 【Linux】线程同步:条件不满足时,线程该怎么等
互斥保证安全,同步保证秩序,条件变量则把"条件不满足就挂起、条件满足就唤醒"这件事标准化成了 wait 和 signal 两个动作。光有这两件工具还不够:多个线程一读一写,到底该怎么组织?下一篇我们用生产者消费者模型把这一切整合到一起,并给出可以直接跑的完整代码。
2026-10-24 15:40:49
308
44
原创 【Linux】线程互斥:多线程改同一个变量,到底会出什么问题
这一篇我们从抢票的 bug 出发,弄清了两件事:为什么不加保护的全局变量不安全(减减和判断都不是原子的),以及互斥锁是怎么解决问题的(用一条交换指令把锁的申请变成原子操作,让临界区从并行变串行)。不过纯互斥只解决了"对不对"的问题,没解决"好不好"的问题——一个线程如果反复申请释放锁却不干正事,其他线程可能饿死。下一篇我们讲线程同步,看看条件变量怎么让线程们按秩序排队。
2026-10-24 15:37:44
662
20
原创 【Linux】线程(下):怎么创建、终止与分离一个线程
到这里,线程的两篇就写完了。回顾一下:上篇讲的是线程的概念——Linux 用进程模拟线程,资源划分本质是划分页表;这一篇讲的是线程的控制——pthread 库在用户层把轻量级进程封装成线程,管理块、独立栈、clone 联动,构成了完整的用户级线程体系。你会发现之前学的进程知识在这里几乎全部复用了:fopen 的思想、PCB 的管理思路、僵尸进程的等待问题,换了个名字又出现了一遍。下一篇我们进入线程的重点话题:多个线程共享数据之后,怎么保证它们不打架——线程同步和互斥。
2026-10-21 17:08:36
319
21
原创 【Linux】线程(上):进程里面还能再“分”出执行流吗
先从教材定义来看。进程 = 内核数据结构 + 自己的代码和数据(执行流);线程,则是进程内部的一个执行分支(执行流)。再换个角度:从内核和资源的角度看,进程是承担分配系统资源的基本实体——不管是内核数据结构还是代码和数据,都要占据内存资源、CPU 资源,所以进程一定要消耗系统的资源;而线程,是 CPU 调度的基本单位。这两个定义放在一起就很有意思了:资源分配的时候,我们以进程为单位来分;真正上 CPU 跑的时候,调度的是线程。也就是说,一个进程内部是允许多条执行流存在的,它们共同瓜分这个进程拿到的资源。
2026-10-20 18:00:23
590
29
原创 【Linux】信号(下):进程是怎么“处理”信号的
两篇合起来,信号的全貌就完整了:产生端五种方式殊途同归,落到 pending 位图;保存靠 pending、block、handler 三张表;处理则卡在内核态返回用户态的那个检查点上,先查 pending 再查 block,默认和忽略内核顺手就办了,自定义捕捉要回到用户态执行,一来一回正好四次身份切换。而为了讲清“凭什么进内核”,我们又把硬件中断、中断向量表、时钟源、系统调用号这条线走了一遍——操作系统的本质就是一个死循环,躺在中断处理例程上,被时钟源推着走。
2026-10-20 17:31:24
352
32
原创 【Linux】信号(上):一个进程是怎么“被通知”的
信号是一种给进程发送的,用来进行事件异步通知的机制。异步的意思是同一时间两件事情同时发生,互不干扰,就好比人正在睡觉,闹钟也正在慢慢走,两者各干各的,直到闹钟响了再通知起床;信号的产生,相对于进程的运行就是异步的。关于信号,先给四条基本结论:1、信号处理,进程在信号没有产生的时候,早就知道信号该如何处理了;2、信号的处理,不是立即处理,而是可以等一会再处理,在合适的时候进行信号的处理;3、进程能识别信号,是提前被“教育过的”,操作系统程序员设计的进程,早就已经内置了对于信号的识别和处理方式;
2026-10-16 22:32:23
685
27
原创 【力扣刷题】第五天:将 x 减到 0 的最小操作数、最大连续1的个数 III
系列专栏直达链接🐧 Linux🔤 C语言🔧 C++🐬 MySQL🧩 算法刷题。
2026-10-16 22:29:25
369
24
原创 【Linux】进程间通信:两个互相看不见的进程,怎么看到同一份资源
这节课我们学习了进程间通信的几种方式,从最古老的管道,到 System V 标准的共享内存与信号量,它们看似各不相同,但本质上都在回答同一个问题——怎么让两个互相看不见的进程,看到同一份资源。匿名管道靠继承,命名管道靠同一个路径,共享内存靠把两块虚拟地址映射到同一块物理内存上,而信号量则在这之上补了一层对资源数量的管理。如果有哪里讲得不清楚,也欢迎各位大佬在评论区指正,我们一起把这些底层的东西啃透。
2026-10-14 15:29:43
717
21
原创 【Linux】揭开文件系统神秘的面纱:第四讲:可执行文件的组装车间
我们平时写代码,几乎都离不开printfstrlen这些函数,可它们并不在我们自己写的源文件里,那它们是从哪来的呢?它们来自库。库是写好的、现有的、成熟的、可以复用的代码,现实里每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,所以库的存在意义非同寻常。本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行,而库又分两种:静态库和动态库,这两种我们后面分别来看先看静态库。静态库本质就是打了包的.o文件,打包用的命令是ar -rc,也就是归档,把一堆.o。
2026-10-13 13:55:48
357
20
原创 【Linux】揭开文件系统神秘的面纱:第三讲:磁盘是怎么记住每一个文件的
这一篇我们从磁盘的盘面、磁道一路讲到了inode和软硬连接,整条线可以拆成三件事:磁盘负责存,文件系统负责组织,目录负责记名字以后我会继续创作 Linux 方向的博客,如果觉得有帮助的话,希望各位大佬能三联关注支持一下,看到后我会进行回关和回访。
2026-10-12 15:24:19
288
18
原创 【Linux】揭开文件神秘的面纱:第二讲,操作系统自己的菜鸟驿站——文件缓冲区
这节课带大家学习了有关文件缓冲区的知识,还有理解了一切皆文件到底是怎么实现的,希望大家在看完这篇文章后能从中学到新知识。以后我会继续创作Linux方向的博客,如果觉得有帮助的话希望各位大佬能三联关注支持一下,看到后我会进行回关和回访。
2026-09-20 19:18:56
511
29
原创 【Linux】将进程知识与基础IO融会贯通——简单自定义Shell的实现
至此,我们的简单的自定义shell就写完了,虽然它和我们平常用的shell还有不小的区别,但是以我们目前学习的知识只能写成这样了,编写这个程序的目的也不是要完全还原shell的所有功能,而是利用这么一种方式来让大家能够更好的掌握之前学习的知识,希望大家在看完这篇文章后能更好的掌握这一部分的知识。if(pwd!g_argc--;else。
2026-09-20 16:35:21
626
23
原创 【Linux】揭开文件神秘的面纱:第一讲,重定向背后的秘密
这节课我们完成了对Linux中文件的初步认识,了解了重定向的基本原理,虽然这篇文章的主要篇幅不在讲解重定向上,但是通过上文的铺垫,相信大家在学习重定向相关知识时非常容易理解,这就是为什么我要花这么多的篇幅用于讲解其他知识的原因,希望这篇文章能让大家对文件系统和重定向操作有了更深的认识。
2026-09-19 15:22:17
568
19
原创 【C++】C++11的魔法:不止右值引用,C++11赋予的编程神力
这节课我们完成了对C++11剩余知识的学习,还剩下一个智能指针我们下一篇文章再进行讲解。不得不说C++11不愧是C++最重大的一次更新,很多新内容都非常的有用,设计也十分巧妙,学会熟练使用C++11的内容可以让我们的代码水平更上一层楼。
2026-09-17 14:20:39
314
20
原创 【力扣刷题】第二天:无重复字符的最长字串、移动零问题
原题。按照惯例,先来讲解一下我的错误思路,大家引以为鉴。我最初的思路是利用哈希表,从头到尾遍历一遍字符串,每遍历一个字母,就在哈希表内查找是否有重复,若无重复就插入哈希表,如果重复,就先将当前的字符个数插入红黑树中,再清空哈希表,从当前字符开始继续遍历。遍历结束后,根据红黑树的有序性,就可以得到最长字符串的长度。但是后来我发现一个问题,就是每次一遇到重复字符就清空哈希表的话,很容易导致原本可以更长的字符串因为将之前的字符都清空了导致实际长度不够,而且这么写也过于复杂了,所以最后还是采取了标准写法。
2026-09-16 10:55:34
248
15
原创 【Linux】一篇文章带你吃透进程控制:fork、wait、exit到底在做什么
本文梳理了Linux进程控制四大核心:进程创建、进程退出、进程等待与程序替换。进程退出标记生命周期结束,wait/waitpid用于回收子进程,避免僵尸进程;exec系列系统调用实现程序替换,在保留进程资源的前提下加载新程序。理解这套机制,能看清进程从创建到消亡的完整流程,也是操作系统并发编程的重要基础。
2026-09-16 10:08:01
373
14
原创 【C++】C++11到底新增了什么?一篇文章带你搞懂列表初始化、右值引用和移动语义
这篇文章带大家了解了C++11中新增的部分内容,主要就是列表初始化,右值引用以及配套的使用场景和移动语义,希望能帮助大家理解。
2026-09-14 15:36:56
333
10
原创 【MySQL】一篇文章带你了解MySQL基础知识、库/表操作和数据类型
数据库简单来说就是用来一个用来存储数据的仓库,它的底层也是目录和文件。此时就有了一个疑问:文件已经有了存储文件的能力,为什么还要数据库呢?一般的文件确实提供了数据的存储功能,但是文件并没有提供非常好的数据管理能力,我们对于存储数据不仅仅要求其能存起来,还要能帮我们管理,方便以后的增删查改。文件保存数据有以下几个缺点:1、文件的安全性问题。2、文件不利于数据查询和管理。3、文件不利于海量存储数据。4、文件在程序中控制不方便。
2026-09-13 15:46:00
270
19
原创 【Linux】每个进程都拥有“假内存” | 进程地址空间详解
虚拟地址空间不只是简单的地址翻译,更是操作系统实现解耦的核心抽象。它让进程无需关心物理内存的分布,只需操作虚拟地址;内核则通过页表独立管理物理内存。二者隔离开来,既实现内存隔离与安全,也让内存调度、换页等机制得以落地,是理解现代内存管理的关键。
2026-09-13 09:54:26
216
15
原创 【Linux】进程第二课:进程优先级和环境变量
这篇文章带大家系统了解了进程优先级和环境变量的问题,重点讲解了进程优先级的相关内容,因为环境变量并不算一个特别难的内容,所以我就大致介绍一下,希望大家通过这篇文章能有所收获。
2026-09-09 20:05:39
435
10
原创 【力扣刷题】第一天:两数相加和两数之和
今天的算法题分享到此结束,对于今天这两道基础题,我也收益良多,今后我还会继续坚持刷题,并分享刷题经历,希望我们能一起进步。
2026-09-09 10:09:18
143
10
原创 【Linux】初识进程:进程的概念和状态
这节课带大家深入了解了Linux系统中进程的基本概念、父子进程概念和进程状态,还有拓展内容Linux系统的内核链表,希望通过这篇文章能让大家对Linux系统进程的了解更加深刻。
2026-09-06 14:07:06
612
20
原创 【C++】继承和多态
在语法上,继承的写法是class + 子类名称 : 继承方式 + 父类名称。class A......这样我们就实现了一个简单的继承结构,我们接下来需要了解的是不同的继承方式它们之间有什么区别。所谓继承方式,就是子类在继承父类的成员时,决定父类成员在子类中的访问权限。继承方式与访问限定符一样有三种,也是public、protected、private,之前我们在类和对象的讲解中,并没有讲解protected这个访问限定符的用法,今天我们就来一起讲解一下。
2026-08-27 16:11:28
441
16
原创 【Linux】Linux的权限
本文围绕Linux权限机制展开讲解,从基础的读写执行权限、数字权限配置,再到目录权限、缺省权限和粘滞位的讲解,细致地带大家将Linux系统的内容学完了,希望大家都能掌握,我们一起进步。
2026-08-26 14:39:31
479
23
原创 Linux第一课:Linux的基本命令和底层结构的理解
今天,我们学习了Linux系统中的各种常见指令,了解了外壳程序的定义和功能。其实本节课学习的重点并不在于这些基础的命令,因为在我们后面漫长的学习中,这些都是最基础的,重要的是我们要通过对这些基础命令的学习,了解Linux的底层结构和运行原理,这些才是我们这节课需要进行掌握的。
2026-08-23 20:54:38
2184
18
原创 C++:模板进阶知识
到此,关于模板方面的进阶知识就已经全部讲完了,总的来说,模板既有优点也有缺点,优点是:模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库因此产生,增强了代码的灵活性。缺点是:模板会导致代码膨胀问题,也会导致编译时间变长;出现模板编译错误是,错误信息非常凌乱,不易定位错误。但模板总归还是利大于弊的,是C++发展史上重要的里程碑。
2026-08-16 15:31:15
262
8
原创 C++:STL初阶和string类
模板赋予了 C++ 无与伦比的表达力与泛型能力,让"一次编写,多处复用"从口号变为现实。正是在模板的土壤之上,STL六大组件才得以生长——迭代器屏蔽底层差异,提供统一的遍历方式;string 虽是模板的"前辈",在 STL 之前就已问世,却同样受益于模板思想,用一套丰富的接口为字符串管理提供了完整方案。理解模板不仅仅是在学一个语法特性,更是在理解 C++对于抽象、复用与效率的底层哲学。
2026-07-26 00:01:42
225
6
原创 C++:一篇文章讲清楚类和对象
class为定义类的关键字,后面加上类的名称,本文将使用日期类(Date)来进行讲解,{}内为类的主体,括号后的分号;不能省略。类体中的变量称为类的属性或成员变量,类中的函数被称为行为或成员函数。定义在类里面的变量,为了与正常的变量区分开,一般会在变量名的前面加上一个下划线(),如下图所示。int _month;int _day;特别的是,在C++里面,struct也可以用于定义类,因为C++本身兼容C语言内的用法,同时struct。
2026-05-05 16:30:44
515
18
原创 C++第一课:C++基础
总的来说,学完了C++的第一部分基础内容,我最大的感触就是,C++相比于C语言确实进步了很多,解决了C语言内存在的很多问题,使用起来也会比C语言更加方便,我更加期待C++后面学习的新内容了。
2026-04-15 14:19:49
595
15
原创 函数栈帧的创建与销毁
相信很多人在初步掌握C语言后都会有些疑问,比如我们的主函数到底是怎么运行的,在内存的什么地方运行的,函数调用是如何实现的,形参和实参之间是什么关系等。今天我就来简单讲解一下函数栈帧的创建与销毁,我选择的编译器是VS2013,不同的编译器它在细节上会略有不同,但是大体逻辑都是差不多的,以下仅是我的个人理解,如有错误欢迎指正。
2026-03-05 13:54:12
376
5
原创 常见数据结构的概念和区别(学习笔记)
顺序表的本质是一个由数组构成的一整片且连续的空间,它的特点就是在物理空间上是连续的,并且支持下标访问,也可以进行随机访问。但是由于是由数组构成的结构,所以对数据的增删效率低,需要挪动后面的一堆元素并且数组的大小不支持随意改动,故而导致空间大小是固定的,空间满了就无法继续添加元素,空间未满时也会浪费不少的空间。所以顺序表一般用于需要高效存储和频繁访问元素的场景。
2026-03-03 21:28:20
239
1
原创 超详细!手把手教你如何用C语言实现简单的扫雷游戏
根据对网页版扫雷的模仿,我们从零开始对该游戏进行了预定功能的构思、设计,并将它们一一通过代码进行实现,拓展了日常不常用的函数rand、srand、time,加深了我们对二维数组,自定义函数以及递归函数的理解。总的来说,写一个扫雷游戏锻炼了我们综合使用所学知识的能力。此外,这个程序还有着比较大的进步空间,如我们可以在棋盘的头上加上我们扫雷所用的时间,对不同难度的选择等,这些都留给大家自己去拓展(绝不是因为我懒得写)。这是我扫雷游戏的源代码,有需要的可以看一看,
2025-12-23 18:19:50
516
4
原创 关于C语言中实现循环与分支结构的几种方式
三种分支语句各有各的特点,if-else语句可以进行范围和复杂条件的判断;switch-case语句可以实现高性能的多分枝判断;goto语句可以方便的跳出深层嵌套循环及进行错误处理和资源清理。以上就是C语言中的循环和分支语句,在日常编程时,我们可以根据它们各自的特点,合理的运用他们以帮助我们更好的编写程序。但是要记住:代码的可读性和可维护性永远比聪明但晦涩的技巧更重要。
2025-12-12 16:49:52
480
4
原创 C语言初学者学习后的感想
以上内容就是我这一学期学习过后的感想,总体来说我认为C语言的学习是苦中带乐,我也很享受这种通过编程解决问题的感觉,往后我也会按着自己的学习方式和学习计划去努力学习,希望我的这篇博客能带给你们一些收获。
2025-12-02 22:29:37
447
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅