- 博客(96)
- 收藏
- 关注
原创 企业开发工具git的使用:从入门到高效团队协作
本文介绍了Git的基本概念、安装、本地仓库的创建与配置,以及工作区、暂存区和版本库的区分。详细讲解了版本回退、撤销修改、删除文件等操作,并深入探讨了分支管理,包括分支的创建、切换、合并、删除及冲突解决。此外,还介绍了远程操作,如远程仓库的创建与克隆,分布式版本控制的理解,以及多人协作的两种模式(单分支与多分支)。最后,文章总结了系统开发环境和Git分支设计规范,强调了不同分支在开发、测试、预发布和生产环境中的作用。通过本文,读者可以全面掌握Git的核心功能及其在团队协作中的应用。
2025-05-19 09:02:46
1533
87
原创 MySQL基本查询
本文详细介绍了MySQL中的插入、查询、更新、删除等基本操作语法。插入操作使用INSERT INTO语句,支持单条或多条数据插入,并可处理主键冲突问题。查询操作通过SELECT语句实现,支持条件筛选、排序、分页等功能。更新操作使用UPDATE语句,可对指定条件的数据进行修改。删除操作通过DELETE或TRUNCATE语句实现,后者用于快速清空表数据。此外,还介绍了聚合函数(如COUNT、SUM、AVG等)和GROUP BY分组统计的使用方法,帮助用户进行数据分析和处理。
2025-05-13 17:08:14
1588
78
原创 MySQL数据库表的约束
数据库约束是确保数据合法性和完整性的重要机制。常见的约束包括数据类型、null/not null属性、默认值、主键、唯一键、外键等。数据类型本身即是一种约束,确保数据格式正确。null和not null属性控制字段是否允许为空,而默认值约束则在未指定值时自动填充预设值。主键确保每行数据的唯一性,且不能为空;唯一键则允许空值,但非空值必须唯一。外键用于维护表间关系,确保从表数据依赖于主表数据。此外,自增长属性常用于主键,自动生成唯一标识。这些约束共同作用,防止无效数据进入数据库,保障数据的完整性和可预期性。
2025-05-12 17:52:49
1136
5
原创 MySQL数据类型
本文详细介绍了MySQL中的数据类型分类,包括数值类型、浮点类、字符串类、日期和时间类型以及enum和set类型。数值类型以tinyint为例,解释了其存储范围及使用场景,并展示了相关测试代码。浮点类介绍了float和decimal的语法及精度差异。字符串类对比了char和varchar的存储方式及适用场景。日期和时间类型包括date、datetime和timestamp,并提供了测试示例。最后,enum和set类型用于存储预定义的值,适合单选和多选数据,展示了其使用方法和查找技巧。通过这些数据类型的合理选
2025-05-11 19:23:16
1940
62
原创 MySQL数据库与表结构操作指南
字符集:相当于"字典":定义所有可用字符的集合为每个字符分配唯一的代码点(Code Point)例如:ASCII字符集包含128个字符,Unicode字符集包含14+万字符
2025-05-09 09:28:36
1078
13
原创 MySQL数据库基础
MySQL:世界上最受欢迎的数据库,属于甲骨文,并发性好,不适合做复杂的业务。主要用在电商,SNS,论坛。对简单的SQL处理效果好。PostgreSQL :加州大学伯克利分校计算机系开发的关系型数据库,不管是私用,商用,还是学术研究使用,可以免费使用,修改和分发。SQLite: 是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。H2: 是
2025-05-08 17:22:40
2271
3
原创 从明文裸奔到密钥长城:HTTPS加密全链路攻防与CA信任锚点构建
数据指纹,其基本原理是利用单向散列函数(Hash 函数)对信息进行运算,生成一串固定⻓度的数字摘要。数字指纹并不是一种加密机制,因为它是不可逆的,无法进行解密(也无需解密),它的意义在于可以用来判断数据有没有被篡改。如果数据被篡改过,尽管只是有一点点的改动,数据摘要都大有不同。数据摘要具有唯一性,和人的指纹一样,所以也叫数据指纹。
2025-05-07 10:09:15
3193
72
原创 高并发内存池(完整版):支撑百万级并发的幕后英雄
Thread-Caching Malloc,即线程缓存的malloc,实现了⾼效的多线程内存管理,⽤于替代系统的内存分配相关的函数(malloc、free)。在多线程环境下进行内存申请本质上属于对公共资源的访问,高并发场景下对内存分配锁的竞争会异常激烈,这将严重拖慢程序运行效率。此外,频繁的系统级内存申请不仅会产生额外开销,还可能引发内存碎片问题。传统的malloc内存分配机制由于这些固有缺陷,已难以满足现代高性能开发中对内存管理效率的需求。
2025-05-06 10:54:58
916
49
原创 高并发内存池(五):性能测试与性能优化
未处理超过256KB的大内存申请。前期测试覆盖不足,导致多线程场景下隐藏了一些bug。本文将修复这些问题,并实现三个目标:增加大块内存分配逻辑替换系统自带的malloc通过性能测试定位优化瓶颈。
2025-04-30 10:09:10
1750
70
原创 基于Tcp协议的应用层协议定制
本文将基于TCP协议构建一个网络计算器服务。业务逻辑相对弱化一些,目的是完整演示服务端开发的核心流程。而把重点放在应用层协议的设计过程,包括请求/响应报文结构定义、数据传输机制等关键实现细节;同时讲解Socket通信层的工程化封装,通过抽象连接建立、数据收发、资源管理等基础操作,构建可扩展的网络通信模块。
2025-04-26 08:07:56
1366
81
原创 基于UDP协议的群聊服务器开发(C/C++)
在服务器架构设计中,模块解耦是保障系统可维护性的核心准则。本方案采用分层架构将核心功能拆解为通信层与业务处理层两大模块。值得注意的是,当使用TCP协议时,开发者往往需要额外设计协议抽象层来解决其字节流特性导致的消息边界模糊问题(如粘包/拆包处理),并通过重传机制强化传输可靠性。而UDP的面向报文特性天然规避了消息边界问题,其无状态传输模型大幅简化了基础通信层的设计复杂度——这正是我们选择UDP构建轻量化实时群聊系统的关键原因。话不多说,我们直接开始!
2025-04-23 10:08:09
2349
81
原创 网络基础(协议,地址,OSI模型、Socket编程......)
所谓“局域网”(LAN)和“广域网”(WAN)只是一个相对的概念. 比如, 我们有 "天朝特色" 的广域网, 也可以看做一个比较大的局域网。
2025-04-20 08:31:15
1215
70
原创 线程池的封装(c/c++)
池化技术所谓“池化技术”,就是,以备不时之需。之所以要申请过量的资源,是因为每次申请该资源都有较⼤的开销,不如提前申请好了,这样使⽤时就会变得⾮常快捷,⼤⼤提⾼程序运⾏效率。:复用已创建的线程,减少线程创建销毁的开销。:任务到达时可以直接执行,无需等待线程创建。:统一分配、调优和监控线程。
2025-04-17 12:28:23
1817
67
原创 高并发内存池(四):内存释放原理与实现
不能粗鲁地把内存块连接到一个随便找的span,这样的话,属于不同页的内存块就混乱在一起,后面的PageCache就没法玩了!页号成为了它们之间的脐带,内存块地址除以8KB就是它所在的页,而一个span的信息中也能找到它管理着哪些页,只需要做一个页号到span的映射(即哈希表)就能解决问题。页级别的内存管理是在PageCache,我们把哈希映射在PageCache层创建和维护。
2025-04-16 08:08:59
1300
59
原创 高并发内存池(三):PageCache(页缓存)的实现
⻚缓存是在central cache缓存上⾯的⼀层缓存,存储的内存是以⻚为单位存储及分配的,central cache没有内存对象时,从page cache分配出⼀定数量的page,并切割成定⻓⼤⼩的⼩块内存,分配给central cache。当⼀个span的⼏个跨度⻚的对象都回收以后,page cache会回收central cache满⾜条件的span对象,并且合并相邻的⻚,组成更⼤的⻚,缓解内存碎⽚的问题。
2025-04-10 08:27:18
1431
86
原创 C++类型转换详解
c++中支持内置类型转自定义类型,只需要提供相应的构造函数,就可以想怎么转就怎么转,全在于你的构造函数怎么实现。int b;A a1 = v;//int类型隐式转化为A类型fun(6);return 0;A a1 = v:调用构造函数产生临时对象,然后调用拷贝赋值。逻辑上是这样,但实际上会被编译器优化。
2025-04-07 07:46:33
1107
62
原创 高并发内存池(二):CentralCache(中心缓存)的实现
本文将要讲解的高并发内存池,它的原型是Google的⼀个开源项⽬tcmalloc,全称Thread-Caching Malloc,近一个月我将以学习为目的来模拟实现一个精简版的高并发内存池,并对核心技术分块进行精细剖析,分享在专栏《高并发内存池》里,期待小伙伴们的热情支持与关注!上期讲了Thread Cache的实现,但并未对在Central Cache中如何申请内存进行讲解。接下来让我们会对Central Cache的结构和如何在Central Cache中申请内存进行学习和代码实现。
2025-04-02 10:09:05
12459
79
原创 多线程编程实战:基于阻塞队列与环形队列的生产者消费者模型详解
⽣产者消费者模式是通过⼀个容器来解决⽣产者和消费者的强耦合问题。⽣产者和消费者彼此之间不直接通讯,⽽通过阻塞队列来进⾏通讯,所以⽣产者⽣产完数据之后不⽤等待消费者处理,直接扔给阻塞队列,消费者不找⽣产者要数据,⽽是直接从阻塞队列⾥取,阻塞队列就相当于⼀个缓冲区,平衡了⽣产者和消费者的处理能⼒。这个阻塞队列就是⽤来给⽣产者和消费者解耦的。
2025-04-01 10:11:15
1199
26
原创 Linux多线程编程的艺术:封装线程、锁、条件变量和信号量的工程实践
pthread_create函数要求传入一个void *(*start_routine) (void *)类型的函数指针,但为了可以让用户更灵活的使用,我们可以在这里进行一下封装。也就是说希望用户想传什么类型的函数指针都行,那么可以单独设计这样一个函数,如下:
2025-03-31 10:28:30
1189
50
原创 高并发内存池(一):项目介绍和ThreadCache(线程缓存)实现
在多线程环境下进行内存申请本质上属于对公共资源的访问,高并发场景下对内存分配锁的竞争会异常激烈,这将严重拖慢程序运行效率。此外,频繁的系统级内存申请不仅会产生额外开销,还可能引发内存碎片问题。传统的malloc内存分配机制由于这些固有缺陷,已难以满足现代高性能开发中对内存管理效率的需求。
2025-03-28 10:04:43
1581
69
原创 定长内存池原理及实现
所谓“池化技术”,就是,以备不时之需。之所以要申请过量的资源,是因为每次申请该资源都有较⼤的开销,不如提前申请好了,这样使⽤时就会变得⾮常快捷,⼤⼤提⾼程序运⾏效率。在计算机中,有很多使⽤“池”这种技术的地⽅,除了。以服务器上的线程池为例,它的主要思想是:先启动若⼲数量的线程,让它们处于睡眠状态,当接收到客户端的请求时,唤醒池中某个睡眠的线程,让它来处理客户端的请求,当处理完这个请求,线程⼜进⼊睡眠状态。
2025-03-25 10:48:33
1081
68
原创 Linux信号的诞生与归宿:内核如何管理信号的生成、阻塞和递达?
在我们运行程序时通常会用Ctrl+c来使程序退出,这其实是向前台程序发送2号信号。除此之外还有Ctrl+\,表示发送3号信号,同样是让程序退出,2号信号与3号信号的区别将在下文核心转储部分详细讲解。
2025-03-21 09:41:06
16520
81
原创 操作系统的心脏节拍:CPU中断如何驱动内核运转?
当以上程序执行到scanf时,如果我们不输入信息,程序会一直阻塞在这里。那程序如何知道我们已经完成输入了呢?而且我们输入的信息在外设上,程序又是如何知道何时将其载入内存的呢?这其实是由外设就绪后通知给CPU,再由CPU通知给操作系统,然后由操作系统调用最后通知给前台程序。具体细节如下:每个中断都有自己的编号,即中断号,在中断控制器中会有寄存器来记录已就绪的中断号。一旦有外设就绪,它的中断号将被存入寄存器,然后由中断控制器通知CPU。
2025-03-18 10:42:08
1306
61
原创 共享内存通信效率碾压管道?System V IPC原理与性能实测
共享内存是通过在物理内存上开辟一块空间,然后让需要通信的进程都映射到这一块空间,这样就使它们看到同一块资源了。 共享内存通信是双向的,也就是说一个进程可以即读又写,而且使用起来就和c语言申请的malloc差不多。这种通信方式存在着数据安全问题,会在下文细说。 创建共享内存使用shmget函数,它的作用是创建或获取共享内存段的系统调用。 对于shmget用起来还是挺简单的,但是要把它的各种参数的设定都理解还是很困难的,接下来我会进行详细讲解。 问题2很
2025-03-12 10:08:08
990
72
原创 子数组问题——动态规划
用动态规划做子数组类的题时,对于状态表示我们可以直接设:dp[i]为以i元素结尾的子数组的... ... 后面就根据具体的题目要求填写,可能是子数组的和或者子数组的积等等,无论如何都可以以i元素结尾的子数组为研究对象去思考问题,如果解决不了就尝试增加状态,但研究对象不要改变。如果还解决不了那么再考虑改变或增加研究对象。
2025-03-06 10:17:42
7599
56
原创 多状态dp——动态规划
每个状态点需要维护多个子状态,分别表示不同情境下的最优解。例如,股票买卖问题中,每个时间点需记录「持有股票」和「未持有股票」两种状态下的最大收益。:将问题划分为多个互相影响的状态。例如:股票问题:持有、未持有、冷冻期。粉刷房子:当前房子涂红、蓝、绿时的最小成本。:每个子状态的值需根据前一步其他子状态计算。例如:当天持有股票的最大收益 = max(前一天已持有继续持有, 前一天未持有当天买入)。
2025-02-26 10:08:29
1197
48
原创 基础dp——动态规划
动态规划(Dynamic Programming,简称dp)是一种通过将复杂问题分解为更小的子问题来解决的算法思想,尤其适用于具有重叠子问题和最优子结构的优化问题。其核心目标是避免重复计算,通过存储中间结果(记忆化)来提升效率。动态规划 vs 分治法共同点:都将问题分解为子问题。区别分治法(如归并排序)的子问题独立,无重叠,无需存储中间结果。动态规划的子问题有重叠,需存储中间结果避免重复计算。
2025-02-23 08:26:44
2819
46
原创 FloodFill算法——搜索算法
FloodFill算法字面意思就是洪水灌溉法,比如我们有这么一块地:0表示平原,正数表示高地,负数表示凹地,那么当洪水来临时这些凹地会被优先灌满。而我们要找的正是这些联通块,如:它是一种暴力搜索的思想,只要我们把每个地方都搜索一遍,那么最终的结果必定会水落石出。通常可以使用BFS、DFS或并查集解决。接下来我们直接从题中感受。
2025-02-13 10:01:36
999
43
原创 DFS+回溯+剪枝(深度优先搜索)——搜索算法
递归是这样理解把它拆分出来,两个字,递和归递递推这就需要找到递推公式归回归需要找到回归条件,递推过程逐渐逼近回归条件直白一点来说就是,一个函数自己调用自己的情况,当然一定是要能够返回的。二叉树的遍历,快排,归并中都用到了递归。
2025-02-10 10:03:35
1813
37
原创 BFS(广度优先搜索)——搜索算法
BFS,也就是广度(宽度)优先搜索,二叉树的层序遍历就是一个BFS的过程。而前、中、后序遍历则是DFS(深度优先搜索)。从字面意思也很好理解,DFS就是一条路走到黑,BFS则是一层一层地展开。
2025-02-03 10:14:43
3064
60
原创 进程池的制作(linux进程间通信,匿名管道... ...)
在程序使用内存的时候,比如vector扩容机制,会提前给你开辟一块空间供你使用,尽管现在用不到,相当于做一下预备。因为只是一个小测试,代码写的并不严谨(没有检查调用是否成功,没有关闭文件,没有进程等待)大家不用太在意,能说明问题就行。,但它与一般的文件还是有些区别,文件都是储存到磁盘上的,而进程之间通信用的文件并不需要把它储存到磁盘上,它只是作为一个传输介质。那么进程池也同样,给父进程提前开辟一些子进程,提供父进程使用。,顾名思义就是没有名字,也不需要名字,因为子进程能够继承下来父进程开辟的管道资源。
2025-01-27 09:00:33
1424
33
原创 动静态库的制作与使用(Linux操作系统)
首先准备好需要做成库的源文件与头文件,如下示例:注意:在制作库方法过程中不能有main函数。如果代码使用c语言进行写的,执行以下语句把所有.c文件进行编译得到了.o文件。gcc -c *.c使用ar指令把所有.o文件链接成静态库,如下:-r(replace):此选项表示在插入文件到库时,若遇到同名的成员,则进行替换。它确保了库中的文件是最新的。-c(create):这个选项用于创建一个新的库文件。如果指定的库文件已经存在,它并不会被覆盖,而是会报错提示文件已存在。
2025-01-23 10:15:58
1084
50
原创 深入理解Linux系统内存中文件结构以及缓冲区,模拟实现c语言库文件接口
当语言层缓冲区刷新之后,数据并不会马上写入磁盘,而是放到了系统的缓冲区,系统缓冲区的作用是减少磁盘的随机读写,增加顺序读写从而提高读写效率。因为读写到一起的都是相关性强的数据,等再次被读的时候就可以一起被读出来。
2025-01-20 09:25:31
1667
38
原创 分治算法——优选算法
本章我们要学习的是分治算法,顾名思义就是分而治之,把大问题分为多个相同的子问题进行处理,其中我们熟知的快速排序和归并排序用的就是分治算法,所以我们需要重新回顾一下这两个排序。
2025-01-09 09:15:48
1949
58
原创 自制shell命令行解释器,深入理解Linux系统命令行实现原理
环境变量表需要我们在程序启动时就将它导入, 当然程序启动后环境变量默认是父进程的,所以我们可以重新开辟空间把原环境变量的数据拷贝过来,然后再把environ更新为新的地址。具体实现请参考下文源码。
2024-12-09 09:13:31
1318
75
原创 深入理解进程的退出、等待与替换(Linux系统)
进程等待指的是父进程等待子进程结束。在子进程结束后它的pcb不会立马释放,而是进入僵尸状态,让父进程回收。当然如果父进程永远不来回收,那么子进程pcb就永远得不到释放,从而内存泄漏。而父进程在等待子进程退出这个过程就叫作进程等待。
2024-12-07 09:53:23
1275
54
原创 虚拟地址空间与物理内存(Linux系统)
在虚拟内存与物理内存之间存在着一个媒介,它就是页表,起到一个交通枢纽的作用,它实际上是一个映射关系,把虚拟内存上的值通过页表映射得到对应的物理内存。当然页表的作用不止于此,它还起到权限管理的作用,即每个地址都用自己的rwx权限,对野指针、空指针等进行访问,就是在页表这里被拦截的。
2024-11-27 09:28:32
1859
85
原创 操作系统的理解
要理解这个结构,我们需要就盯着数据流动这条线来分析,很容易发现CPU是只与存储器打交道,而不与输入输出设备直接接触,这里存储器起到一个交通枢纽的作用。那么为什么会有这种结构呢,为什么不是“输入”—>“CPU处理”—>“输出”呢?
2024-11-22 09:16:19
832
77
原创 智能指针原理、使用和实现——C++11新特性(三)
智能指针简称RAll,是一种自动化管理资源的类模板,这里指的资源可以是:动态开辟的内存,文件指针,网络连接,互斥锁等等。RAII在获取资源时把资源委托给⼀个对象,接着控制对资源的访问,利用对象的⽣命周期结束时会自动析构的特性来完成对资源的自动释放,这样保障了资源的正常释放,避免资源泄漏问题。
2024-11-18 10:15:20
860
75
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人