国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

關于Freelists和Freelist Groups的研究(修訂版)- 有多少種free list

2024-07-21 02:05:33
字體:
來源:轉載
供稿:網友


四.             有多少種free list1.  master free list或者segment free list簡稱為mfl,在segment被創建的時候自動生成的,如果我們在創建segment時沒有指定freelists參數,或者指定freelists=1,都是生成這個mfl。mfl對于每個segment來說有且只有一個(如果指定freelists>1,產生的就是不是mfl,這一點將在process free list部分解釋)。mfl相當于一個空閑空間池,當一個segment被創建時的初始化block以及以后動態分配的新block都鏈接到mfl中,這個池中的所有空閑塊是被所有進程共享的,對于該segment有insert操作的所有進程都可能會去讀取這個free list,這樣當有多個進程要同時insert數據時,就可能出現在mfl上的爭用(mfl在一個時間只能允許一個進程取得空閑塊,當然,其實進程從mfl上讀取空閑塊的操作并不是簡單地需要多少就取多少,取得以后就直接向塊中插入數據,實際上的過程要更復雜一些,這個過程在“進程請求空閑塊的過程”部分會有詳細描述)。由此,推出了freelist groups的概念,設置freelist groups參數大于1就是設置了多個mfl,這樣就緩解了對于mfl的爭用。有關freelist groups更詳細的內容在“super master free list”部分會有描述。 2. process free list如果進程必須直接從mfl中讀取空閑塊,那么對于mfl的爭用由freelist groups參數解決(設置多個mfl),但是顯然還有另外一個思路就是盡量不讓進程去直接讀取mfl,沒有需求自然就無所謂爭用。由此引入了另外一個級別的free list,這就是process free list,簡稱為pfl。當我們指定存儲參數freelists>1的時候,生成的就是pfl。我們前面說過mfl是在segment被創建的時候自動生成的,所以無論是不是有pfl,對于每個segment來說都仍然存在1個mfl。也就是如果我們定義freelists等于2的話,那么在segment header block中將總共存在3個freelist,其中1個是mfl,另外2個是pfl。這一點我們同樣可以通過dump轉儲信息來驗證。seg lst:: flg: unused lhd: 0x00000000 ltl: 0x00000000 seg lst:: flg: unused lhd: 0x00000000 ltl: 0x00000000 seg lst:: flg: used   lhd: 0x01c0008b ltl: 0x01c0008b 后面兩個free list既是pfl,而前面一個則是mfl。顧名思義,既然命名為process free list,那么顯然位于這個級別的free list中的空閑塊只能被一個進程讀取。想象一下,如果當前系統對于某張表最多同時會有10個進程同時作insert操作,那么我們設置freelists=10,將能盡量滿足每個進程都能夠使用專屬于自己的free list,無疑通過這樣的手段我們緩解了free list的爭用。一個進程到底會使用哪個pfl,oracle內部的算法是:(p % nfl) + 1其中p表示dml操作進程的process id,可以從v$process.pid字段中取得。nfl表示freelists存儲參數定義的pfl數量。可能會有疑問,如果是這樣,多個mfl有存在的必要嗎?我們只需要設置多個pfl不就可以了嗎?然而事實并非如此,不過請稍安毋躁,在后面講解“進程請求空閑塊的過程”中會解釋這個問題。 3. transaction free list在oracle中事務(transaction)是一個重要的概念,每次dml操作,事務的開始都是自動的,而我們可以通過commit或者rollback來標志一個事務的結束。一個進程(或者說一個用戶會話)有自己的pfl,然后一個進程可能會執行很多的事務,于是又出現了這個級別的free list,這就是transaction free list,簡稱為tfl。tfl是動態產生的,只有當dml語句(比如delete或者update)使block占用量降到pctused參數指定值之下時才會生成tfl,一個tfl只屬于一個事務,而一個事務也只會有一個tfl,一個事務沒有提交之前,此事務的tfl上的空閑塊不會被其它事務使用。但是可以立刻被本事務使用(此時這些空閑塊被稱為previously freed blocks)。每個segment最少可以有16個tfl,同時只要有需求就會動態增加tfl數量,除非達到了segment header block size的限制。當沒有空間允許新的事務得到自己的tfl時,這個事務就必須等待其它的事務提交并釋放tfl。等待哪個事務的算法是:(p % nfl)其中p表示dml操作進程的process id,可以從v$process.pid字段中取得。nfl表示當前的tfl總數量。通過dump轉儲數據塊信息,我們可以看到類似于下面的內容:xct lst:: flg: used   lhd: 0x01c0008c ltl: 0x01c0008a xid: 0x0008.01f.000003d2其中xid表示transaction id,關于transaction id的格式和表示的意義,有興趣的讀者可以查看其它的資料。 4. super master free list或者segment master free list這個級別的free list只有在設置了多個freelist groups時才會出現。當我們設置freelist group>1,就會產生freelist group block,這些block緊跟在segment header block之后,假設我們設置了storage(freelists 4 freelist groups 2),那么該segment的第一個塊是segment header block,第2,3個塊則都是freelist group block。首先在segment header block中存在1個free list,這個free list就被稱為super master free list或者segment master free list。而在每個freelist group block中又都存著1個mfl,還存在4個pfl,每個freelist group block塊的剩余空間則全部留給tfl使用。在單個instance中進程選擇freelist group的算法是(p % nfb) + 1 。其中p表示dml操作進程的process id,可以從v$process.pid字段中取得。nfb表示freelist groups 參數定義的freelist groups數量。而在rac環境中的算法則更加復雜,本文不作討論了。查看freelist group block的轉儲文件可以看到類似于下面的內容:frmt: 0x02 chkval: 0x0000 type: 0x16=data segment free list block with free block count  blocks in free list = 5 ccnt = 0   seg lst:: flg: unused lhd: 0x00000000 ltl: 0x00000000   seg lst:: flg: unused lhd: 0x00000000 ltl: 0x00000000   seg lst:: flg: unused lhd: 0x00000000 ltl: 0x00000000   seg lst:: flg: used   lhd: 0x01c00116 ltl: 0x01c0011a seg lst:: flg: unused lhd: 0x00000000 ltl: 0x00000000
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德化县| 雷波县| 阜城县| 汨罗市| 上栗县| 保德县| 麻阳| 新宁县| 荔浦县| 任丘市| 永新县| 临颍县| 凌海市| 女性| 蒲江县| 阳新县| 石景山区| 习水县| 晋宁县| 正镶白旗| 阿图什市| 咸丰县| 白城市| 洛浦县| 武川县| 陵水| 五家渠市| 保德县| 恭城| 团风县| 玉山县| 双辽市| 铁力市| 时尚| 罗江县| 横山县| 东方市| 雷山县| 杭锦旗| 博客| 冀州市|