自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(164)
  • 收藏
  • 关注

原创 C++ 线程 (4)

a: 如果 t2 是在 a 状况,t1 又抢到锁,但是 flag 为 true, wait 阻塞 (同时unlock解锁)b、t1 慢一步,但是也分到时间片开始执行了,t1 lock 阻塞 t2wait 时,unlock 会唤醒 t1 获取锁。b、如果 t2 是在 b 状况,t1 解锁,唤醒 t2, t2 获取到锁,flag 是 true, t2 不会阻塞。假设 t1 先运行,t1 先抢到 lock, flag 是 false, t1 先打印。场景 1: t1 先启动,t2 待定。

2025-12-20 00:07:32 214

原创 C++ 线程(2)

作用:最基础的互斥量,保证同一时间只有一个线程能获取锁。

2025-12-19 08:00:00 634

原创 C++ 线程(1)

C++ 有专门的线程库 它的好处是 我不管在windows Linux unix 还是mac上都可以跑本质上通过条件编译形成的。

2025-12-19 03:45:00 1630

原创 Linux 线程(2)

要了解并发问题我们可以通过一段代码来学习为什么这个代码最后num会到-10???(预期最多到-1)我明明写的是num<0的时候循环就不会接着执行减减呀为什么num会到-10???我们来看这个代码num--;这个代码转换成汇编主要是三件事1.先将内存中的 num 读入到 cpu 的寄存器中2.CPU 内部进行 -- 操作3.将计算结果写回内存但是多线程的时候会有问题首先我们要了解一件事我们线程使用cpu计算的时候 有一个时间片时间片到了cpu就会切换其他线程。

2025-12-18 23:26:08 963

原创 C++ 线程 (3)

作用:阻塞线程,直到被唤醒(或谓词满足)。参数:lock:std::unique_lock<std::mutex> 的引用(调用时需已持有锁);pred:可调用对象(函数 /lambda 等),返回bool(表示等待的条件)。返回值:无(void)。

2025-12-18 23:25:27 446

原创 Linux 信号 (2)

每个信号都有两个标志位分别表示阻塞(block)和未决(pending),还有一个函数指针表示处理动作(handler)。1.信号 产生时,内核在进程控制块中设置该信号的pending标志为1,直到信号递达才设为0。简单点说 信号产生pening 为1 信号到达后 pending设置为0等下一个信号产生pending 在信号发出到递达之间为1 其他时候都为0SIGHUP信号未阻塞也未产生过当它递达时执行默认处理动作。SIGINT信号产生过但正在被阻塞所以暂时不能递达。

2025-12-14 21:36:35 762

原创 Linux 线程(1)

线程是进程内的最小执行单元,一个进程可以包含多个线程,所有线程共享进程的资源(内存、文件句柄等),但有自己独立的执行栈和程序计数器。结合进程的核心区别可以这样理解:进程是资源分配的基本单位系统给进程分配内存、CPU 时间片等资源,进程像是一个 “独立的工作车间”。线程是 CPU 调度的基本单位线程是车间里的 “工人”,一个车间可以有多个工人,他们共享车间的工具和材料(进程资源),但各自干不同的活,且切换工人的开销远小于切换车间。

2025-12-14 21:36:00 1031

原创 Linux 信号(1)

比如我这个前台指令 当我休眠的时候我依然可以接收终端信号 但是不会立即执行比如 ll ls -l pwd当sleep结束玩后立马执行但是当我把sleep10& 后台执行的时候 我的终端可以接着输入其他指令而不会休眠10秒前台进程只能有一个 但是后台进程可以有多个。

2025-12-10 21:27:59 705

原创 Linux 进程通信

pipe 函数是 进程间通信(IPC) 和 数据流处理 中的核心工具,其核心思想是创建一个 “管道”,实现 单向数据流传递—— 数据从 “写端” 输入,从 “读端” 输出,类似现实中的管道(一端进水、一端出水)。不同编程环境中,pipe 的实现和用途略有差异,但核心逻辑一致。

2025-12-10 08:00:00 934

原创 Linux 日志文件

【代码】Linux 日志文件。

2025-12-05 15:18:39 120

原创 Linux 进程池代码

【代码】Linux 进程池代码。

2025-12-05 15:16:43 137

