硬盘最底层的读写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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)