MySQL实现的一点总结(二)

数据目录:
Show variables like ‘datadir’;
数据目录下,用户创建的database对应一个同名的文件夹;
文件夹中有一个db.opt文件,包含db的一些属性,如字符集、比较规则等;
还有一个表名.frm文件,用来存储表结构(名称、列、数据类型、约束、索引等)
表空间:
对于InnoDB,有系统表空间和独立表空间(5.66之后):
系统表空间:ibdata,只有一份,12MB,自扩展,可自定义名称、个数、大小;
独立表空间:表名.ibd,存本表的数据;
可配置每张表使用系统还是独立表空间:alter table xx table space innodb_system/innodb_file_per_table;
对于MyIsAm:每个表分为xx.frm(结构文件)、xx.MYD(数据文件)、xx.MYI(索引文件)——相对应的,InnoDB中的数据是放在聚簇索引(主键)一起的;
文件名中的特殊字符映射成@+编码值,文件名和文件长度都受文件系统制约;
MySQL的系统数据库:mysql(记录账户、权限、存储过程、事件、日志等);
Information_schema(所有其他database信息:表、视图、触发器、列、索引等元数据);
Performance_schema(服务器状态信息、性能监控、执行语句所花时间、内存等);

在文件中的存储结构:
Fileheader结构(本页信息):
checksum、
offset(本页号)、
prev(上页号)、
next(下页号)、
LSN(日志号)、
type(页类型)、
space_id(表空间ID)、
flushLSN
数据页(索引页)根据上下页号形成双链表,用于在B树的同一层顺序查找;
MySQL以页(16K)为单位,每64页一个区(1M),每256个区一个组(256M);
分组可能只是为了便于管理,
比如第一组的前三个页面做特殊用途(第一页类型FSR_HDR,记录整个表空间的属性和本组所有区的属性;第二页类型IBUFF_BITMAP,是关于change buffer的;第三页类型INODE,用来存INODE Entry),
之后的每组前俩页面是特殊用途(第一页类型XDES,记录本组所有区的属性;第二页类型IBUFF_BITMAP);
分区是有实际作用的,每个区是物理上连续的64个页,目的是减少磁盘I/O,表示索引的B+树的所有非叶子节点构成一个段,所有叶子节点构成另一个段;即对于InnoDB的聚簇索引来说,会生成俩段,每个段以区为单位分配空间,——but这样对于小表来说很浪费,所以另外搞一个碎片区(全局):开始插数据的时候从碎片区以页为单位拿空间,,当某个段占用了32个碎片页之后,便有资格以区为单位拿空间(之前的碎片页并不会迁移到新的空间),——so,准确来讲,段是由一些碎片页(32)和一些完整的区构成的;
区类型(状态):空闲区(free)、有剩余碎片区(free_frag)、满碎片区(full_frag)、属于某个段的区(fseg);前三种不属于任何段,而直属于表空间(独立团),根据占用情况分成上面那三种类型;
XDES_Entry:记录一个区的一些属性
Segment ID:该区所属的段;
List node:包含prev page、prev offset、next page、next offset,即前后节点所在页号和偏移,从而形成双链;
State:有free、free_frag、full_frag、fseg四种状态(对应上面四种区类型);
Bitmap:表示本区的每个页面是否空闲(位图)
有了代表区的这个结构,就可以把区归类到不同的链表上:首先free、free_frag、full_frag这三种状态,通过list node连成三个链表,当段需要空间时,在只能要碎片页时就去free_frag链表头代表的区中拿页面,当此区没有空闲页时,就挂到full_frag链表上,当free_frag空了时,从free链表上取节点——怎么感觉free_frag只需要一个节点就够了,链表是啥情况?
当某段已经拿了32个碎片页后,开始为其分派完整的区(fseg状态)——应该是从free链表拿的?属于某段的区同样有free、not_full、full三种状态,做成三个链表——为啥会有free状态?即使有,一个节点也就够了吧,链表又是什么情况?
So,聚簇索引维护两个段,每个段维护3个链表。
Then,使用链表基节点list base node标识以上每一条链表(基节点包含length、first page&offset、last page&offset,即节点数和头尾指针),然后存在表空间的固定位置。

INODE Entry:表示段信息的结构——上面说过,第一组的第三页(类型INODE)用来存所有的INODE Entry
Segment ID:本段的ID;
Not full n used:not full 中已使用的页面数;
List node free、list node not full、list node full:段的三个区链表;
Magic number:本段是否初始化;
Fragment array:32个碎片页的页号
可见此结构主要管理了自己所拥有的页面。