原创 Linux 命名管带代码

【代码】Linux 命名管带代码。

2025-12-04 23:08:51 103

原创 Linux 动静态库

我们可以自己做一个静态库 但是在此之前我们需要了解一些基本的指令ar 是 Linux/Unix 下用于操作「归档文件(Archive File)」 的命令行工具,最核心的用途是下图中 ar -rc libmymath.a mymath.o 的含义:创建(或修改)libmymath.a 归档文件,将 mymath.o 添加 / 替换到其中。其他常用选项-s(create index):生成归档的符号索引。

2025-12-04 23:03:24 1431

原创 Linux文件系统

但是这是磁盘的物理结构(硬件)那么逻辑结构呢???逻辑结构是通过数组实现的任意一个扇区都有下标每个盘面2w个扇区每个盘面有 50 个磁道每个磁道 400 个扇区那么我们就可以开一个2w空间的数组每400个空间为一个磁道每50个磁道为一个盘面这样我们磁盘的物理结构和逻辑结构实现了映射那么磁盘的空间这么大是怎么管理的呢我们假设这个磁盘有200个g那么怎么管理答案是分治200个g我们可以分别分成50个4个g去管理如果4个g也觉得太大难管理怎么办???

2025-11-21 09:33:40 940

原创 Linux 文件重定向

文件描述符对应的分配规则是什么?从0下标开始,寻找最小的没有没使用的数组位置,它的下标就是新文件的文件描述符比如这个地方我们把原本默认开启下标1 stdout关闭掉因此再创建文件log.txt是从1的位置开始创建因此这个时候write1不再是向stdout写入而是向log.txt这个文件写入当然这种做法太麻烦我还要先关闭于是便有了一个函数也就是dup2。

2025-11-14 15:23:00 368

原创 Linux 文件缓冲区

我们要理解文件缓冲区 我们先来看一段代码。

2025-11-14 15:22:28 1206

原创 Linux 简易shell实现

因此我们不能 putenv(arv[1]);而要用putenv(myenv);我们要注意 我们putenv本质上是把要putenv字符串的地址传过去了。因为你下次输入指令的时候argv的值会变。但是环境变量存的指针还是指向argv。

2025-11-10 20:19:35 230

原创 Linux 文件

我们以一个操作系统的文件函数为例 其它是差不多的open函数const char *pathname(必选)作用:指定要打开 / 创建的文件路径(绝对路径或相对路径)。关键说明: 支持绝对路径(如 /home/user/test.txt)和相对路径(如 test.txt、data/log.csv);若路径是符号链接,默认会跟随链接指向的真实文件(可通过 O_NOFOLLOW 标志禁用此行为);路径长度不能超过系统限制(Linux 中默认最大路径长度为 PATH_MAX,通常是 4096 字节)

2025-11-10 20:19:03 1204

原创 Linux 进程的替换

它是指一个正在运行的进程,用新程序的代码段、数据段、堆栈段等替换自身原有内容,但进程 ID(PID)、打开的文件描述符、进程优先级等核心属性保持不变的操作。简单来说,进程替换不是 “创建新进程”,而是 “给现有进程换一套‘执行内容’”—— 就像同一个人(PID 不变)换了一套完全不同的工作任务(程序代码),但身份信息、持有的工具(打开的文件)不变。

2025-10-29 21:28:33 984

原创 Linux 进程退出和进程控制

进程退出大致可以分为三种情况代码运行完毕,结果正确代码运行完毕,结果不正确代码异常终止像我们日常c语言的return 0就属于代码运行完毕 结果正确如果返回的是其他值 那么可能就是代码运行完毕,结果不正确exit _exit 和 return的区别return 在函数内 return后程序继续进行但是exit和_exit在程序结束后就停止进行了exit():是标准库函数(属于 C 标准库),声明在 <stdlib.h> 中。

2025-10-29 21:28:13 993

原创 Linux 进程地址空间

