自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

学习学习学习学习

好好学习,天天向上

  • 博客(72)
  • 收藏
  • 关注

原创 【intel 开发手册】中断

在架构上,当IF标志被设置时,从0到32的任何向量的中断都可以通过INTR引脚传递给处理器,从16到32的任何向量都可以通过本地APIC传递。​ 当一个中断被接收,或者一个异常被检测到,当前执行的程序/任务会挂起,处理器执行中断/异常的处理。被中断的过程或任务的恢复不会失去程序的连续性,除非从异常中恢复是不可能的或中断导致当前运行的程序被终止。清除以阻止可屏蔽的硬件中断。当一个中断/异常被标记,处理器停止当前程序/任务的执行并切换一个处理程序,用来处理预先被卸卸任的中断/异常场景,处理器通过一个。

2025-01-20 16:20:27 927

原创 【Linux 源码】内核态到用户态

首先8259A芯片会产生一个中断标志,然后阵脚INT置为高电频,对应的中断向量位置置为高电频。或者int指令进行中断中断检测周期发现后,将CPU的INTR置为1,当CPU执行完最后一个指令(IF,ID,EXEC,MEM,WB)时,开始判断是否可以中断检查eflags的if标志位,是否是被清除的,是的话,不能中断CPU和8259A芯片连接的数据总线,解码获取到中断向量(与就是中断的程序位置)获取到后,和IDTR(baseaddr+offset)找到对应IDT。

2025-01-20 16:15:50 1256

原创 【intel 开发手册】特权级

​ 图中的中心(为最有权力的代码,数据,栈而保留)被使用包含关键软件的段,通常是操作系统内核。和指令被提取的代码段的特权级是相等的。​ 数据段的访问操作,数据段的段选择子必须加载到数据段寄存器(DS,ES,FS,GS)或者栈段寄存器(SS)。当段描述符的段选择子被加载到段寄存器时,权限特权级被校验。数据段的数据访问的校验,和代码段之间传输程序控制的校验不同。存储在段的字段里,段/门的门描述符里。调用门用于不同特权级之间的程序控制,仅用于使用特权级保护机制的操作系统或执行器。:当前执行的程序/任务的特权级。

2025-01-17 15:23:17 918

原创 【intel 开发手册】任务管理

TSS描述符或任务门的引用(在调用或跳转到任务时)或NT标志的状态(在执行IRET指令时)决定是否发生任务切换。​ 对于分配执行的任务,任务间的切换时,IA-32架构提供保护任务状态的机制。​ 当任务被分派,会发生当前执行任务和被分派的任务之间发生切换。在任务切换期间,当前执行任务的执行环境(叫做任务状态/上下文)存储在它自己的。任务用来执行程序,任务,过程,一个操作系统服务,中断处理,异常处理,内存,执行工具。当执行程序加载任务时,TSS的段选择子,基地址,界限大小,段描述符会加载到任务寄存器。

2025-01-17 15:17:22 815

原创 【intel 开发手册】GDT相关概念

