|
  
- UID
- 859
- 帖子
- 309
- 积分
- 1209
- 现金
- 3063 圆
- 魅力
- 12 点
- 阅读权限
- 150
- 注册时间
- 2005-8-1
|
9#
发表于 2005-9-21 18:26
| 只看该作者
当虚拟文件系统根据需要计算出一个散列值时,VFS就将该散列值作为访问散列表的索引,从散列表中得到指向相应的索引节点队列的指针。如果在所指的队列中包含要查找的索引节点,则说明该索引节点包含在高速缓存中,然后将找到的索引节点的访问计数加1,表明又有一个进程在使用该索引节点。
否则,必须找到一个空闲的VFS索引节点,并且从底层的文件系统中读取该索引节点,然后把新的索引节点放到对应的散列队列中。
为了加速对常用目录的存取,VFS还提供一个目录高速缓存。当实际文件系统读取一个目录的时候,就把目录的详细信息添加到目录缓存中。下一次查找该目录时,系统就可以在目录缓存中找到此目录的有关信息。
目录缓存也采用散列表的方法进行管理。表中每一项都是一个指针,指向有相同散列值的目录缓存队列。散列值是利用文件系统所在设备的号码和目录名来计算的。由于高速缓存的容量不可能很大,所以在使用过程中需要对缓存中的目录进行替换。
VFS采用LRU算法(最近最少使用算法)来替换缓存中的目录项,其思想是把最近最不经常使用的目录项替换掉。其方法是VFS维护一个目录缓存链表,当第一次查找一个目录项时,该目录项就被放入目录缓存中,同时也加到第一层LRU链表的末尾。如果此时缓存已满,将替换LRU链表中最前面一个目录项,把它放入缓存中。
以后该目录项再次被存取时,它将被提升到第二层LRU链表的末尾。同样,若缓存已满,则替换该链表中最前面的目录项。这样一来,经常用到的目录项就不会出现在链表的前面,只有那些最近不常用的项才逐步移动到链表的开头,从而被替换掉。
7.数据块缓冲区
Linux系统采用多重缓冲技术,来平滑和加快文件信息从内存到磁盘的传输。当从盘上读数据时,如果数据已经在缓冲区中,则核心就直接从中读出,而不必从盘上读;仅当所需数据不在缓冲区中时,核心才把数据从盘上读到缓冲区,然后再由缓冲区读出。核心尽量想让数据在缓冲区停留较长时间,以减少磁盘I/O的次数。
在系统初启时,核心根据内存大小和系统性能要求分配若干缓冲区。一个缓冲区由两部分组成,即存放数据的缓冲区和一个缓冲控制块(又称缓冲首部 buffer_head,其中包含指向相应缓冲区的指针和记载缓冲区使用情况的信息)。缓冲区和缓冲控制块是一一对应的,系统是通过缓冲控制块来实现对缓冲区的管理。
所有处于“空闲”状态的buffer_head都链入自由链中,它只有一条。具有相同散列值(是由设备的标识符和数据块的块号生成的)的缓冲区组成一条散列队列,可以有多个散列队列。每个缓冲区总是存在于一个散列队列中,但其位置是动态可变的。每个队列都被一个指针所指示,这些指针构成一个散列表,其形式与图5相似。
当进程想从物理块设备上读取数据块或打算把数据块写到物理块设备上时,核心要查看该数据块是否已在缓冲池中,如果未在,则为该块分配一个空闲的缓冲区。当核心用完缓冲区后,要把它释放,链入自由链。对数据块缓冲区的管理也采用LRU算法。 |
|