扇区 块 段 Page的关系
对于块/簇概念的理解,我们可以归结为一点:磁盘块/簇是虚拟出来的。块是操作系统中最小的逻辑存储单位,操作系统与磁盘打交道的最小单位是磁盘块。簇和块是一个相对概念,通俗的来讲,在Windows下如NTFS等文件系统中叫做簇;在Linux下如Ext4等文件系统中叫做块(block)。每个簇或者块可以包括2、4、8、16、32、64…2的n次方个扇区。
磁盘块存在的意义就是方便操作系统读取。传统意义上,由于扇区的数量比较小,数目众多在寻址时比较困难,所以操作系统就将相邻的扇区组合在一起,形成一个块,再对块进行整体的操作。看似懂了,但还是懵逼,好不容易理解了扇区的概念(扇区是磁盘的最小组成单元),又出来了块/簇,看了概念但还是似懂非懂。
磁盘块是个虚拟出来的概念,是操作系统中的。操作系统为什么要虚拟个这样的概念出来呢?操作系统与磁盘打交道的最小单位是磁盘块。操作系统操作磁盘,也需要通过磁盘驱动器进行。所以离不开扇区的。最小单位,好比我们生活中约定最小单位是一毛。扇区是真实的东西。磁盘驱动器操作磁盘数据,每次都按照扇为最小单位操作。簇也是操作系统弄出来的概念。读写基本单位是扇区。磁盘驱动器是按照这个单位操作磁盘数据的。又没特意指明操作系统读写磁盘的基本单位。文件系统就是操作系统的一部分,所以文件系统操作文件的最小单位是块。

