qt 用文件存多个账号密码应该怎样提取_本地文件系统小记(一):扇区和块

简单来说,扇区是对硬盘而言,块是对文件系统而言

扇区:硬盘的最小单位就是扇区,是真实存在的。一般大小是512字节,这个大小是在硬盘出厂时设置,不能修改。

块:也称为逻辑块,是文件系统层面的概念。文件系统不是一个扇区一个扇区的来读数据,太慢了,它是一个块一个块的读取数据,就是说块(block)是文件系统存取数据的最小单位,一般大小是4KB(这个值可以修改,在格式化分区的时候修改)。

读取一个块,实际上是从硬件设备读取一个或多个扇区,一个block只能存放一个文件内容,无论这个文件有多小。一个文件可能会占用多个block,每读取一个block就会消耗一次磁盘io。如果要提升磁盘io性能,那么尽可能一次io读取更多的数据,但是block也不是越大越好,需要结合业务来设置。

例如:block设置为4K,那么创建大量的1K小文件后,磁盘空间会被大量浪费。一个文件占用一个block,100G的小文件(都是1K大小),那么会占用400G的空间,浪费300G,可以做个实验验证下:

  • 分配一个100M的磁盘,然后格式化成ext4文件系统,block size默认为1K,并挂载
mkfs.ext4 /dev/sdj
mount /dev/sdj /mnt/test3

在往/mnt/test3目录下创建20480个1k的小文件前后,分别统计下df命令输出的结果如下

401669cebfb49715c8309c1b9711630d.png
创建20480个1k的小文件前后,blocks已用的个数对比

在实际操作中出现几个疑点:虽然这不是这个实验的重点,但还是先记录下来,后续研究

  1. 空的分区中,有1550个block已用,这些block存的是什么数据?
  2. 总个数95054 != 已用个数1550 + 可用个数86336,why?但是xfs文件系统中,是相等的。
  3. 20480个1K的文件,应该会占用20480个block,但是20480 != 22446 - 1550,多出来的416个block存的是什么数据?

抛开这三个疑点,可以看到当block为1K时,创建20480个1K的文件,基本上就占用了20480个block。占用的容量大概20M,空间没有浪费。再做一个对比实验

  • 分配一个100M的磁盘,然后格式化成ext4文件系统,block size设置为4K,并挂载
mkfs.ext4 -b 4096 /dev/sdk
mount /dev/sdk /mnt/test4

在往/mnt/test3目录下创建20480个1k的小文件前后,分别统计下df命令输出的结果如下

e50a200bf99e63c31c2ce848e43088ca.png
创建20480个1k的小文件前后,blocks已用的个数对比

可以看到已用的blocks个数82444/4 = 20611个,这里面有20480个是存的是20480个1K的小文件,但是由于每个block的大小为4K,所以占用空间大概80M,而20480个1K的文件只有20M,所以相当于浪费60M。

简言之:如果不想浪费空间,block设置为1K。但当文件都是1000K大小时,又过于消耗磁盘io(1000K的文件,block为4K时占用250个block,block为1K时占用1000个block,分别消耗磁盘io为250次和1000次)。所以具体业务场景得设置不同的block会好一点,大文件多(比如都是视频文件)时,block设置大一点,小文件多(比如小说TXT文件)时,block设置小一点。

通常,一个文件系统占用的多个block在磁盘上是不连续存储的,因为如果连续存储,则经过频繁的删除、建立、移动文件等操作,最后磁盘上将形成大量的空洞,很快磁盘上将无空间可用。因此,必须提供一种方法将一个文件占用的多个block映射到对应的非连续存储的扇区上,文件系统是用索引节点解决这个问题的。文件系统怎样从文件名索引到存放文件内容的block区的,这些将在下一节讲到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值