- 博客(52)
- 收藏
- 关注
原创 Linux系统篇(八):Linux进程虚拟地址空间的深层结构
究竟什么是进程地址空间?我有一个大富翁例子:一个身价 10 个亿的大富翁,他有 4 个私生子。这 4 个私生子彼此之间互不相识,都以为自己是独生子。富翁对每个私生子都画了一个大饼:“儿子,我这 10 个亿的资产未来全是你的!” 于是,每个私生子都认为自己拥有 10 个亿。当私生子 A 想向富翁要 50 万买车时,富翁随手就给了他;私生子 B 想要 100 万创业,富翁也满足了。
2026-11-06 11:17:25
202
原创 Linux系统篇(五),深入理解Linux进程优先级
竞争:系统进程数目众多,而CPU资源只有少量,甚至只有一个,所以进程之间是具有竞争属性的,为了高效完成热播我要,更合理竞争相关资源,就有了优先级独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰并行:多个进程在多个CPU下分别同时进行运行,这个称之为并行并发:多个进程在一个CPU下采用切换的方式,在一段时间内,多个进程都能得以推进,称之为并发。
2026-10-30 11:28:45
213
原创 Linux系统篇(六),深入理解进程切换与O(1)调度算法
当一个进程在分时操作系统中运行,暂停,再恢复时,操作系统必须确保它能无缝衔接,这就需要引入进程上下文概念,从逻辑层面来看,它描述的是一个进程执行时所需的整个环境、
2026-10-27 15:53:34
309
原创 Linux系统篇(四),僵尸与孤儿进程
你正走在路上,一个人突然从你身边跑过,突然!摔地上猝死了。——此时他虽已失去生命体征,但由于死因不明,遗体和随身物品(对应子进程的 task_struct、退出码和信号)必须原封不动地保留在原地,任何人不得擅自收尸,这个在原地等待验尸的阶段就是“僵尸状态”;直到你报警后警察赶到,在现场拍照、翻看口袋、登记完死亡信息并查明死因(对应父进程调用 waitpid 获取退出信息),这才挥手让救护车把遗体拉走火化,此时死者在世间留下的最后痕迹被彻底抹去,这才真正进入了“死亡状态(X状态)”。
2026-10-21 08:48:16
170
原创 Linux系统篇(三),Linux进程状态变化与内核链表动态解绑
我们的计算机,摄像头,麦克风,鼠标键盘,显示器以及磁盘网卡,一系列的硬件,他们都是操作系统通过硬件驱动调用的然而硬件驱动不是直接访问硬件本身,实际上其内部也经历了先描述再组织的过程,操作系统将他们的数据封装成一个结构体,然后将他们组织在一起于是就形成了设备树设备树上的每一个节点都有一个等待队列,进程在等待队列中的时候,就是阻塞状态。
2026-10-19 14:16:39
52
原创 Linux系统篇:进程篇二:【进程概念与进程父子关系】
课本概念:系统的一个执行实例,正在执行的程序内核观点:担当分配系统资源(CPU时间,内存)的实体进程 = 内核数据结构(task_struct)+自己的程序代码和数据程序在没有被运行起来的时候都是一个个在磁盘上面的文件,运行起来后就要被加载进内存此时,操作系统必然要对多个被加载到内存中的程序进行管理先描述,操作系统描述进程的各种数据,创建了一个PCB,PCB是什么在Linux操作系统中,用于描述进程的结构体叫做struct task_struct(PCB和task_struct是抽象和具体的关系),它包含了
2026-10-14 10:35:22
139
原创 解析Linux从umask位运算到粘滞位
权限标志位:在目录权限的最后一位(others的执行位)显示为t(如果原本与x权限)或T(如果原本没有x权限)核心功能:当一个目录被设置了粘滞位后,该目录只能由以下三类人删除:1.超级管理员root2.该目录的拥有者3.该文件的拥有者。
2026-09-17 10:27:17
185
原创 Linux相关权限上
Linux严格意义上说是一个操作系统,我们称之为“核心(kernel)”,但是我们一般用户,不能直接使用kernek,而是通过kernel的“外壳”程序,也就是shell,来与kernel沟通,如何理解?为什么不能直接使用kernel?从技术角度,shell最简单的定义就是命令行解释器,主要功能包含:将使用者的命令翻译给核心处理同时将核心的处理结果翻译给使用者。
2026-09-13 09:40:21
148
原创 Linux基础指令下
Linux的命令有很多参数,我们不可能全记住,可以通过查看联机手册获取帮助功能:man是Manual pages(帮助手册)的简称。它用于查看Linux系统中指令,函数,配置文件或者库调用的详细说明文档语法:man [指令名称]常用选项-k根据关键字搜索联机帮助-a将所有章节的都显示出口,比如 man printf它缺省从第一章开始搜索,用a选项,当按下q退出,他会继续往后搜索,直到所有章节搜索完毕科普内容man手册分为9章(不同系统可能会有差别)1. 是普通的命令,最常用 的手册。
2026-09-07 15:22:39
144
原创 Linux基础指令上
首先,目录就是文件夹。文件夹有文件名和文件属性。文件属性有文件的名称,文件的各种时间(如修改时间,创建时间)。我们学习文件是学习堆文件内容的操作和对文件属性的操作。total 8其中 -开头就是普通文件,d开头就是目录,除此之外,文件名以.和..开头的就是隐藏文件,需要ls-a才能显示出来,任何目录下都会有这两个文件(即使目录是空的),具体作用后续讲解如果我们想要查找一个文件的详细状态信息,可以使用stat指令+文件名解决Birth: --bash-4.2#科普内容这里的三个时间都是什么意思?
2026-09-01 09:51:13
263
原创 C++进阶数据结构之红黑树
2.如果是空树插入,新增结点是黑色结点,如果是非空树插入,新增结点必定是红色结点,因为非空树插入,新增黑色结点就破坏了规则4,规则4难以维护。3.如果一个结点是红色的,则它的两个孩子结点必定是黑色的,也就是说,任意一条路径不会有连续的红色结点。4.非空树插入后,新增结点必须是红色结点,如果父亲结点是红色的,违反规则3,处理办法由下图分析。3.非空树插入后,新增结点必须是红色结点,如果父亲结点是黑色的,则没有违法任何规则,插入结束。,p为红,g为黑,u存在且为红,则将g变为红,p和u都变为黑色,
2026-06-01 15:02:12
265
原创 C++进阶之AVL树
此时最好的办法就是先在5这个左节点先进行单旋,让其变成纯粹的一边高,然后在进行正常的单旋。左右双旋就是不是纯粹的一边高,这个时候如果进行纯粹的单旋转就会出现下图的情况,原理同上,但是编写时要注意平衡因子的更新和parent节点的更新。2.让旋转的树从不平衡变平衡,会降低这棵树的高度。1.保持搜索树的原则。
2026-05-28 15:15:08
50
原创 C++进阶篇之多态
多态是一个继承关系的下的类对象,去调用同一函数,产生了不同的行为。比如student继承了Person,Person对象买票全价,Student对象优惠买票。
2026-05-18 14:42:57
296
原创 C++进阶部分之继承
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这一产生新的类,称为子类。继承呈现了面向对象程序设计的结构以下面这两个类举例我们很容易注意到,这两个类有重复部分,这时我们就可以把公共的信息提取出来,放到person类里面,就不需要去重复定义了下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。
2026-05-17 08:52:39
333
原创 模板进阶(C++初阶结束)
一个程序由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式因为编译器原因,到第四步时,如果被链接的函数没有进行实例化最后就会编译错误所以需要显示实例化除了这个办法外还可以直接在.h文件里面定义4.总结模板的优点:1.模板复用了代码,节省资源,更快的迭代开发,C++(STL)标准库因此而产生2.增强了代码的灵活性模板的缺点:1.模板会导致代码膨胀的问题,也会导致编译时间变长。
2026-05-12 08:45:49
185
原创 C++算法之滑动窗口算法1
2.进入窗口 :如果是1,无视 如果是0,计数器+1。3.判断 : zero > k。转化:找出最长子数组,0的个数不超过k个。出窗口以及更新结果问题。
2026-05-07 16:18:15
353
原创 C++算法之双指针算法
根据cur遇到的值来选择dest的移动步数,当dest到数组末尾时,cur所在位置就是最后一个复写的数。2.在a后面的区间内,利用“三数之和”找到三个数,使这三个数的和等于target - a即可。首先先进行排序,然后从左到0依次固定数,然后再右边区间内进行双指针算法找到固定数的相反数。1.去重:当找到一种结果后两个指针都要跳过重复元素,使用完一次双指针后,固定的数也要去重。2.在b后面区间内,利用“双指针”找到两个数,使这两个数的和等于target-a-b。1.在前面的基础上,依次固定一个数b;
2026-04-23 16:09:57
505
原创 C++内存管理
如果申请的是内置类型空间,new和malloc,delete和free基本类似,不同点在于:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请失败时会抛异常,malloc会返回NULL。6.申请自定义对象时,malloc/free只会开辟空间,不会调用析构和构造函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间钱会调用析构函数完成空间中资源的清理和释放。2.在申请空间上执行构造函数,完成对象的构造。
2026-03-31 10:42:12
191
原创 类和对象(下)
内部类本质也是一种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使用,那么可以考虑把 A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地方都用不了。如果在类里面定义了const变量,那么就必须在类里面进行初始化,const类型必须在定义的地方进行初始化,引用类型同理,如果在类里面定义了,就必须在类里面进行初始化,不能在类外进行初始化。友元类的关系是单向的,不具备交换性,如果A类是B类的友元,但是B类不是A类的友元。
2026-03-29 15:47:06
321
原创 类和对象(中)
析构函数名是在类名前面加上~无参数无返回值一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数对象生命周期结束时,系统会自动调用析构函数根构造函数类似,我们不写编译器自动生成的析构函数对内置类型成员(如整形,浮点型一类的)不做处理,自定类型成员(如栈)会调用他的析构函数还有一点,如果你写了析构函数,其实也会自动调用编译器自动生成的析构函数。
2026-03-22 10:59:04
363
原创 零零碎碎的知识点
如果结构体包含(如),则malloc时需要显式计算额外空间(如),否则此数组成员的空间不被分配。成员空间是物理包含,但:分配的空间内容未定义,需手动初始化(但这不涉及额外开拓空间)。:如果结构体成员是另一个结构体指针(如),则需为指针及其指向的结构体分配空间——这属于递归分配问题,但不改变原则:指针成员本身在内存在分配中,但内容需要额外管理。2.
2026-03-17 15:26:31
349
原创 类和对象(上)
class为定义类的关键字,stack为类的名字,{}中为类的主体,注意类定义结束时后面的分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数C++中的struct也可以定义类,C++兼容C中的struct用法,同时struct升级成了类,明显的变化是struct中可以定义函数,一般情况下我们推荐class定义类定义在类里面的成员函数默认为inline。
2026-03-16 14:55:13
380
原创 C++基础
1.定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。2.namespace本质是定义出一个域,这个域和全局各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。3.C++中域有函数的局部域,全局域,命名空间域,类域;域影响的是编译时语法查找的一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。
2026-03-12 10:41:03
365
原创 二叉树和堆
注意:建堆的AdjustUp是一个循环操作,会向上调整到没有父节点为止,所以此时堆顶的数据一定是最小的数据,但是兄弟节点之间没有排序,所以这个排序没有完成,此时取出堆顶的数据,也就是最小的数,然后将堆尾的数挪到堆顶,在进行AdjustDown,之后堆顶就是挪出后的最小值,之后重复操作达到排序的效果。除根节点外,其余节点被分为M个互不相交的集合,其中每一个集合又是一颗结构与树类似的子树,每棵子树的根节点有且只有一个前驱,可以有0个或多个后继。有一个特殊的节点,称为根节点,根节点没有前驱节点。
2026-01-29 09:10:30
571
原创 栈和队列初解
队列:只允许在一段进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头。栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除的一端称为栈顶,另一端称为栈底,栈中的数据元素遵循后进先出的原则。压栈:栈的插入操作叫做进展/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。
2026-01-23 11:05:13
181
原创 算法的时间复杂度和空间复杂度和链表
衡量一个算法的好坏,一般从时间和空间两个维度衡量,时间复杂度主要衡量一个算法运行的快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。常见空间复杂度,O(1)(几个变量),O(N)(开了一个数字),O(N^2)(开了一个二维数组)在此处,因为每次调用的时候,都还要进行循环,所以时间复杂度是N到1的求和,最终结果为N^2。而且,因为时间复杂度过于大的原因,实际情况下,斐波那契数列和类似时间复杂度的算法的意义不大。这个图不是特别准确,最后画出来的图片应该是一个类似这样的图形,但是这不影响它的量级。
2026-01-19 19:33:03
407
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