### 回答1: 在STM32HAL中,串口中断接收不定度的数据可以通过以下方法实现。 首先,我们可以使用HAL中的`HAL_UART_Receive_IT`函数来启动串口接收中断,并设置接收缓冲区接收度。例如,可以使用以下代码初始化串口接收: ```c uint8_t RxBuffer[100]; // 接收缓冲区 uint16_t RxSize; // 接收度 // 启动串口接收中断 HAL_UART_Receive_IT(&huart1, RxBuffer, 1); ``` 接下来,在串口接收中断处理函数`USART1_IRQHandler`中,可以通过获取接收数据的度,并根据需求进行处理。例如,可以使用以下代码获取接收度和处理接收数据: ```c void USART1_IRQHandler(void) { // 判接收中断标志是否置位 if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET) { // 清除接收中断标志 __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE); // 接收数据 RxSize++; HAL_UART_Receive_IT(&huart1, &RxBuffer[RxSize], 1); // 处理接收数据 if (RxSize >= 10) { // 处理接收到的完整数据 // ... // 重置接收度和缓冲区 RxSize = 0; memset(RxBuffer, 0, sizeof(RxBuffer)); } } } ``` 在上述代码中,每次接收到一个字节的数据后,会增加接收度`RxSize`的值,并继续启动下一次接收中断。当接收度达到我们需要的度(例如10个字节)时,可以进行相应的处理逻辑,并重置接收度和缓冲区,以准备接收下一组数据。 通过以上方法,我们可以实现串口中断接收不定度的数据。根据不同的需求,可以灵活调整接收度和处理逻辑来适应具体的应用场景。 ### 回答2: STM32HAL是STMicroelectronics推出的一套针对STM32系列微控制器的硬件抽象层。在使用STM32HAL时,我们可以通过使用串口中断来实现串口的不定接收。 在串口中断接收不定度的数据时,我们首先需要初始化串口以及中断设置。通过配置串口的波特率、数据位、停止位、校验位等参数,可以保证串口的正常工作。同时,我们还需要配置NVIC(Nested Vectored Interrupt Controller)中断控制器,使得串口接收中断能够正确触发。 接下来,在串口接收中断服务函数中,我们可以通过检查USART接收缓冲区是否空来确定是否有数据接收。如果接收缓冲区空,则可以读取接收到的数据,并进行相应的处理。在不定接收的情况下,我们可以使用一个循环来不读取数据,并根据我们自己的协议或规则来判何时停止接收。 通常情况下,我们可以定义一个接收缓冲区数组,用于存储接收到的数据。在每次循环中,我们可以将接收到的数据存储到接收缓冲区中,并根据数据的特征来判何时停止接收,例如可以设置一个特定的结束标志。 一旦接收结束,我们就可以进行后续的数据处理,例如解析数据、执行相关操作等。需要注意的是,由于不定度数据的特性,在数据处理时应该对数据的有效性进行检查,避免错误操作或潜在的安全问题。 总的来说,通过使用STM32HAL的串口中断机制,我们可以实现串口的不定接收。通过正确配置串口和中断设置,合理处理接收中断服务函数中的数据读取和处理逻辑,我们可以很方便地实现与外部设备的可靠通信。 ### 回答3: STM32HAL中,通过使用串口中断可以实现不定度的串口接收。具体步骤如下: 1. 配置串口接收中断使能:通过调用`HAL_UART_Receive_IT()`函数,使能串口的中断接收功能。该函数会启动中断接收,并将接收到的数据存储到缓冲区中。 2. 在中断处理函数中读取数据:当接收到数据后,会触发串口接收中断,此时会自动进入中断处理函数。在该中断处理函数中,可以调用`HAL_UART_Receive_IT()`函数来读取接收到的数据。 3. 判数据接收完成:在中断处理函数中,可以通过判接收到的数据度来确定数据是否接收完成。一般可以通过判接收到的数据是否满足某一特定的结束标志。 4. 数据处理:当数据接收完成后,可以对接收到的数据进行相应的处理,比如解析数据,执行相应的操作等。 需要注意的是,在使用串口中断接收不定度数据时,需要事先确定好数据的传输格式和度,以便正确地进行接收和处理。同时,还需要配置接收缓冲区度,以确保能够容纳接收到的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值