Thursday, March 24, 2011

UNIX文件系统Cache机制

UNIX利用Cache来提高文件访问的速度,几乎无处不在,应当在使用中引起我们的注意,或许,你测量的机器性能就包括Cache的贡献呢!
UNIX把文件划分为一个个数据块,每一个数据块叫做一个Block。内核为每一个Block创建了唯一的一个buffer与之对应。
Buffer被内核按照数据块的编号散列在一个Hash表中,通过该Hash表,内核可以快速查找用户程序所需要的block。
处于空闲、busy、delayed to write状态的block除了会被放在hash表中,还会被放在一个叫做free block list的链表中,以便于程序方便的get和put block buffer。
当用户程序读取一个block时,首先会去hash表中查找该block是否已经有buffer,如果有,则直接从该buffer中读取数据。此时,减少了一次从物理硬盘中读取数据的操作,从而提高了速度。当该数据不在buffer中,则从free buffer list中获取一个buffer,然后调用硬盘驱动程序从物理硬盘中读取数据,填充到buffer中,供前述的用户程序读取。
在写入时,用户数据先写入到buffer中。然后有三种可能:被同步写入物理硬盘,被异步写入物理硬盘,被延迟写入。前两者大家已经比较熟悉,延迟写入针对的是不就之后就有新的用户程序改写这块block的数据的情况,则减少相应的物理硬盘写入次数,从而提高速度。
block buffer在被使用(读取、写入)之后,会被置于free buffer list中。内容并不会被立刻清除。如果新的访问操作正好命中一个被释放的block,则从里面直接取出。否则,则按照last recently accessed (FIFO)的策略取出一个free buffer并访问它。

No comments:

Post a Comment