|
哦,对了,忘记说说latch结构了,知其然,还要知其所以然。一般来说,latch由三种内存元素组成:pid(进程id),内存地址和内存长度。当然,在同一时刻只允许一个进程修改latch和lock它们本身的数据结构是必须的。对latches来说这是简单的。因为每一个latch仅仅有一个内存位置,不象lock还有很多模式信息,获取了latch,就获取了latch对应的内存资源。Oracle能用硬件下原子指令设置如TEST,SET,LOAD,CLEAR,COMPARE和SWAP来对latch结构进行操作。也就是通过基本的原子操作对LATCH结构进行操作,就可以完成获取和释放功能。因为这是简单的保证原子的机器指令,没有其他锁结构被需要,所以latch的操作是很高效率的。Oracle锁的数据结构,有几部分,所以不能被自动修改。由于这种原因,Oracle用latches保护在锁上的操作。这种latch多样化的使用依靠锁的类型。
例如, the library cache locks间接的被the library cache latches保护。
the cache buffer locks间接的被the cache buffers chains latches保护。
the row cache enqueue locks被the row cache objects latch保护。
因为latches是很有效的,所以比起lock和latch组合,Oracle宁愿用一个latch来保护那些间歇的、暂时的数据结构。像library cache,需要latch和lock,pin进行组合来保护,如果latch不可用,那么将记录latch释放失败。
|
|