页表会对不同的区域有其权限字段 比如说字符常量区 页表描述权限的字段就没有写的访问权限。这也是为什么上面那个代码运行出来两个id的值不同但是地址相同。当这个进程再跑的时候 这个进程的页表地址覆盖掉cr3的地址。这个属于进程的硬件上下文 进程结束其数据会打包带走的。那么进程如果这个进程重新排队后怎么找到页表呢?我们思考之前没有解答的一个问题的一个问题。有一个cr3的寄存器 存放着页表的地址。包括我们之前看到的很经典的一张图也是。就是为什么id可以是两个值?那么这个地方是什么地址?有什么好处 或者说为什么呢。

2025-10-14 23:13:17 786

原创 Linux 进程概念

基本概念课本概念:程序的一个执行实例,正在执行的程序等内核观点:担当分配系统资源(CPU时间,内存)的实体描述进程-PCB进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB),Linux操作系统下的PCB是的一种在Linux中描述进程的结构体叫做。是Linux内核的一种数据结构,它会被装载到RAM(内存里并且包含着进程的信息内容分类标示符描述本进程的唯一标示符,用来区别其他进程。状态任务状态,退出代码,退出信号等。

2025-10-12 20:01:47 940

原创 Linux 进程状态

Linux进程的主要态度分为。

2025-10-10 08:17:10 997

原创 Linux gdb

gdb(GNU Debugger)是一款命令行调试工具,主要用于定位和修复程序中的错误。它支持设置断点、单步执行代码、查看变量值、检查内存状态等功能,能帮助开发者追踪程序执行流程,找到崩溃、逻辑错误等问题,广泛适用于 C、C++ 等语言的程序调试。

2025-10-10 08:16:34 678

原创 MySql 事务(2)

在该隔离级别,所有的事务都可以看到其他事务没有提交的执行结果。(实际生产中不可能使用这种隔离级别的),但是相当于没有任何隔离性,也会有很多并发问题,如脏读,幻读,不可重复读等,我们上面为了做实验方便,用的就是这个隔离性。:该隔离级别是大多数数据库的默认的隔离级别(不是MySQL默认的)。它满足了隔离的简单定义一个事务只能看到其他的已经提交的事务所做的改变。这种隔离级别会引起不可重复读,即一个事务执行时,如果多次select, 可能得到不同的结果。: 这是MySQL。

2025-10-09 07:49:17 737

原创 MySql 索引(2)

InnoDB 采用聚簇索引(Clustered Index) 作为核心存储结构,所有数据最终都存储在聚簇索引的叶子节点中。其他索引(如单列索引、联合索引)均为非聚簇索引(Secondary Index,二级索引),其叶子节点仅存储 “索引键值” 和 “聚簇索引的主键值”(而非整行数据)。这就导致了常规查询的 “痛点”——回表(Table Lookup): 当查询使用非聚簇索引时,数据库先通过非聚簇索引找到对应的 “主键值”;再用 “主键值” 去聚簇索引中查找完整的行数据(即 “回表”);

2025-10-09 07:48:34 753

原创 MySql 用户管理

于是我们可以通过myself用户查看ly_centos数据库下的EMP这个表了。这个时候我们就发现myself这个账号就无法访问ly_centos这个数据库了。但是如果要查看所有内容,我们需要赋予一些权限(这个后面会有介绍)代表本系统中的所有数据库的所有对象(表,视图,存储过程等)注意:如果发现赋权限后,没有生效,执行如下指令。如果用户存在,赋予权限的同时修改密码。表示这个用户可以从哪个主机登陆,如果是。如果该用户不存在,就是创建用户。中的用户,都存储在系统数据库。创建的用户我们是可以登录的。

2025-10-08 12:30:45 342

原创 MySql 事务(1)

MySQL事务深度解析:从ACID原理到实战应用。文章系统讲解了MySQL事务的ACID特性(原子性、一致性、隔离性、持久性)及其实现机制,重点分析了InnoDB引擎如何通过undolog和redolog保证数据可靠性。通过电商下单案例,展示了事务在实际业务中的应用场景,并演示了手动控制事务的多种方式(begin/commit/rollback/savepoint)。文章还对比了不同隔离级别解决的问题(脏读/不可重复读/幻读),特别指出InnoDB在可重复读级别下通过Next-Key Lock解决幻读的特性

2025-10-08 12:30:07 625

原创 MySql 视图

视图是一个,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视。

2025-10-07 12:55:30 168

原创 C++ 二分算法(3)

而原长度 len = right - left + 1,显然 right - mid < right - left + 1(因为 right - mid ≤ right - left)。因此: new_len = right - mid ≤ right - left(因为 mid ≥ left → right - mid ≤ right - left)。由于 mid < right(原 right),新长度 mid - left + 1 < right - left + 1(原长度),

2025-10-07 12:52:22 1812

原创 C++ 二分算法(2)

left>right此时 [left,right]这个区间就不存在 所有所有的区间都被遍历了。C++ 二分算法(1)和(2)的两个方法的区别无非就是一个是开区间 一个是闭区间。但是如果是闭区间(left,right) 当left和right什么关系的时候。停止条件 :left>right 区间:[left,right]且left和right的范围始终是target可能的取值范围。且left和right的范围始终是target可能的取值范围。当left 和 right 有一端是mid的情况就可能发生。

2025-10-06 12:56:36 901

原创 C++ 二分算法(1)

mid重新计算即可此时 我们判断。

2025-10-06 12:55:43 1181

原创 MySql 内外连接

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。语法:备注:前面学习的都是内连接。

2025-09-10 23:24:01 272

原创 MySql索引(1)

MySQL 索引:让数据查询快起来的「快捷方式」大家平时用 MySQL 查数据时,有没有遇到过这种情况:一张表存了几十万条用户数据,想查某个用户的信息,结果等了好几秒才出来?但有时候同样的表,查数据又快得像 “闪电”—— 这背后的关键,很可能就是 “索引” 在起作用。今天就用大白话跟大家聊聊:MySQL 索引到底是啥?它为啥能让查询变快?咱们该怎么用它?

2025-09-10 23:23:18 1083

原创 MySql 复合查询

与 SELECT 结合:表示返回所有符合条件的记录,默认情况下 SELECT 即隐含 ALL 行为(与 SELECT DISTINCT 相对,DISTINCT 会去除重复记录,而 ALL 会保留所有记录,包括重复项)。它只能与单个值进行比较 ,当等号右边是子查询时,子查询必须只返回一行数据,否则会报错。IN:用于判断某个值是否在一个指定的列表或者子查询结果集中,列表或子查询结果可以包含多个值。号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含。的所有员工的工资高的员工的姓名、工资和部门号。

2025-08-24 23:13:45 114

原创 Linux 开发工具 (2)

我们看这些代码可以知道1.make指令正常只能执行一次2.make指令在执行一次之后 改变过依赖文件 可以再执行一遍3.make指令会根据逻辑关系 自行推测执行顺序4.make指令如果不指定确定的 默认是makefile文件的第一个指令make指令一般情况下只能执行一次因为没必要执行两次 两次执行的结果是一样的但是如果执行第一遍之后 依赖文件内容改变了 第二次执行结果不一样 所以此时make指令就可以执行第二次如果我们希望一个指令不管有没有文件更新都可以再次执行就可以加一个.PHONY。

2025-08-21 17:33:47 432

原创 MySql 特殊函数

查看‘2025-8-21’和‘2025-9-4’中间隔了多少天。把‘2021-2-3 12:23:34’这个时刻截断成日期。查看‘2021-2-3 12:23:34’时刻两天后的时间。查看‘2021-2-3 12:23:34’时刻两天前的时间。但是在一些环境下我们希望我们的密码是不能直接显示出来的。我们发现我们插入的代码是可以显示出来的。对12.34和-12.34向上取整。对12.34和-12.34向下取整。当我们查找的时候也不能直接查找。生成一个0到1的的随机浮点数。查看-123的绝对值。

2025-08-21 17:33:19 300

原创 MySql 表的约束

使用 LAST_INSERT_ID() 函数 LAST_INSERT_ID() 函数返回最近生成的自增值,不过它返回的是当前会话中最后插入操作生成的自增值,而不是表的下一个自增值。当为表中的某个列设置了自增长属性后,无需手动为该列赋值,MySQL 会自动为每一条新插入的记录分配一个比上一条记录该列值大 1 的数值。唯一键是 MySQL 中的一种约束机制,用于确保表中指定列(或列组合)的值具有唯一性,即同一列中不会出现重复的值。我们发现当我们一个字段不插入值的时候 其插入的是这个字段的default的值。

2025-08-19 17:07:56 691

原创 MySql基本查询

如果比较的双方都是 NULL,NULL <=> NULL 的结果为 TRUE(1)。如果一方是 NULL,另一方是具体的值,NULL <=> 具体值 的结果为 FALSE(0)当SELECT中只有聚合函数且无GROUP BY时,HAVING可以单独使用(此时默认整个表为一个分组)。_(下划线):是 MySQL 中的单字符通配符,它表示匹配任意一个字符。WHERE在GROUP BY之前执行,先筛选行再分组,是常见用法。我们发现order by后面是可以加取的别名的和where不一样的。

2025-08-19 17:07:05 1164

原创 MySql 表的操作

MySQL 的存储引擎是决定表如何存储和处理数据的底层技术实现,相当于表的 "数据处理器"。我们可以成功看到我们把原本的students2这个表的名字改成了students3了。当然这个地方我们不显示写字符集 排序规则 存储引擎 也会生成环境下默认的。不同存储引擎创建出来的表在linux下的文件个数和数量都不一样。比如这个地方我们就可以查看原先创建的students2这个表。添加新的字段 原先数据的该字段部分为NULL。我们来看看我们插入的结果。我们再来看看下面这些插入。我们来看修改完成后的结果。

2025-08-09 21:38:36 466

算法领域蓄水池抽样算法解析:数据流随机采样方法及其概率计算详解

内容概要:蓄水池抽样算法是一种用于从大量数据流中随机抽取固定数量样本的有效算法。该算法的核心思想是:当遇到第i个元素时,以一定的概率决定是否用该元素替换当前样本集中的某个元素。具体来说,在遍历数据流的过程中,前 samp 个元素直接进入样本集,之后对于每个新元素,以 samp/i 的概率替换样本集中已有元素。随着 i 的增加,元素被保留的概率逐渐减小,但所有元素最终出现在样本集中的概率相等。; 适合人群:对算法设计与分析有一定了解,尤其是对概率算法感兴趣的计算机科学专业学生或工程师。; 使用场景及目标:①需要从海量数据中随机抽取固定数量样本的场景;②确保每个元素被选中的概率相同,以保证样本的代表性和随机性;③适用于数据流处理、大数据分析等领域。; 阅读建议:由于蓄水池抽样算法涉及概率计算和动态更新样本集,建议读者在理解基本概念的基础上,结合实例进行模拟练习,加深对算法机制的理解。同时,可以研究不同变种的蓄水池抽样算法,以应对更复杂的实际问题。

2025-05-29

.菱形继承(虚继承)可视化

.菱形继承(虚继承)可视化

2025-05-29

【数据结构与算法】红黑树变色与旋转

内容概要:本文档简要介绍了红黑树(RB_Tree)中叔节点(uncle)的不同情况及其对树结构操作的影响。红黑树是一种自平衡二叉查找树,它通过特定的着色规则(节点颜色为红色或黑色)来确保树的高度接近对数级别,从而保证插入、删除和查找操作的时间复杂度。文档指出当叔节点为红色时,它会影响树的重新着色和旋转策略;当叔节点为黑色并且是空值(NULL),这里的NULL仅用于验证节点是否属于红黑树,而不实际参与到旋转操作中;当叔节点为黑色且不是空值时,则需要根据具体情况进行不同的调整操作以维持红黑树性质。; 适合人群:计算机科学专业学生、数据结构与算法爱好者以及从事软件开发并对高效数据存储结构有兴趣的人士。; 使用场景及目标:①理解红黑树中不同情况下叔节点的角色和作用;②掌握红黑树维护平衡性的基本方法,如着色和旋转规则;③能够正确处理NULL节点在红黑树算法实现中的特殊意义。; 阅读建议:在学习过程中应结合具体的例子进行理解,可以尝试手动模拟红黑树的插入、删除操作,注意观察不同情况下叔节点的变化及其对整个树结构的影响。同时,对于NULL节点的理解不要局限于一般意义上的空指针,而要认识到它在红黑树算法中的独特含义。

2025-05-29

.AVLTree可视化

.AVLTree可视化

2025-05-29

.单继承和多继承可视化

.单继承和多继承可视化

2025-05-29

.菱形继承(非虚继承)

.菱形继承(非虚继承)

2025-05-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除