0xAA55 发表于 2015-6-29 18:35:00

【科普】操作系统与文件

注:本文并不介绍有关文件系统的细节。本文只是一个简单的科普文。
原文:http://www.0xaa55.com/forum.php?mod=viewthread&tid=1399
转载请注明出处。

现在几乎所有的操作系统都有各种操作文件的功能——打开文件,读取文件,写入文件,删除文件,移动文件,复制文件等。并且,这些功能也作为操作系统理应提供的API供用户程序使用。
那么这些东西内部是怎么一回事儿呢?
首先看一张图。

这个是硬件层面上的关系。。总之存储器连接到电脑的主板,然后主板的控制器可以接收CPU发送的命令去控制这些存储器。
接下来就是软件方面的关系了。

这样的文字显得有点太认真了。。那么我就给大家讲个比较通俗易懂的。

首先,我们把存储器看成是本子。一本全新的本子,上面有格子,每个格子里都可以写字。无论这个本子是便签本、小楷本还是画画用的美术本,它总之都是能让你写字在上面的。(硬盘、U盘等各种“盘”,都是“本子”)
而存储器驱动,我们可以把它看成笔。通常都是可擦除的铅笔,当然也有光盘这样的“钢笔”。
然后往存储器里写入数据,相当于往本子上的格子里写字(没有格子的本子可以“低级格式化”一下,给它划上格子。这相当于尚未出厂的机械硬盘)。
而如果你写的那个格子里正好有之前写过的字的话,你会把它擦掉,然后重新写新的字。(光盘通常不能擦除,这相当于“钢笔字”而非“铅笔字”)

但是光给你一个本子,让你在里面记录几篇随时都可能改变的文章,你应该怎么记录呢?
要记录的文章,不仅内容随时都有可能改变,更重要的是它的长度也可能发生变化(字数的增减等)。而你又必须高效率地让这几个文章同时存在于一个本子上。这个时候,负责组织存储方式的一个驱动程序就叫“文件系统驱动”。

所谓文件系统驱动,就是组织好“文章”并且将其一并写入“本子”的驱动程序。其中FAT文件系统,就是在“本子”的前几页记录这些“文章”的存储位置的分布,以及“文章目录”的位置。后面就是“文章正文”了。不过一篇“文章”可能并不是连续记录的,中间可能会插入一些别的“文章”的内容。不过这个FAT格式的“本子”的前几页已经记录了所有的文件的分布情况(即所谓FAT表),所以你只需要不断翻回去看,就知道怎样完整阅读一篇文章了。

为什么这样呢?因为“文章1”被存储的时候,后面又存储了“文章2”。然后“文章1”又要添加新的内容了,但是后面紧跟着一个“文章2”。所以新的内容就被放到了“文章2”的后面了。这样的话,“文章1”的碎片化就产生了。每次你要完整阅读“文章1”的时候你都要一边读,一边翻看前面的FAT表来确定“文章1”下一个部分在哪里。于是效率就降低了。“清理磁盘碎片”这个功能,就是将所有的“文章”都重新排列一下——把它们读取出来,然后擦掉旧内容,再把它们连续地一篇篇记录到“本子”上。

假设你在往硬盘里写入数据的时候,你的电脑断电了。这相当于你在往“本子”上写字的时候,你“晕过去”了。醒来的时候,可以看到“本子”上,之前正在写的那个“文章”并没有写完。后面的字迹可能都看不清了。这就是“文件损坏”。

我刚才举的那段例子中,“本子”指“存储器”,而记录“文章”的方式,就是“文件系统格式”,比如FAT(就像我说的那样,它其实是在存储器的扇区里依次存储了“FAT表”,文件目录表,以及文件的内容。)以及相对于FAT更安全的NTFS文件系统(恕笔者无知,我对NTFS并没有什么了解,我只知道这东西很安全,但是通常只有Windows知道它的内容是怎么组织的。)当用户程序需要打开一个文件的时候,它其实借助了文件系统驱动。文件系统驱动帮用户程序组织文件的存储方式,而文件系统驱动也需要依靠存储器驱动的帮助来访问存储器。用户程序,假设是C语言,只需要调用fopen就能打开一个文件或者创建一个空的文件,然后调用fread来读取文件,或者调用fwrite写内容到文件里。完事儿以后,调用fclose告诉操作系统“我写好了”或者“我读好了”。

小鹿乖乖 发表于 2015-6-29 19:57:33

解释得好好。。看懂了
页: [1]
查看完整版本: 【科普】操作系统与文件