自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 动态库加载的底层原理

动态库有两种绑定策略,。这两种绑定方式在程序编译时确定,决定程序在运行时如何加载动态库。

2025-05-25 10:17:27 403

原创 Linux信号概念原理大全(信号的系统调用、信号的产生阻塞捕捉、sigset_t和信号集操作函数、sigaction函数、常见信号种类)

Linux信号是系统向进程发送特定事件的一种机制,进程通过信号处理函数对信号进行识别和处理。信号分为普通信号和实时信号,普通信号有31个,每个信号有特定含义。系统调用如signal、kill、raise、abort和alarm用于信号的捕捉、发送和终止。信号在进程PCB中以位图形式存储,信号产生本质是修改位图。程序崩溃通常由非法访问或操作引起,OS会发送终止信号。信号阻塞通过block位图实现,被阻塞的信号保持未决状态。sigset_t是信号集数据结构,通过系统调用操作。sigprocmask函数用于读取或

2025-05-23 09:46:10 963

原创 高并发内存池|六、page cache的设计

Page Cache 是一种用于管理内存页的缓存机制,其核心设计包括哈希桶结构、单例模式、基数树和页号映射管理。Page Cache 的哈希桶结构将内存块按大小(1到128页)分类,并通过 SpanList 进行管理。为了避免频繁向系统申请内存,Page Cache 一次性申请 128 页的内存块,再根据需求拆分。Page Cache 采用单例模式,确保全局唯一性,并通过基数树提升并发性能,减少锁的使用。页号映射管理通过哈希表实现,确保内存释放时能正确归还到对应的 Span。Page Cache 还支持内存

2025-05-21 16:15:10 738

原创 高并发内存池|五、central cache的设计

central cache 是一个哈希桶结构,每个桶挂载的是 SpanList 链表,每个 Span 节点指向由大内存切割出的自由链表。Span 节点管理的内存块来自 page cache,当内存用尽时,SpanList 会创建新 Span 节点。central cache 采用单例模式,每个哈希桶有独立的桶锁以保证线程安全。内存申请时,central cache 将切分好的对象链表返回给 thread cache;内存归还时,小内存块重新拼接回原 Span,直到 Span 恢复初始大小后归还给 page

2025-05-20 22:55:45 997

原创 高并发内存池|四、thread cache的设计

thread cache 是一个哈希桶结构,。每个线程会有一个 thread cache 对象,这样每个线程在访问 thread cache 时都是无锁的。在设计 thread cache 时,哈希桶的数量必须要提前设定好,但如果为 256KB 区间中所有的大小都配置一个桶,那么桶数量就太多了,,否则哈希桶需要维护太多的桶来存放不同大小的数据。于是,我们规定每个桶设置了 5 个大小对齐规则,,即每个桶的大小都会是这 5 个数中某个数的倍数,那么最终将会有总计1656565656248个桶。

2025-05-19 07:04:59 901

原创 高并发内存池|三、Common

这部分主要存放高并发内存池中三个 cache 都会使用到的共同的结构。如内存对齐规则、自由链表结构、SpanList 结构、内存池向堆申请内存等功能都在这部分实现。

2025-05-18 10:39:09 1099

原创 高并发内存池|二、定长内存池的设计

设计一个定长的内存池,这个内存池的定长在于,当剩余空间使用完毕后,总是开辟相同长度的新空间来使用。大空间是内存池向系统申请的内存大小,而小空间是程序向该内存池申请的内存大小。由于程序向内存池申请存放空间的类型不同,这个小空间的大小也由需要存放的类型决定大小。的强制类型转换是在兼容 32 位和 64 位,使其不会因为指针大小不同而程序出错,也不用为了兼容 32 位和 64 位使用条件编译。这行,要求开的空间必须比指针大,因为我们会用归还回来的空间存放,后面的空间理论上是连起来的,来指向下一块空间,如果。

2025-05-17 22:51:15 462

原创 git远程仓库追踪本地仓库

如果你还没有创建远程仓库和本地仓库,建议先创建远程仓库再创建本地仓库克隆远程仓库,这样操作更简单。如果你已经有本地仓库,并且完成了多次提交,想要将本地仓库放到 github 或 gitee 中管理,就适用于远程仓库追踪本地仓库。

