標簽:com style strong tab 服務器 不同的 管理 ble line table margin
在oracle中爲了保護共享資源,使用了兩種不同的鎖機制lock和latch,這兩種鎖有明顯不同點:
1,lock和pin,采用的是队列的方式,先来先服务的策略,latch和mutex,采用的是抢占的方式,fast
fail模式
2,lock可以hold的時間比較長,而latch時間會非常的短
3,lock主要用戶鎖定對象,面向用戶,latch主要鎖定的是內存,面向系統
理解這兩種鎖的設計思想,可以應用在實際的生産過程中,首先:
1,這兩種鎖的粒度不同,一個粒度粗,一個粒度細
2,根據不同的場景,設計適合場景的鎖機制
因爲latch保護的內存中的數據,而數據的組織oracle使用了多種方式:
主要使用固定長度的對象的集合,這樣可以直接定位到任意對象的地址,在空間的分配上,
可以一次分配定長或者遞增長度的chunk。
这里可以是单向的链表,或者双向的链表,linked list是比较常用的结构,比如index中的leaf block。
linked
list可以组织成FIFO的队列,也可以组织成LIFO的堆栈。
B數數據結構,是oracle在index中使用的方式,查找的效率和數的高度有關。\
在数据量比较小的时候,可以使用array或者linked List,但是,当数据量比较大的时候,查找的时间效率上,hash
table会更有效率,时间复杂度是O(1)。
在對目前常用的數據結構中,對于查詢而言,有三種方式效率比較高:
1,二分查找
這需要數據時有序的,
2,B
树查找
在大並發的修改情況下,會有瓶頸
3,hash表
查找的效率是O(1),比較適合大並發的修改情況下使用
所以,在oracle中,对大量小的内存空间的并发管理上,通常使用hash
table数据结构。
hash的主要思想是:
設定一個固定的數量的bucket(通常是2的冪次方),然後對對象應用hash函數,映射到其中的一個bucket當中。
但bucket的數量,hash算法等會影響到管理和使用的開銷。
這裏有幾個原則:
1,不同的對象可能映射到同一個bucket中
2,同一個bucket中不能有太多的對象
3,hash算法盡量要是對象分布均衡
对于每一个bucket中,多个对象使用linked list进行组合,例如library cache中的对象,包括两个结构,
hash
bucket,hash chain。
這裏對oracle的阻塞的概念做一個解釋:
1,多版本一致,讀寫互不阻塞
这是对用户而言,在data
level,在使用oracle时,访问和修改数据可以做到,读读不阻塞,读写不阻塞,写写阻塞,因为oracle使用undo机制实现了多版本一致性
2,內存結構,互相阻塞
对于oracle的内存结构,在raw
memory
level,使用latch的方式,写是独占锁,读是共享锁,实现了读读不阻塞,读写阻塞,写写阻塞的方式。所以对于latch而言,获取和释放latch的速度要非常快,以减少更改内存结构的过程中,对读的阻塞。
所以,通常的应用设计过程中,第一种更多是对热点数据的修改争用,造成的enqueue,相比较而言,对应用服務器的可扩展性和并发能力产生很大的影响,而第二种可能是应用设计的不合理,而latch对oracle數據庫系统的并发能力和可扩展性的影响更大,因为其不能做到读写互不阻塞,并发能力大大减弱。
1,本質:
latch的本質其實是信號量,使用內存的一個地址進行存儲,並對信號量進行一系列的原子操作。在多用戶系統下,原子操作意味著其不會被進程的調度所中斷,
在原子操作的生命周期會完全占有cpu,在多cpu的架構上,通過獨占內存總線來實現原子操作。
在oracle中,latch分爲exclusive和shared模式,在reader和write的邏輯處理上,有兩種模型:
1,check and
change
首先writer去check信號量的值,發現爲zero,就去修改,然後就相當于獲得了latch,就可以修改latch所保護的對象了。這裏包含了兩個操作,一個是check,
一個是change,當處在多線程處理中,或者多cpu架構中,就會破壞一致性。
2,compare and
swap
設置一個flag,使用寄存器保存信號量的值,當flag沒有被設置的時候,writer設置flag,這時開始阻塞了reader再去更改信號量,writer開始不停的compare兩個,
当值相等的时候,即reader已经释放完shared
latch的时候,writer就可以独占latch了。
當session獲取latch的過程中,如果重試,在重試一定次數的時候,進入sleep,這時並不像enqueue一樣,會有FIFO管理隊列來管理阻塞的情況,直到被喚醒。
而因为获取latch而sleep的session会被os
offline cpu的运行队列中,进入wait list。然后会被被唤醒重试。
这里主要是两个方面,latch的数量和latch获得的時間:
1. latch数量:这里是一个平衡点,latch数量少,你们一个latch管理的恭喜主要就比较多,会产生严重的争用,但当为每一个恭喜主要分配一个latch的时候,系统管理latch的开销又会大幅升高。所以针对library cache中hash bucket,oracle通常设置了cpu_count个latch来管理,在oracle 11g中,采用了mutexes来替代latch来管理部分latch,即针对每一个object分配一个mutex,这样大大减少了争用。
2. latch時間:latch hold的时候尽可能的要短,减少争用。
Oracle core06_latch&lock,布布扣,bubuko.com
標簽:com style strong tab 服務器 不同的 管理 ble line table margin
原文地址:http://www.cnblogs.com/xpchild/p/3695159.html