新博客http://www.cnblogs.com/zhjh256 欢迎访问
分类: Oracle
2007-12-25 11:25:22
由于缓冲读不确保原子性,因此OS需要文件系统读/写锁确保正在读的文件系统缓冲不会被改变。否则将会返回不一致性的数据。
文件系统读/写锁是一个POSIX请求。在UNIX下称为inode locks,这就是LOCK应用的地方,在Windows NT/2000,则通过在FCB上的ERESOURCE锁实现。这些锁允许并行度,但是排斥写。他们在所有的文件访问中被使用,因为OS不会假设并行读/写不会映射到相同的缓冲。这意味着并行度和写必须进行争夺。
如,一些Oracle进程正在某个特定文件的读过程中,DBWn必须等待所有这些读完成,然后才能得到文件系统读/写锁以写入文件。即使读写文件的不同部分,也是如此。一旦DBWn得到锁,所有的读也必须等待DBWn完成。类似的,如果一个进程正在执行一个直接写到临时表空间数据文件,那么没有进程可以并行读取或写入文件的其他分区,虽然他们的活动完全没有关系。
虽然逻辑上只有缓冲i/o会这样,但是读写锁在直接IO上也会产生。理由是如果设备块边界分配请求不能满足,直接IO请求可能需要通过缓冲IO执行。否则,必须使用裸文件或者更快的IO才能避免读/写锁。