块,听这个词语会明白,是抽象概念。真的有块形状的东西吗?是因为我们老喜欢叫磁盘块,磁盘块,这个块让我们以为磁盘的基本单位是块。当我们说块的时候,是从软件角度(即操作系统)来说的。因为我们编程大部分是在特定的操作系统上运行,与硬件打交道不用我们关注,交给操作系统去处理。本来操作系统的一个任务之一就是与硬件通信,控制各种硬件,由于操作系统以块为单位操作磁盘,于是,我们不会去提扇区,而是总说磁盘块。既然磁盘块是一个虚拟概念。是操作系统自己"杜撰"的。软件的概念,不是真实的。
所以大小由操作系统决定,操作系统可以配置一个块多大。一个块大小=一个扇区大小*2的n次方。N是可以修改的。顿时我思考:为什么磁盘块大小必须是扇区大小的整数倍呢?因为,磁盘驱动器,磁盘附带的硬件设备,与磁盘读写数据,操作系统也要靠它。它读取磁盘数据就是扇区的大小。一个扇区是512字节。
操作系统经常与内存和硬盘这两种存储设备进行通信,类似于“块”的概念,都需要一种虚拟的基本单位。所以,与内存操作,是虚拟一个页的概念来作为最小单位。与硬盘打交道,就是以块为最小单位。扇区: 硬盘的最小读写单元块/簇: 是操作系统针对硬盘读写的最小单元page: 是内存与操作系统之间操作的最小单元。
扇区,概念来自于早期磁盘,在硬盘、DVD中还有用,在Nand/SD中已经没意义了,
扇区是块设备本身的特性,大小一般为512的整数倍,因为历史原因很多时候都向前兼容定义为512,任何块设备硬件对数据处理的基本单位都是扇区。
硬盘的基本访问单位, SATA硬盘一般为512B;
任何块设备硬件对数据处理的基本单位。通常,1个扇区的大小为512byte。(对设备而言);
扇区是硬件被操作时软件使用的最小的操作单元。
就是一个扇区一个扇区进行操作(扇区的大小在存储设备生产时就设计好)。
是硬盘等存储设备传送单位,大小一般为512B
为了达到可接受的性能,硬盘和类似的设备快速传送几个相邻字节的数据。块设备的每次数据传输操作都是作用于一组称为扇区的相邻字节。大部分磁盘设备中,一个扇区的大小是512字节。
扇区和块的关系:
block由一个或多个sector组成,block是软件(OS、文件系统)中最小的操作单位;
操作系统的虚拟文件系统从硬件设备上读取一个block,实际为从硬件设备读取一个或多个sector。
block最终要映射到sector上,所以block的大小一般是sector的整数倍。
扇区是硬件设备传送数据的基本单位,而块是VFS和文件系统传送数据的基本单位;一个块对应磁盘上一个或多个相邻的扇区,而VFS系统将其看成是一个单一的数据单元。
文件和块的关系:
块的概念来自于文件系统;
对于文件管理来说,每个文件对应的多个block可能是不连续的;一个文件至少占用一个块;
Determining block size in an OS is a case of tradeoffs. Every file must occupy at least one block, even if the file is 0 bytes long, so there’s something for the file’s metadata to be attached to. Small block sizes are good when you need to store many small files. On the other hand, more blocks = more metadata, so you end up wasting a chunk of your storage system on overhead, tracking the location of all the files.
块是上层软件中(操作文件时)使用的最小的操作单元。
就是(操作文件时)一个块一个块进行操作(块的大小格式化时可以设置【如linux、fatfs等等】)。
块(block),概念来自于文件系统,是内核对文件系统数据处理的基本单位,大小为若干个扇区,常见有512B、1KB、4KB等
是VFS和文件系统的传送单位(所以相关设备也成为块设备),大小必须是2的幂,不能超过页的大小。
在Linux中,块的大小必须四2的幂,而不能超过一个页框,此外,它必须是扇区大小的整数倍,因为每个块必须包含整数个扇区。因此在80X86体系结构中,允许块的大小为512,1024,2048和4096字节。 块的大小不是唯一的。 每个块都需要自己的块缓冲区,它是内核用来存放块内容的RAM内存区。当内核从磁盘读出一个块时,就用从硬件设备所获得的值来填充相应的块缓冲区;同样当内核向磁盘写入一个块时,就用相关的块缓冲区的实际值来更新硬件设备上相应的一组相邻字节。
查看文件系统的块大小:
# tune2fs -l /dev/sda1 |grep "Block size"
Block size: 4096
dumpe2fs /dev/sda1 |grep "Block size"
Block size: 4096
指定文件系统的快大小:
# 格式化时指定
mkfs.ext3 -b 4096 /dev/sda5
概念来自于内核,是内核的内存管理中一个页或者部分页,由若干个连续为块组成。
由若干个相邻的块组成。是Linux内存管理机制中一个内存页或者内存页的一部分。
是一个内存页或内存页的一部分,它包含磁盘上物理相邻的几个数据块的内容,是块驱动的传送单位,大小不定(取决于通用块层,因为它把传送的数据下发给块驱动,而通用块还可以把几个段合并成物理段、硬件段(专门总线电路);同时也取决于用户所访问的大小。注意这里所指的段与内存中的段也有些联系,因为内存的段可能是一个对象/变量的大小;而用户程序也可能以变量/对象作为单位来访问设备。
磁盘的每个I/O操作就是在磁盘与一些RAM段缘之相互传送一些相邻扇区的内容。大多数情况下,吸盘控制器直接采用DMA方式进行数据传送。 在DMA方式下,块设备值需要向磁盘控制器发送一些适当的指令就可以触发一次数据传输;数据传输完成控制器就会发送一个中断通知块设备处理程序。 DMA传输方式分为两种,简单的DMA传送方式和分散聚集(scatter-gather)DMA传输方式 简单的DMA传输方式要求RAM中的内存单元必须是连续的。而scatter-gather使得磁盘可以与一些非连续的内存区相互传输数据。 为了使用scatter-gatherDMA传输方式,块设备驱动程序必须能够处理成为段的数据存储单元。一个段 就是一个内存页或内存页的一部分,它们包含一些相邻扇区中的数据。因此,一次分散聚集DMA操作可能同时传送几个段。 注意:块设备不需要知道块、块大小以及块缓冲区。 如果不同的段在RAM中的相应的页框正好是连续的并且在磁盘上相对应的扇区也是相邻的,那么通用块设备层可以合并它们。合并产生的更大的内存区就成为物理段。
概念来自于内核,是内核内存映射管理的基本单位。linux内核的页式内存映射名称来源于此。
在这里仅仅是把4096B的连续数据称为一个页。也可以指内存的数据组织单位(有些体系还在使用段,但是多数已经将段屏蔽了,即内部使用,而外部“看不见"),大小通常为4096B。但内存本身的访问/传送单位并不是页,这是取决于内存的编址方法,现在内存通常是按字节编址的,而甚至部分可以按位编址,所以内存的访问单位可以更小。
查看共享内存页大小:
root@rh6a_[/root]# getconf PAGESIZE
4096