2025-05-14 12:21:34 513

原创 Git命令起别名

如果要给长命令取别名,需要把长命令的部分放在。如这个命令在全局中为。

2025-05-13 16:13:22 298

原创 Git日志信息

Git 提供了多种命令来查看和管理日志信息。git log 用于查看提交历史,支持美化输出和图形化显示分支记录。git reflog 可查看包括回退在内的所有本地记录。git blame 用于追踪文件每行的修改者,但输出较复杂,建议结合 grep 使用。此外,可以通过 cat 命令查看 HEAD 指针和分支指向的提交,或使用 git cat-file 查看特定版本的提交内容。git diff 则用于查询文本文件的修改差异。这些工具帮助开发者更好地管理代码版本和变更历史。

2025-05-12 16:48:39 271

原创 Git标签

使用tag命令可以给某次commit提交的版本打上标签,相当于这个commit id的别名,在实践中,会使用v1.0之类的标签提示这是正式版的第一个版本。缺省输入commit id会给最新的一次提交打上tag。commit id不需要全部写上,只要 Git 认为能够标识唯一的版本就行。

2025-05-11 16:56:30 507

原创 Git本地仓库关联远程仓库

创建公钥和私钥,注意公钥和私钥在创建时与邮箱绑定,那么码云或 Github 上绑定的邮箱就要与生成密钥的邮箱一致,否则在 push 的时候会有问题。ssh克隆是使用公钥私钥加密的形式,需要在本地仓库生成公钥和私钥,再将公钥存在码云或 Github 上。两个文件,其中后者对应公钥,将公钥复制到码云或 Github 相关设置里,就完成了公钥的设置。第一个是本地仓库的分支,第二个是远程仓库的分支,如果两个分支名字相同,可以不写。在远程仓库的网页端创建分支,然后要在本地进行一次。分支,还有一个指向远程仓库的。

2025-05-10 10:30:04 816

原创 Git撤销修改

回退的命令是层层递进的,如回退暂存区的命令实际是将工作区和暂存区都回退,回退版本库的命令实际是将三个区都回退。,因为本地仓库的提交版本是不能比远程仓库的提交版本低的。是缺省操作,会将版本库和暂存区的内容回退,但工作区的内容不变。如果因为各种原因,需要回滚至上个版本,可以使用特定的命名实现。会将版本库的内容回退,但工作区和暂存区的内容不变。命令后,仍然要回退版本库,要注意不能执行回退后再。表示上一版本,需要回退到多少个版本前,就加几个。注意如果使用的是远程仓库,撤销版本库修改要在执行。

2025-05-09 09:44:12 283

原创 Git分支管理

而是以 master 为蓝本创建分支,在分支中进行代码和文件的编辑工作,再使用分支合并的方法将修改都添加到 master 分支上。也就是说,Git 会直接将目标分支的指针移动到当前分支的末端,因为目标分支的提交历史是当前分支的祖先,合并操作不需要创建新的合并提交。但是一定要确定好当前要合并的分支,如果所处分支为 A 分支,将 A 分支和 B 分支进行合并,说明分支合并失败,两个分支之间的内容有冲突。删除分支时要注意当前所处的分支不能是将要删除的分支。注意,在执行合并分支发生冲突后,此时这两个分支处于。

2025-05-08 10:11:12 933

原创 gitignore的相关用法

gitignore是 git。.gitignore一般用于远程仓库多人协作的场景,最常见的情况是,使用 MacOS 系统的程序员要在.gitignore中添加.DS_Store防止将其推送至仓库中。或在开发代码时,将调试文件忽略,使其不污染远程仓库的内容。

2025-05-07 21:18:18 472

原创 Git仓库基本操作

git init即可完成仓库的初始化,目录下会生成一个.git文件夹。

2025-05-06 10:04:11 331

原创 C++访问MySQL

在 Linux 上安装 MySQL 时,如果你是通过命令直接按照的 MySQL,那么实际 MySQL 相关的 C 语言库也已经安装并配置好环境变量了。如果你是通过 MySQL 官网下载 MySQL 的.tar。