任何类型程序执行,至少代码段,数据段,栈段寄存器必须被有效的段选择子加载。段选择子是16bit。这都和[1. 逻辑地址](# 1. 逻辑地址)相对应,比如逻辑地址是16位的段选择子和32位offset组成,并且是程序编译和链接时产生。段描述符被编译器,链接器,加载器,操作系统,执行,但不是应用程序。当一个段选择被加载进段寄存器的可见部分时,处理器也加载了该段寄存器的隐藏部分(基地址,限制,段选择子指向段描述符中的访问控制信息)。段选择子时16位的段标识,它不直接的指向段,取而代之指向段描述符来识别段。

2025-01-16 15:11:23 1130

原创 【intel 开发手册】地址类型

在处理器的线性地址空间里,线性地址是一个32位的地址。类似于物理地址,线性地址是一个平坦的(未分段的),2^32byte地址空间,0~0xFFFFFFFF,线性地址包含所有的段和用于定义系统的表。保护模式,IA-32架构提供了标准的4GB物理地址,这是处理器能在数据总线寻址的地址空间。如果未开启分页,处理器直接通过线性地址映射物理地址(线性地址直接在处理器的数据总线发出)。即使使用最下的分段,处理器地址空间种的每个字节都是用逻辑地址访问。如果线性地址被分页,二级地址转换被用在转换线性地址到物理地址。

2025-01-16 15:07:48 1079

原创 【Redis 源码】压缩链表结构

​ 通过上面的描述,清晰的看出ziplist的由来,组成,以及如何创建一个ziplist对象,以及部分源码的理解​ 如果读者想了解更多的ziplist更多源码,可阅读ziplist.c源码,里面涵盖了插入,删除等等api的实现。

2025-01-15 14:07:04 1132

原创 【GLIBC 源码】 malloc内存分配

,那既然涉及到分配内存的使用,通过汇编角度的esp指针移动进行内存分配,无外乎就可同理可得,分配内存方式也可以通过指针分配,除了此方式,为了加快速度,也可推理得出可以采用mmap映射。这个32byte起到了很大的作用,因为如果你后续开辟小于132的,会先减去已经使用的,在减去32byte,得到剩余空间,来进行比较是否符合,从而进行sbrk指针的移动分配地址。这里分别写了3个malloc的内存分配,为什么数字还不一样,128不是mmap的分配阈值么?的下面,之后的代码也是同样如此,形式就如下。

2025-01-15 14:03:47 1016

原创 【Linux 源码】进程

首先进行了进程由来的讲解,在之后进行源码级别的深入先简单展示了下进程结构体的源码,以及任务状态段的源码,然后进行linux主函数进行进程创建的源码分析。🚀进程创建:通过特权级切换,切换到用户态,之后的代码都在用户态执行,切换的目的是程序代码保证不越级,造成未知的问题。之后进行fork父进程寻找未使用的pid & 判断是否是没有被使用的拷贝父进程的数据 & 设置当前程序所需的元数据信息做完这些后,会判断是否是子父进程,从而进行init子进程操作,还是pause父进程操作。

2025-01-14 13:22:15 1453

原创 GLIBC 源码下载&编译流程

make install的作用是将编译好的程序、库文件、配置文件等安装到系统指定的位置。它会检查系统库、头文件的位置,编译器和其他工具的可用性,并设置相应的配置选项。它读取Makefile中的信息,并根据其中的规则决定哪些文件需要重新编译。make会检查源代码文件的时间戳,如果发现某个源文件比其对应的对象文件新(即源文件已被修改),则会重新编译该源文件。在整个过程中,Makefile起到了核心作用,它是make工作的蓝图,而configure则是为了确保这个蓝图适应不同的构建环境。make后的目标文件。

2025-01-14 13:19:05 948

原创 【Redis 源码】 RedisObject结构体

​⭐️对于RedisObject,分析到这,可以很好的理解它本身出现的意义和作用在C里通过指针地址来指向操作数据的地址空间,通过类型来定义操作多少byte内存空间大小,redisObject在进行了代码的高内聚抽象,形成了robj。在通过不同的属性,进行封装,利用位域达到最大化的空间利用率,再通过汇编代码角度,进行了robj层面的理解。

2025-01-08 17:40:26 1244

原创 Source Insight 读取源码使用入门

Where do you want to store the project datafiles: 选择存储位置。这时候,就已经创建成功,现在需要同步文件。New Project name:起名。选择你的所有redis源码,并点击。下载后,根据以下步骤进行导入源码。这里我以redis源码为例。,并勾选2个方框,点击ok。下图中的红框内的解释。F3:向前搜索关键词。F4:向后搜索关键词。

2025-01-08 16:47:19 334

原创 MySQL 执行原理

需要注意的是,这个ON子句是专门为外连接驱动表中的记录在被驱动表找不到匹配记录时应不应该把该记录加入结果集这个场景下提出的,所以如果把ON子句放到内连接中,MySQL会把它和WHERE子句一样对待,也就是说:内连接中的WHERE子句和ON子句是等价的。在内存中每一条记录会和驱动表结果集做一条记录匹配,之后从内存清除掉,然后在从驱动表结果集拿下一条记录,再把被驱动表记录加载到内存中,周而复始,驱动表结果集有多少条记录,被驱动表从磁盘加载到内存中就有多少次。主键索引是有序的,按照有序的主键去回表取记录。

2024-08-29 17:59:37 1237

原创 MySQL 系统库

每个表维护了一个变量,该变量记录着对该表进行crud的记录条数,如果发生变动的记录超过表大小的10%,并且自动重新计算统计数据功能打开,那么服务器会重新进行一次统计数据的计算,并更新。可按照监视不同维度进行分组,例如:按照不同数据库对象进行分组,按照不同的事件类型进行分组,或按照事件类型分组之后,在进一步按照账号,主机,程序,线程,用户等进行细分。主要存储了MySQL的用户账户和权限信息,还有一些存储过程,事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等。通过创建和修改表时指定。

2024-08-29 17:55:53 1759

原创 MySQL 体系架构

除非有非常特别的原因需要使用其他存储引擎,否则应该优先考虑InnoDB存储引擎,InnodB引擎是一个非常好的值得花最多的时间去深入学习的对象,收益肯定比时间平均花在每个存储引擎的学习上要高得多。它不支持BLOB或TEXT类型的列,并且每行的长度是固定的,所以即使指定了VARCHAR 列,实际存储时也会转换成CHAR,这可能导致部分内存的浪费。在MySQL5.6.6以及之后的版本,InnoDB并不会默认把各个表的数据存储到系统表空间,而是为每个表建立独立表空间,可以理解为创建多少个表,有多少个独立表空间。

2024-08-08 21:20:09 1665 2

原创 MySQL 8.0新特性

MySQL 5.7以及早起版本,InnoDB自增列计数器(auto_increment)的值只存储在内存中。将权限授予哪个用户。函数索引在MySQL中相当于新增了一个列,这个列会根据指定的函数进行计算结果,然后使用函数索引时,用这个新增的计算列作为索引。MySQL 允许所有用户看到系统数据库的名称和某些表的内容,以便他们能够查询关于自己数据库对象的元数据。MySQL8.0.13开始支持在索引使用函数(表达式)的值。MySQL8.0开始支持原子DDL操作,其中与表相关的原子DDL只支持InnoDB存储引擎。

2024-08-08 21:10:03 1440

原创 MySQL 锁

即使在搜索条件使用了索引字段,但是否使用索引来检索数据是有MySQL通过判断不同执行计划的代价来决定,如果MySQL认为全表扫描效率高,比如对一些小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。当一个事务获取了一条记录的S型记录锁后,其他事务也可继续获取该记录的S型记录锁,但获取不了该记录的X型记录锁。当我们对使用InnoDB存储引擎的表哦的某些记录加S锁之前,那就需要现在表级别加一个IS锁,当我么你对使用InnoDB存储引擎的表某些记录加X锁之前,那就需要现在表级别加一个IX锁。

2024-08-05 13:18:48 959

原创 MySQL 事务

事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位(不可进行分隔),由一个有限的数据库操作序列构成(多个DML语句,select语句不包含事务),要么全成功,否则都失败。事务的特性里包含一个隔离性,理论来说某个事务对数据访问时,其他事务应该排队,当该事务提交后,其他事务才可访问。开启一个事务后,执行了很多语句,发现其中语句是有问题,这时只能通过rollback进行回滚,让数据恢复到事务执行之前的状态,但有些业务,不需要全部回滚。下一个事务执行完后,后续事务将恢复到之前的隔离级别。

2024-08-05 13:08:39 1324

原创 MySQL 性能调优

优化:优化SQL语句,例如重写查询,决定表的读取顺序,以及选择需要的索引等。这一阶段用户是可以查询到,查询服务器优化器是如何进行优化到,便于用户重构查询和修改相关配置,达到最优。前面的章节我们知道如何设计最优数据库的表结构,如何建立最好的索引,这些对于高性能来说是必不可少的。默认情况下,慢查询日志是关闭的,要使用慢查询日志功能,首先要开启慢查询日志功能。需要确认业务表结构设计是否合理,SQL语句优化是否足够,索引设计是否规范,是否可以剔除无用的索引。慢查询日志,顾名思义,就是查询花费大量时间的日志。

2024-07-29 20:57:36 947

原创 MySQL 执行计划详解

派生表是在一个查询中定义的一个临时表,它由一个子查询生成,但不是作为查询的一部分返回,而是作为外部查询的一部分来引用。SUBQUERY:select、where之后包含了子查询,在select语句中出现的子查询语句,结果不依赖于外部查询(不在from语句中)。有了慢查询后,需要对慢查询语句进行分析。如果查询优化器决定使用全表扫描方式对某个表执行查询时,执行计划的row列的代表的预计需要扫描的行数。操作符连接的查询中,至少有一个查询依赖于外部查询的某个值时,这样的查询被称为。

2024-07-29 20:35:27 4865

原创 MySQL 高性能索引使用策略

索引调优

2024-07-28 18:25:08 1215

原创 MySQL 高性能索引创建

正确创建和使用索引是实现高性能查询的基础。

2024-07-28 10:52:28 1248

原创 MySQL 索引相关基本概念

InnoDB存储引擎支持以下几种常见索引:B+Tree索引,哈希索引,全文索引。

2024-07-27 13:05:49 1437

原创 Mybatis-Plus 租户使用

mybatis-plus租户使用与深入

2023-11-25 19:59:05 2377

原创 Java 代码 格式化插件

spring-javaformat-maven-plugin一组可应用于任何 Java 项目以提供一致的“Spring”风格的插件。该套件目前包括:由于该项目的目标是提供一致性,因此每个插件通常不可配置。您需要更改代码以匹配所需的约定。您无法配置插件约定来匹配您的风格!源格式化程序不会从根本上改变您的代码。例如,它不会改变 import 语句的顺序。它实际上仅限于添加或删除空格和换行符。2.2 使用默认情况下,格式化程序需要 Java 11。如果您正在处理较旧的项目,则可以使用基于 Eclipse 20

2023-11-21 20:31:44 942

原创 mysql 指定库对所有表加tenant_id

但库里表至少几百个,不可能一个一个去加,时间成本,人力成本都很大,所以写一个存储过程函数,对其进行一次性操作。由于业务所需,区分公司主体,tenant_id油然而生。⭐️生成好该函数后,执行该函数,即可。

2023-10-20 18:27:47 826

原创 idea连接远程服务器&上传war包文件

点击Mappings,配置Local path 和 Deployment Path。Deployment Path: 上传到服务器指定的文件夹的目录路径。Local Path: 上传war包的文件夹目录路径。点击右侧标签,点击"…

2023-07-26 17:46:18 1383

原创 Mysql 实现批量插入对已存在数据忽略或更新

唯一索引可为多个字段的联合索引,比如根据我提供的sql中,我需要``name。这里我们先制造2条数据,来判断我们批量插入是否能对已存在的数据进行忽略。age`不重复,则可把这2个字段联合创建为唯一索引。我们开始批量插入,对已存在数据进行忽略。笔者这里只举例第一种情况的demo。对已存在数据更新情况,读者自行练习。新增索引后,我们开始批量插入数据。批量插入对已存在数据忽略。批量插入对已存在数据更新。,需要唯一索引/主键。

2023-07-11 18:30:34 2653 2

原创 Mybatis 入门及实践

笔记+代码实操,香

2023-07-02 23:35:43 556

原创 C语言 sizeof, size_t, strlen

默认赋值16,而char *arr相当于初始化机器的位数,如机器是64bit,则初始化8byte。由于存放当前地址值不知当前机器平台的位数,并保证代码具有可移植性,定义一个关键字。从这里我们可以看出定义char arr[]和char *p,输出的结果不同。char arr[],初始化为0字节,需要到时在堆内存赋值长度,拿一个。可变数组,在编译期生成,没有编译期不生成,必须动态分配。strlen() 算的是加到\0之前的大小,函数。sizeof() 算的是总空间大小,运算符。编译c文件,查看结果。

2023-04-26 20:01:30 1292

原创 C语言指针及数组的运行原理

编写一个数组定义的C文件demo.creturn 1;编译C文件生成汇编// -S 只进行编译// -fno-asynchronous-unwind-tables 过滤调试代码 [ root@localhost practice ] # gcc -S -fno-asynchronous-unwind-tables pointer.c查看生成的汇编文件demo.s.textmain:pushq %rbpmovl $11, -12(%rbp) // 将11存储到rbp-12的空间里。

2023-04-19 14:40:49 935

原创 指令段间及文件间参数调用过程(64位 Intel架构)

而当指令段间调用参数,先需要一个指令段调用另一个指令段,换句话说,需要该指令段中的一个汇编指令调用另一个指令段名称,这里通过call指令调用(相关作用可看最后指令补充)如下图所示。若文件间调用,则需要其中一个文件调用另一个文件参数,这里就需要用到c语言中的关键字extern来指定所需调用的参数。从下方代码可看出,main数中,将3个数据存放在寄存器中,sum通过寄存器取值并赋予在新开辟的栈空间中。在汇编中,当一个指令段B调用指令段A的数据,是如何实现的呢?编写一段2个指令段之间数据调用的C代码。

2023-04-18 23:27:14 675

原创 C语言的Hello World的汇编剖析(64位 Intel架构)

第二种方式的操作非常耗时,但也不是抛弃这个方式,由于寄存器数量有限(和计算机的位数相关,如你的计算机是32位,则有32个寄存器),当通用寄存器耗尽时,就可采用此方式。​ 若将C文件转换为汇编文件,则需要编译器作为桥梁,这里使用gcc编译器,由于为只需编译成汇编文件,所以采用—S这个选项命令即可。Gcc编译器(若采用Linux虚拟机剖析,则自带无需下载)OS正在运行自身程序,突然来了C语言一段代码,调用它。下图截至intel手册Volume 3 6.4节。指令段之间的调用,若有参数传递时,则会有2种方式。

2023-04-18 15:53:42 610

原创 Mac M系列芯片 Parallels Desktop安装Ubuntu

PD安装Ubuntu

2023-02-06 22:09:31 11382 22

原创 Maven 安装及配置

maven

2022-09-20 09:56:57 233 2

原创 设计模式 - 状态模式

java - 状态模式

2022-09-13 16:43:52 315

原创 设计模式 - 模板方法模式

java - 模板方法模式

2022-08-31 16:28:30 296

原创 设计模式 - 策略模式

java - 策略模式

2022-08-31 16:23:33 731

原创 设计模式 - 观察者模式

java - 观察者模式

2022-08-29 16:18:21 286

原创 设计模式 - 无环访问者模式

java - 无环访问者模式

2022-08-26 09:52:45 604

空空如也

空空如也

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

TA关注的人

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