關於共享段與SGA的一點理解 上一週買了兩本書,

gugu99發表於2007-11-30
關於共享段與SGA的一點理解 上一週買了兩本書,google了不少文件資料,看了看部分linux原始碼終於有了以下一些理解。 一 各類地址概念 1 邏輯地址:我們一般在用匯編語言寫程式時可能用到 seg register :offset 2 線形地址:0x00000000~0xffffffff,用來描述程式的地址空間 3 x86上邏輯地址到線形地址的轉換規則:線形地址=[seg register]+offset 4 現代作業系統程式的線形地址到實體地址的轉換一般是透過分頁機制來完成的 [注]: seg register 表示段暫存器裡的值,[seg register]表示段暫存器裡的值指向的段描述符(seg descriptor)的baseAddress值 二 OS程式段的概念 1 段是OS程式為管理程式執行時的空間組織而產生的一個東東。 2 x86 CPU在硬體上支援(且強制使用)分段;power等大多數RISC系列的CPU在硬體上都不支援。 3 x86 硬體分段實際使用情況: 我們熟知的x86上的作業系統(包括windows,linux)都有限的使用了硬體分段,一般都是用的OS軟體分段。 方法:是將segment descriptor裡的baseAddress和endAddress設定為0x00000000和0xffffffff 原因和目的: a 對高階語言各類特徵或標準提供更好的支援以提高效能,比如如C語言裡的指標(見三) b 利用segment descriptor提供硬體上的核心保護 c 使得虛擬空間管理起來簡單高效統一 分段的原因: 一個程式檔案要在程式裡執行,那麼的必須有指令,儲存資料的空間,stack資訊等等,這些東西是如何組織起來並正確執行的呢?OS扮演了這個組織者的角色,透過分段技術。 比如在LINUX命令列:sqlplus "/as sysdba" 此時shell會為我們建立一個程式來執行可執行檔案sqlplus。首先讀取sqlplus檔案並根據sqlplus檔案裡的"相關資訊"在程式空間的相關位置(線形地址)建立建段如TEXT,DATA,BSS,STACK等等,這裡提到的"相關資訊"是在程式編譯連結時產生並記錄在可執行檔案裡的 一般UNIX提供了不同的編譯連結引數其中部分就是用來影響這些"相關資訊"的 LINUX裡就是用一些vm_area_struct結構來記錄並管理這些段的。 這種軟體分段出了起組織程式執行的功能外,還有個優點是不必為總個程式空間分配 pagetable項注意pagetable項與physical page的關係,有時程式有了pagetable項但系統還沒為此項分配physical page 如果此時訪問則會產生page faults 觸發OS進行相應的處理,如果訪問不存在的pagetable項(極特殊情況除外)則會產生segment fault 系統異常程式exit。 共享段是在程式執行過程中透過系統呼叫生成的並能被其他程式共享(LINUX裡就是為程式增加一個vm_area_struct結構) 補充1: PowerPC-32 有些文件上將其32位地址說成[seg-4位][disp-28位],最大段為256M。這容易使讀者產生誤解。其實這裡的32位就是線形地址不是我們常說的seg:disp邏輯地址。之所以IBM文件上這樣講是因為powerpc將線形地址轉為實體地址時與intel處理方式並不一樣,轉換的中間有個virtual address的概念 IBM《PowerPC Operating Environment Architecture Book III Version 2.02》講的比較詳細 三 使用邏輯地址還是線形地址(需特別注意-本文重點)? 現代通用作業系統windows,linux,aix等在執行時都是使用線形地址而不是邏輯地址來訪問資料,即使在硬體一級上強制用邏輯地址,但是OS都會透過將這個邏輯地址的OFFSET=線形地址的手段處理掉這個邏輯地址問題。不使用邏輯地址的原因有很多,讀者可以考慮考慮。 下面是個證實不使用邏輯地址訪問資料的方法: 想一想如果程式執行時用的是邏輯地址那麼高階語言C裡的“指標”如何實現呢?第一種:使用seg:disp來存指標變數 但是指標在32/64平臺裡都是32/64位的--可以建立一個指標陣列然後計 算它的大小就知道了,所以排除了用seg:disp來存指標變數第二種:由一,所以存線形地址,但訪問時先將線形地址轉為邏輯地址然後訪問 這種代價太大了,且多次一舉。所以不可能進行這個轉換 目前一些OS教材上經常提到的“邏輯地址”有點誤導讀者。其實即使我們用匯編語言寫程式時用到了邏輯地址的概念,但是OS的組合語言編譯器在編譯組合語言程式時會對組合語言程式進行處理,從而使得程式執行時全都透過線形地址來訪問資料。簡而言之,忘記邏輯地址這個概念。 由此得出結論: 1 oracle sga 裡儲存的那些addr值(其實就是指標)是線形地址 2 共享sga的後臺程式,以及server porcess都會將sga繫結在程式裡的相同線形地址上 如果不這樣,那麼這些程式不可能透過addr來訪問在sga裡的物件 3 ibm文件上說的"段"最大為256M只會影響程式分配多少pagetable項,並不會影響OS段的大小 4 shmmax的最大值只受OS管理段時的資料結構的一些限制 5 由於使用線形地址,sga分為多個共享段只會影響空間的使用,對效能幾乎沒有影響[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-986915/,如需轉載,請註明出處,否則將追究法律責任。

相關文章