Long Story of Block - 1 Data Unit

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
简介: 计算、存储、网络构成了云计算的基本组件。Linux 中的 IO 栈主要分为 Filesystem 与 Block 两层,前者包括 VFS 与各种类型的文件系统(包括 Ext4、XFS 等),描述了数据的组织形式、提供管理数据的接口;而后者包括通用块层 (generic block layer) 与各种类型的块设备驱动(包括 SCSI、NVMe、Virtio 等),主要实现了数据在非易失性存储(HD

计算、存储、网络构成了云计算的基本组件。Linux 中的 IO 栈主要分为 Filesystem 与 Block 两层,前者包括 VFS 与各种类型的文件系统(包括 Ext4、XFS 等),描述了数据的组织形式、提供管理数据的接口;而后者包括通用块层 (generic block layer) 与各种类型的块设备驱动(包括 SCSI、NVMe、Virtio 等),主要实现了数据在非易失性存储(HDD、SSD)中的存储。

本系列主要讨论 Block 层,如有涉及到代码内核版本为 4.19。献祭一张 IO 栈的架构图。

IO_stack.jpg

从文件系统到设备驱动, IO 栈的路径比较长,这一路径中的各个层级会采用不同的数据传输单元,理解这些数据传输单元对理解整个 IO 栈具有重要作用。本文就主要介绍 IO 栈中的各种数据单元。

sector

hardware disk controller 和 block device driver 都使用 sector 对块设备的地址空间进行寻址

sector 的概念最早源于 HDD 磁盘,后来的 SSD 设备也沿用这一概念,sector 的大小固定为 512 bytes

221fb94ec76e8024964a665c11c1342f.jpg

block

文件系统使用 block 对块设备的地址空间进行寻址,block 的大小是文件系统初始化的时候配置的,例如 mkfs.ext4 的时候可以配置 ext4 文件系统的 block size,ext4 中 block size 可以在 1K ~ 64K 范围内以 2 倍递增,因而一个 block 可以包含多个 sector

6795ce24e9e069b560b6faea5dda8e5f.jpg

文件系统会使用内存对磁盘上的 block 进行缓存,这一部分用于缓存 block 的内存就称为 block buffer

block size 不能超过 page frame size,否则就无法使用 block buffer 特性

以下描述内存中的 block buffer 与磁盘上的 block 之间的映射关系

  • 如果 page frame size == block size,那么一个 page frame 中只能容纳一个 block buffer,此时一个 page frame 只能缓存一个 block
  • 如果 page frame size > block size,那么一个 page frame 中可以容纳多个 block buffer,一个 page frame 中缓存的多个 block 不一定连续

8c45d0cec3cded1e6d870a7fde7c4dc9.jpg

segment

hardware disk controller 和 block device driver 还有 segment 的概念

segment 的概念实际来自 DMA controller,DMA controller 可以实现一段内存物理地址区间与一段设备物理地址区间之间的数据拷贝,segment 就描述 DMA 数据传输过程中的一段连续的内存空间,也就是说 DMA controller 可以将内存中一个 segment 中的数据拷贝到设备,或将设备中的数据拷贝到 segment 中

disk controller 正是使用 DMA 来实现内存和磁盘之间的数据传输,老式的控制器只能支持 adjacent disk sectors 与 continuous physical memory 之间的 DMA 映射,而新式的磁盘控制器支持 scatter-gather DMA 特性,即支持 adjacent disk sectors 与多个 discontinuous physical memory 之间的 DMA 映射,此时将每一段 continuous physical memory 区间都称为一个 segment

segment 可以是一个 page,也可以是一个 page 的其中一部分,通常存储一个或多个相邻的 sector 的数据

一次 scatter-gather DMA transfer 实际上就包含一个或多个 segment

bb29b9a7e0c3421687fa1758ef3b4867.jpg
相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
存储 内存技术
Long Story of Block - segment
## segment segment 的概念实际来自 DMA controller,DMA controller 可以实现一段内存物理地址区间与一段设备物理地址区间之间的数据拷贝,segment 就描述 DMA 数据传输过程中的一段连续的内存空间,也就是说 DMA controller 可以将内存中一个 segment 中的数据拷贝到设备,或将设备中的数据拷贝到 segment 中 s
771 1
Long Story of Block - segment
|
存储 固态存储 内存技术
Long Story of Block - DISCARD
## Concept ### introduction to DISCARD DISCARD 的概念其实来自 SSD 设备。我们知道由于 flash 存储介质的特性,SSD 设备中的一个 block 只支持 write、erase 操作,而不支持 overwrite 操作。对于一个已经被 write 过的 block,如果需要向这个 block 写入新的数据,就必须先对该 block
1524 1
|
2月前
|
JSON JavaScript 前端开发
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
45 0
|
2月前
|
编译器 C语言
c语言中long的作用类型
c语言中long的作用类型
35 0
|
7月前
|
Java
【面试题精讲】Java超过long类型的数据如何表示
【面试题精讲】Java超过long类型的数据如何表示
|
2月前
|
存储
TS 自定义结构Long与number类型相互转换
TS 自定义结构Long与number类型相互转换
|
3月前
|
Oracle 关系型数据库 数据库
Flink Sink to Oracle 存在字段CLOB类型,如何处理错误”ORA-01461: 仅能绑定要插入LONG的LONG值“
做Flink CDC同步数据过程中,目标是Oracle数据库,其中某个字段较大被设置为CLOB类型,其中会遇到异常,”ORA-01461: 仅能绑定要插入LONG的LONG值“
|
4月前
|
存储 前端开发 JavaScript
由Long类型引发的生产事故
由Long类型引发的生产事故
|
4月前
|
缓存
Long包装类型的享元模式注意事项
昨天修复订单接口的bug
31 0
|
4月前
|
存储 自然语言处理 安全
【C++11保姆级教程】空指针(nullptr),long long类型,char16_t和char32_t类型
【C++11保姆级教程】空指针(nullptr),long long类型,char16_t和char32_t类型
【C++11保姆级教程】空指针(nullptr),long long类型,char16_t和char32_t类型