- 博客(46)
- 收藏
- 关注
原创 【MySQL】事务与锁
死锁是指两个或多个事务互相持有对方需要的锁,导致事务无法继续执行的状态。事务A持有记录1的S锁,等待记录2的X锁;事务B持有记录2的S锁,等待记录1的X锁;两者互相等待,形成死锁。互斥访问:锁只能被一个事务持有;不可抢占:锁只能由持有事务主动释放;保持与请求:事务持有一个锁后,再请求其他锁;循环等待:事务之间形成锁的循环依赖。原子性依赖UndoLog,持久性依赖RedoLog,隔离性依赖锁+MVCC;锁按粒度分为表级锁/行级锁,按模式分为S/X锁、意向锁、间隙锁等;
2025-11-29 22:25:25
839
原创 【MySQL】InnoDB存储引擎
InnoDB架构:内存(缓冲池为核心)+ 磁盘(表空间+日志)协同工作;存储结构:表空间→段→区→页→行,层层递进优化存储效率;核心保障:Undo Log(原子性)、Redo Log(持久性)、双写缓冲区(数据完整性);性能关键:缓冲池(缓存)、变更缓冲区(二级索引优化)、自适应哈希索引(内存查询加速)。
2025-11-29 21:56:33
1081
原创 【MySQL】SQL调优
SQL调优的核心是“索引优化+查询改写”:通过合理设计索引减少扫描行数,通过改写SQL避免索引失效和低效操作。执行计划看type(至少range)和Extra(无filesorttemporary索引优先覆盖索引,避免回表查询。规避10个索引失效场景,遵循最左原则。高频查询列建索引,低频列不建索引,定期清理无用索引。
2025-11-28 22:23:54
929
原创 【Linux】网络编程
网络基础的核心是“协议分层”和“地址标识”——分层解决了复杂通信的解耦合问题,IP+端口+Socket解决了“如何找到目标进程”的问题。掌握这些概念后,网络编程就有了清晰的逻辑框架。
2025-11-23 22:12:14
1186
原创 【Linux进阶】mmap实战:文件映射、进程通信与LRU缓存
mmap通过内核将文件/设备的部分或全部内容映射到进程虚拟地址空间,进程直接操作这段内存即可完成对文件的读写。减少数据拷贝:跳过内核缓冲区与用户缓冲区的拷贝过程。统一接口:用内存操作(指针读写)替代文件I/O调用。支持共享:可通过共享映射实现进程间数据共享。mmap作为Linux系统的核心技术,其应用场景覆盖文件I/O、进程通信、内存管理、缓存设计等多个领域。基础用法:文件映射读写,替代传统read/write,提升I/O效率。进程通信:结合共享内存和同步机制,实现高效的IPC通信。高级应用。
2025-11-22 22:05:18
1666
原创 【Linux编程】线程同步与互斥
/ 任务类型:支持任意可调用对象线程安全:多个线程并发访问时,程序执行结果一致,无数据竞争。可重入:同一函数被多个执行流(线程或信号)重复调用时,结果正确。本文从线程互斥、同步的基础概念出发,逐步深入到生产者消费者模型、线程池设计等实战场景,覆盖了Linux线程编程的核心知识点。互斥用mutex,解决资源竞争;同步用条件变量/信号量,解决执行顺序。生产者消费者模型是同步与互斥的经典应用,解耦线程间交互。线程池通过复用线程提高效率,适合高并发短任务场景。
2025-11-22 22:00:33
818
原创 【Linux】线程
线程共享进程地址空间,拥有独立的上下文,创建和切换开销小。线程控制依赖POSIX线程库,核心API包括等。线程的内核实现本质是轻量级进程,通过clone系统调用创建,共享mm_struct。线程安全是多线程编程的核心问题,需通过同步机制(互斥锁、条件变量)避免竞态条件。实战中可封装线程类,简化线程的创建、启动和管理。
2025-11-21 21:42:36
1343
原创 【Linux】进程信号
信号产生:支持终端按键、命令、函数、软件条件、硬件异常5种方式。信号状态:未决(Pending)、阻塞(Block)、递达(Delivery),阻塞会阻止信号递达。信号处理:默认、忽略、自定义捕捉(推荐sigaction函数)。关键注意:避免在信号处理函数中调用不可重入函数,共享变量需加volatile。实战场景:清理僵尸进程(SIGCHLD)、定时器(SIGALRM)、异常处理(SIGSEGV。
2025-11-21 21:36:08
1303
原创 【Linux】进程间通信
管道(匿名/命名):简单易用,适合流式数据传输,无需复杂配置。共享内存:速度最快,适合大数据量通信,需配合同步机制使用。消息队列:支持按类型通信,适合小数据量、需异步通信的场景。信号量:不传递数据,专门用于同步互斥,保护临界资源。实战开发中,管道常用于父子进程通信,共享内存+信号量常用于高并发大数据量场景,命名管道用于非亲缘进程通信。
2025-11-18 22:34:51
924
原创 【Linux】动静态库
gcc main.c -I./stdc/include -L./stdc/lib -lmystdio # -I:指定头文件搜索路径 # -L:指定库文件搜索路径静态库适合独立部署场景,动态库适合多程序共享和频繁更新的场景ELF文件是Linux程序的基础,节头表和程序头表是理解其结构的核心静态链接是编译时重定位,动态链接是运行时延迟绑定,依赖GOT/PLT优化库的查找路径和链接语法是实战中最常遇到的问题,需熟练掌握解决方法。
2025-11-18 22:29:31
988
原创 【Linux】Ext系列文件系统
本文从磁盘物理结构入手,逐步深入Ext系列文件系统的核心机制,涵盖寻址方式、块组结构、inode映射、分区挂载及软硬链接实战,揭示了Linux文件存储的底层逻辑。
2025-11-17 22:31:52
798
原创 【Linux】基础IO
open函数的返回值就是文件描述符,本质是一个非负整数(小整数),是进程与打开文件之间的关联索引。缓冲区是内存中预留的一块存储空间,用于缓存输入/输出数据,减少系统调用次数和外设访问频率。本文从文件本质出发,逐步深入Linux基础IO的核心机制,涵盖C库IO、系统调用IO、文件描述符、重定向及缓冲区原理,最终通过增强版微型Shell将知识点落地。
2025-11-17 22:23:44
952
原创 【Linux】进程控制
内建命令与外部命令的区别:内建命令由Shell进程直接执行,外部命令通过子进程执行。环境变量的继承性:子进程会继承父进程的环境变量,Shell的环境变量修改会影响其创建的子进程。命令行解析的核心:将用户输入的字符串拆分为命令名和参数数组,为exec函数做准备。本文从进程创建、终止、等待、程序替换四个核心操作入手,结合实战代码解答了初学者的常见疑问,最终通过微型Shell的实现,将所有知识点串联起来。掌握这些内容后,你已具备Linux进程控制的核心能力。
2025-11-15 22:27:27
1193
原创 【Linux】进程概念
本文从冯诺依曼体系结构出发,逐步深入Linux进程的核心机制,涵盖进程创建、状态管理、优先级调度、环境变量及虚拟地址空间等关键知识点,并结合实战代码帮助理解。掌握这些内容是Linux编程进阶的基础,也是深入理解内核工作原理的关键。
2025-11-15 22:20:09
744
原创 【C++进阶】异常
C++异常处理提供了强大的错误处理机制:- **优势**:清晰的错误信息、简化的错误传播、构造函数错误处理- **挑战**:性能开销、代码复杂度、资源管理- **推荐用法**:使用RAII、自定义异常体系、明确的异常规范
2025-11-14 23:03:49
329
原创 【C++进阶】C++11
C++11是C++语言的重大更新,距离上一个标准C++03已有8年之久。这个标准带来了约140个新特性,修复了约600个缺陷,使得C++变得更现代化、更安全、更高效。
2025-11-13 22:34:31
285
原创 【C++进阶】哈希
在C++98中,STL提供了基于红黑树的关联式容器(map、set等),查询效率为O(log₂N)。但当数据量非常大时,这种对数级别的时间复杂度仍然不够理想。C++11引入了unordered系列容器,通过哈希表实现,平均情况下查询效率达到O(1)。
2025-11-13 22:31:54
946
原创 【C++进阶】map和set
在C++ STL中,容器分为两大类:序列式容器:vector、list、deque、forward_list等,底层为线性序列结构,存储元素本身关联式容器:map、set、multimap、multiset等,存储键值对,数据检索效率更高
2025-11-12 22:13:50
1012
原创 【C++进阶】C++中的多态
多态(Polymorphism)是面向对象编程的三大特性之一(另外两个是封装和继承)。通俗来说,多态就是多种形态,具体来说就是完成某个行为时,不同的对象去完成会产生不同的状态。
2025-11-11 22:29:05
811
原创 【C++进阶】C++中的继承
继承是面向对象程序设计中最核心的机制之一,它允许我们在**保持原有类特性的基础上进行扩展**,增加新的功能,从而产生新的类(派生类)。
2025-11-11 22:25:17
1059
原创 wsl2使用systemctl命令方法
wsl2使用systemctl命令方法。每次进入wsl2时出现wsl: Unknown key等的提示信息。
2025-07-02 09:09:56
692
原创 将Windows11下的Ubuntu应用移动到其他盘
在cmd(命令提示符)中输入:进入系统设置->点击“应用”->点击“安装的应用”->找到“Ubuntu”->点击“更多选项”->点击“修改”->点击“移动”
2025-05-27 22:03:11
259
原创 算法040(必备)——N皇后问题
研究的是如何将n个皇后放置在n × n的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数n,返回不同的解决方案的数量。
2024-08-16 20:34:21
499
原创 算法038(必备)——常见经典递归过程解析
将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现了栈中元素的逆序,请设计一个算法实现逆序栈的操作,但是只能用递归函数来实现,而不能用另外的数据结构。3.字符串里面可能有重复字符,但是返回的子序列不能有重复的子序列,比如"aab"的子序列只有"","a","aa","aab","ab","b",不能存在2个相同的"ab"1.子序列: 指一个字符串删掉部分字符(也可以不删)形成的字符串,可以是不连续的,比如"abcde"的子序列可以有"ace","ad"等等。返回的解集中,子集可以按。
2024-08-16 15:18:52
1155
原创 算法039(必备)——嵌套类问题的递归解题套路
返回所有原子的数量,格式为:第一个(按字典序)原子的名字,跟着它的数量(如果数量大于 1),然后是第二个原子的名字(按字典序),跟着它的数量(如果数量大于 1),以此类推。输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。如果数量大于 1,原子后会跟着数字表示原子的数量。原子总是以一个大写字母开始,接着跟随 0 个或任意个小写字母,表示原子的名字。遍历完后,注意可能的尾部原子遗漏问题(遍历过程中,需要遇到字母才会更新容器)此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数。
2024-08-16 09:11:15
893
原创 算法018(入门)——二叉树的三种非递归遍历
结合前序遍历的性质(头左右)可知,需要容器存储已经遍历过的节点以便于找到后面的节点,并结合遍历的顺序可知需要不断记录左再遍历左的左。而这一特征与栈的后进先出(接收左后,先加入右再加入左,一直保持左后进先出)的性质一致。分析前序遍历的方式,走完头再遍历左右(头弹出再进右左);,需要容器存储已经遍历过的节点以便于找到后面的节点,而栈的性质(后进先出)正好满足这一特点。结合前序遍历的顺序(头左右),将其改为头右左后将vec反转。结合前序遍历的性质(左头右)可知,需要不断找到。后序遍历顺序:左右头;
2024-08-14 14:33:38
442
1
原创 算法016(入门)——双端队列
设计实现双端队列。实现ktruefalsetruefalsetruefalsetruefalse-1-1truefalsetruefalse。
2024-08-14 08:15:10
163
原创 算法015(入门)——最小栈
设计一个支持pushpoptop操作,并能在常数时间内检索到最小元素的栈。实现MinStackMinStack()void pop()int top()
2024-08-14 07:58:25
141
原创 算法014(入门)——栈和队列的相互实现
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):实现MyQueueint pop()int peek()truefalsesizeis empty。
2024-08-13 20:47:32
459
原创 算法012(入门)——划分链表
给你一个链表的头节点head和一个特定值x,请你对链表进行分隔,使得所有x的节点都出现在x的节点之前。你应当两个分区中每个节点的初始相对位置。
2024-08-13 20:00:18
265
原创 算法011(必备)——两个链表相加
给你两个的链表,表示两个非负的整数。它们每位数字都是按照的方式存储的,并且每个节点只能存储数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
2024-08-13 17:35:40
358
原创 算法037(必备)二叉树高频题目——下
中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(若左的最大值≥root的值和右的最小值≤root的值,则返回false;改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。所以结果应当返回修剪好的二叉搜索树的新的根节点。
2024-08-11 21:09:28
757
原创 Linux知识点
创建时,文件 默认666,目录默认777,减去umask的位就是结果。umask是从权限中“拿走”相应的位,且文件创建时不能赋予执行权限.more命令:分屏显示文件内容,每次只显示一屏,只允许向前浏览。top命令可以看到总体的系统运行状态和cpu的使用率。less命令:与more相似,并且支持向前,向后浏览。cat命令:将文件内容一次全输出显示在屏幕上。
2024-08-01 16:38:36
224
原创 初识C++||Day02:函数重载和引用
quest1:下列代码运行结果是什么?answer:结果输出2,namespace中的函数会向namespace域中查找i,而无法向其他区域查找,其他区域定义的i会在其区域将namespace中的i覆盖。
2024-05-09 19:07:48
247
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