2025-05-05 11:49:01 1257

原创 MySQL用户管理

MySQL 的用户信息都存储在mysql数据库中。用户名。表示这个用户可以从哪个主机登录,localhost 表示只能从本机登录。用户密码通过加密后显示的字符。user 表中还有一堆的权限字段,以*_priv。

2025-05-04 09:12:22 1086

原创 MySQL视图

视图(View)是一种虚拟存在的表,,而是基于一个或多个基础表(基表)的查询结果生成的。视图的定义存储在数据字典中,每次访问视图时,MySQL 会根据视图中的查询语句。

2025-05-03 10:34:18 783

原创 MySQL事务

我们平时进行的 SQL 操作,虽然没有刻意使用到事务,但实际一条条对数据库的增删查改,也是一个事务。因为平时使用InnoDB引擎时,autocommit的默认值为1,默认自动提交事务。MySQL 是基于 CS 模式的一种网络服务,有客户端和服务端,这就决定了,如果大家都访问相同的表数据,在不加以保护的情况下,绝对会出现问题。这四种属性,可以简称为 ACID。就四种属性的关系而言,,MySQL 是通过原子性、隔离性和持久性来实现一致性的。

2025-05-02 08:51:36 639

原创 MySQL索引

索引本质上就是一种数据结构,是一种用空间换时间的策略,每个索引都会创建一个新的数据结构来构建索引关系。

2025-05-01 09:12:02 1059

原创 MySQL表的内外连接

表的内外连接是通过关键字,对两个表形成的笛卡儿积进行筛选。内连接和外连接都是从多个表中检索信息,

2025-04-30 09:46:15 307

原创 MySQL表的约束

在MySQL中,约束(Constraints)用于确保数据库表中数据的和,是限制表中数据的类型、格式以及有效值的规则。通过约束,可以确保数据库的完整性,防止不合法的数据进入数据库。

2025-04-29 09:52:46 927

原创 MySQL复合查询

以下为本文演示多表查询所需的数据库,这个数据库模拟的是一个等多个关键环节,用于电商网站、零售业务管理系统等。

2025-04-28 21:03:45 1465

原创 MySQL库的操作

创建一个数据库就相当于创建 Linux 的一个目录,而存储数据内容的结构是表,因此创建数据库时并没有很多的选项需要自定义,最多需要指定字符集和校验规则。

2025-04-27 10:16:17 337

原创 MySQL内置函数

