磁盘block和文件系统block

磁盘block和文件系统block,第1张

摘取自骏马金龙的 第4章ext文件系统机制原理剖析

硬盘最底层的读写IO一次是一个扇区512字节 ,如果要读写大量文件,以扇区为单位肯定很慢很消耗性能,所以硬盘使用了一个称作 逻辑块 的概念。逻辑块是逻辑的,由 磁盘驱动器负责维护和 *** 作 ,它并非像扇区一样物理划分的。 一个逻辑帆陆块的大小可能包含一个或多个扇区 , 每个逻辑块都有唯一的地址,称为LBA 。有了逻辑块之后, 磁盘控制器对数据的 *** 作就以逻辑块为单位 ,一次读写一个逻辑块,磁盘控制器知道如何将逻辑块翻译成对应的扇区并读写数据。

Linux *** 作系统层次,通过 文件系统提供了一个也称为块的读写单态昌顷元 ,文件系统数据块的大小一般为1024bytes(1K)或2048bytes(2K)或4096bytes(4K)。 文件系统数据块 也是逻辑概念,是 文件系统层次 维护的,而 磁盘上的逻辑数据块 是由 磁盘控制器 维护的,文件系统的IO管理器知道如何将它的数据块翻译成磁盘控制器维护的数据块地址LBA。

对于使用文件系统的IO *** 作来说,比如读写文件,这些IO的基本单元是文件系统上的数据块,一次读写一个文件系统数据块。比如需要读一个或多个块时,文件系统的IO管理器首先计算这些文件系统块对应在哪些磁盘数据块,也就是计算出LBA,然后通知磁盘控制器要读取迅旁哪些块的数据,硬盘控制器将这些块翻译成扇区地址,然后从扇区中读取数据,再通过硬盘控制器将这些扇区数据重组写入到内存中去。

文件系统block的出现使得在文件系统层面上读写性能大大提高,也大量减少了碎片。但是它的副作用是可能造成空间浪费。由于文件系统以block为读写单元,即使存储的文件只有1K大小也将占用一个block,剩余的空间完全是浪费的。在某些业务需求下可能大量存储小文件,这会浪费大量的空间。

尽管有缺点,但是其优点足够明显,在当下硬盘容量廉价且追求性能的时代,使用block是一定的。

#include <stdio.h>

#include <string.h>

int main()

{

char s[4]="abc",sc='d'//比册渣较的字符串和字符

FILE *fp

char filename[100],c

int i=0,n1=0,n2=0

long fpos,len

printf("input filename:\n")

gets(filename)//输入文件名称

if((fp=fopen(filename,"r"))==NULL)//打开文件

{

printf("open %s error!\n",filename)

return 1

}

len=strlen(s)

c=fgetc(fp)

while(!feof(fp))

{

if(c==s[0])//如果第一个字符相等,比较剩下的字符串

{

fpos=ftell(fp)//记住当前文件指针位置

for(i=1i<leni++)

{

if(fgetc(fp)!=s[i])//如果不匹配,跳出循环

{

fseek(fp,fpos,0)//重新设置指针位置激告

break

}

}

if(i==len)//如果匹配成功,累加数目

n1++

}

if(c==sc)//与字符sc匹配,累加数目

n2++

c=fgetc(fp)

}

printf("\n与字符串%s匹配的有州铅悄%d个\n",s,n1)//输出匹配个数

printf("与字符%c匹配的有%d个\n",sc,n2)

getchar()

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12323332.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存