一个常规文件一般位于一个块设备上,而块设备也是一个文件,只不过它是一个特殊文件罢了,unix的著名的一切皆文件的原则使得用户拥有了一个一致的操作视图,一切皆文件的设计初衷我想是这样的:在操作系统刚开始被开发出来以后,操作系统本身代表的就是机器的抽象,人们使用机器的目的是为了得到信息,包括已经存在的信息或者老信息经过加工得到的新信息,于是有必要将信息的载体以一种统一的视图呈现给用户,然后用户可以用一种统一的方式操作它们,这样用户就可以用一样的操作方式得到不同的信息,也就不会迷失于繁杂的操作细节上了,实质上信息的载体基本就是外设,比如磁盘,磁带,网络等等,cpu,内存本身只是加工信息所需要的,因此unix抽象出了块设备和字符设备,常规文件是更高一层意义上的信息载体,那是文件系统出现以后的事情,即便现在,有些大型数据库还是将数据直接存储于块设备上。理解了这些之后,我们发现块特殊文件倒是理所当然了,而常规文件倒是有些特殊了,是的,正是这样。不管怎么说,常规文件只是更高层意义上的信息抽象,用户按照文件系统的细节可以更加灵活的排布文件的布局,对于某些特殊的应用,这种文件系统的方式可以使磁盘的使用更加高效或者更加容易加速特殊的应用而不至于让信息的读取成为瓶颈,常规文件既然在块文件上,那么虽然两个文件可能会有数据重叠的部分但仍然会有两份mapping,因为它们不是一个层次的,没有必要用一个mapping,file的io会有很多形式,比如direct IO,bdev没有必要负责file的cache,如果bdev中缓存所有的file的cache的话,同步起来会很低效的,考虑一个direct IO,本身它的意思就是直接写盘/读盘的,可是bdev却缓存了该file的数据页面,它就必须应对这种情况从而不使用bdev的cache,然后还要刷新bdev对应该文件的cacahe,bdev对于mapping逻辑来讲是线性的,一个一个页面的,而对于文件系统来说却对于不同的文件系统有着不同的实现,要按照本文件系统的超级块以及元数据才能找到一个特定的文件,逻辑将非常的复杂,再说根本没有必要为不是一个层次的逻辑使用相同的cache。我说一下我的想法,刚才好像没有说清楚,一个文件对应的file cache和文件偏移是个线性关系,就是说在radix树中只要有数据在文件的偏移就可以找到对应的cache页面,而如果file的cache和 bdev的共享了,那么要处理的问题就是给定一个file的任意偏移就要快速的在bdev中找到对应的页面,首先一点该file在bdev中的位置就不好确定,需要读取大量的元数据或许对于不同的文件系统有的还要大量的间接寻址,这样会导致大量的IO,时间大量消耗掉,如此的cache还有意义吗?可能比不用cache还要慢吧,如果说将所有的元数据放入内存,那么将消耗大量的空间,值得吗?综上,第一,不同层次的不必公用一个cache;第二,不能为cahce而陷入时间或者空间的泥潭。一个常规文件一般位于一个块设备上,而块设备也是一个文件,只不过它是一个特殊文件罢了,unix的