查看当前日期:查看当前时间:获取时间戳:1.2 计算日期计算某天后的日期:计算某天前的日期:计算两个日期相差多少天:1.3 会员充值记录设计一个会员充值数据表,记录会员的 VIP 充值时间以及到期时间:显示所有会员的充值日期:显示五分钟内充值的用户:显示所有 VIP 剩余时长小于 30 天的用户:2. 字符串函数函数说明charset(str)返回字符串字符集。concat(string2 , …)连接字符串。instr(strin

2025-04-26 09:48:51 852

原创 MySQL数据类型

MySQL 中的整型类型包括tinyintsmallintintbigint。它们的区别在于所占的字节数不同,范围也因此不同,可以设置为有符号和无符号数值。实践中尽量不要使用 unsigned,因为对于原整型类型存不下的数据,unsigned 同样也可能会存不下,还不如使用更大的整型类型来存储。

2025-04-25 10:07:24 688

原创 MySQL表的增删查改

是 MySQL 查询中一个非常重要的关键字,它能够精确的控制需要实现的数据范围或条件。聚合函数是 MySQL 提供的用于对表中的数据做基本的计数、求和、求平均值、求最大值、求最小值等操作。是将所有的数据遍历一遍,查询的列越多,意味着需要传输的数据量越大,还可能会影响到索引的使用。可以看到,赵六的学号和李四发生冲突,李四数据被替换,id 也进行了自增。子句的查询,返回结果的顺序都是未定义的,实践中不要依赖这个顺序。如果在去重的同时,需要显示其他字段的信息,需要使用。在发生冲突时是将原数据删除再插入新的数据,

2025-04-24 09:54:39 550

原创 MySQL表的操作

创建表时,最好提前设计好表应该有的所有内容,否则后续添加或删除表的列可能会引发一连串的问题。

2025-04-23 12:17:10 376

原创 Ubuntu安装MySQL

随后使用本地的 Windows 电脑,进入网页 https://dev.mysql.com/downloads/ ,选择下载 APT 文件实际 Ubuntu 下的 MySQL 只有一个安装包,且是通过下载器连接网络下载其余资源的,所以系统的版本并不重要。将下载好的 .deb 文件通过 Xshell 直接拖入 Ubuntu 里即可(如果没安装对应 rz 传输文件命令会提示安装 rz 命令的方法)。

2025-04-21 08:21:47 445

原创 MySQL主从集群搭建模型

MySQL 主从复制,可以实现数据从一个 MySQL 数据库服务器主要节点复制到一个或多个主从节点。主库负责读,从库负责写。即使主库出现了锁表的情况,读库也能正常运行。主库实时保存到从库,万一主库发生故障导致数据丢失,也能即使调用从库的备份。当某个节点发生故障时,可以方便实现故障切换。,异步复制使节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或特定的数据库(或特定的表)。

2025-04-19 09:18:07 1157

原创 Docker设置环境变量

选项添加环境变量以外,还可以创建一个普通文件,输入。Docker 除了在。

2025-04-18 09:49:52 398

原创 Docker容器设置自动重启

表示最大重启次数,若超过指定重启次数仍未能启动容器则放弃重启。如果在启动容器时没有设置重启策略,可以使用。docker stop 也会导致容器重启。不会影响 docker stop 的效果。

2025-04-17 10:14:08 508

原创 Docker Hub 创建私人镜像仓库

主页,首先注册或登录一个账号,接着回到主页,点击。

2025-04-16 15:04:16 265

原创 Docker华为云创建私人镜像仓库

之后,就可以在本地主机中上传镜像,也可以点击。设置组织名字后,点击左边菜单栏。或者在其他页面的搜索栏中搜索。

2025-04-15 16:53:32 496

原创 Dockerfile

定制镜像,可以将镜像制作的每一层的修改、安装、构建、操作的命令,都写入 Dockerfile 中,使用 Dockerfile 来构建、定制镜像。Dockerfile 相比于快照方法制作镜像,具有的优点。快照方法(docker commit)制作的镜像,需要手动一个命令一个命令执行,其制作过程不可考,因此生成的镜像又称为黑箱镜像,制作步骤比较繁琐,维护起来较麻烦,也难以进行二次开发。在制作 Dockerfile 时,要尽量将不变的因素放在前面,易变化的因素放在后面。

2025-04-14 11:08:23 990

原创 Docker Compose(容器编排)

是 Docker 官方开源的项目,使用 Python 编写。是能够定义和运行多个 Docker 容器的应用,。Compose 的默认管理对象是项目,通过 Compose 的子命令对项目中一组容器进行便捷的生命周期管理。

2025-04-13 09:19:35 1707

原创 Docker网络

Docker 容器网络是为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作的系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等网络相关的模块。Docker 使用 Libnetwork 开源库实现网络架构,Libnetwork 基于 CNM 标准的设计规范,实现了 CNM 中定义的三个组件(),此外它还实现了等功能。

2025-04-12 13:06:20 960

原创 Docker存储卷

存储卷就是将宿主机的本地文件系统中的某个目录与容器的文件系统的某一目录建立绑定关系。卷的本质就是文件或者目录。通过这层绑定,。由于存储卷的原理是宿主机和容器指向了同一块存储空间,存储卷存在的原因是,容器只是镜像的拷贝,当容器被删除时,容器中的读写层也会随之消失。。同时,令多个容器同时挂载同一个存储卷,也可以实现多个容器在文件上的互通。

2025-04-11 10:23:57 1097

原创 Docker命令

登录到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub。这两个选项是用于在命令行中提前指定登录的账号和密码,即使不提前输入,后续在 login 的中途也要输入。且使用 -p 选项提前输入密码,会导致密码信息存储在 history 中,有安全隐患。

2025-04-10 11:19:06 1393

空空如也

空空如也

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

TA关注的人

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