作業系統儲存管理和oracle資料庫(第二篇)

dbhelper發表於2015-02-24
在之前分享過第一篇 關於作業系統儲存管理和oracle資料庫 http://blog.itpub.net/23718752/viewspace-1359146/
感覺對自己來說是邁出了艱難的一步,作業系統的概念有時候確實感覺枯燥,但是細細品來,都是前車之鑑,很多的方法或者改進都是在碰到很多問題之後總結琢磨出來的,所以從某種程度上來說,作業系統的基礎是很多學科的基石,oracle也在不斷的改進,從它的發展中也能看到各種改進的痕跡,這一點和作業系統都是異曲同工的效果,這也是我嘗試來從作業系統為主線聯絡資料的一個主要原因。
之前討論過固定分割槽和可變分割槽管理的一些情況,它們的主要缺點就是主存使用的低效率和儲存分配釋放的低速。  固定分割槽是分割槽內部的碎片造成主存利用率低,而可變分割槽是分割槽外部的碎片,往往小到無法使用,從而主存利用率不高。對於這個問題,分頁是一種很有效的方法。
分頁技術主要是把主存分為許多同樣大小的儲存塊,並以這種儲存塊作為儲存分配單位。oracle資料庫中物理儲存單位有段,區,資料塊,這個時候所說的資料塊和作業系統資料塊存在著一點的對映,一般都比作業系統塊要大。資料庫中預設為8K.資料的儲存都是以8K的基本單位來儲存的。如果把這一點繼續延伸,oracle中的區(extent)就和分頁技術中所說的頁很類似。
分頁儲存中的基本實現過程,有以下幾點
1)把主存分為相同大小的儲存塊,叫做頁架,頁架從0開始,編號依次是0,1,2....
2)使用者邏輯地址的分頁,使用者邏輯地址可以劃分為和頁架大小相同的部分,叫做頁。頁號從0開始,依次為0,1,2...
3)邏輯地址的表示,既然說到了邏輯地址,表示方法也很重要。每一個邏輯地址都是相對地址,用一個數對(p,d)來表示,p代表頁號,d代表邏輯地址在也好為p的頁中相對的地址,也叫偏移量。
聽起來挺枯燥啊,可以簡單舉個例子,我們常看的書就是一個很好的例子,書有很多大小,四開,八開,十六開,可以理解為頁架,書中的每一頁就是我們所說的頁,邏輯地址可以這麼理解,一本書有很多章節,小結,比如第二章第3頁,我們就能夠很快找到,這個時候,頁號就是2,偏移量就是3,用(p,d)來表示就是(2,3)

舉一個嚴謹的例子,比如給定一個虛地址3456,假設頁面大小為1000B,則第0頁對應的地址為0-999,第1頁為1000-1999,則虛地址3456=(3,456)
這一點和Oracle中建立表空間時指定的extent management管理方式很相似,比如我們建立一個表空間test指定分割槽大小為1M,表空間大小為100M,則語句如下:
create tablespace test add datafile '/u01/app/db/test01/data01/test01.dbf' size 100M extent management local uniform size 1M ;
這樣我們指定分割槽大小為1M,如果儲存了100M的資料,這樣100M就會分為100個分割槽。如果資料大於分割槽1M,則可以儲存在相應的分割槽上,不一定連續。

可以用下面的圖表來說明。
地址 程式 頁號
0-999 程式1 0
1000-1999 程式1 1
2000-2999 程式2  0
3000-3999 程式3 0
4000-4999 程式2  1
5000-5999 程式1 2


對應到每個程式對應的地址,就是我們所說的邏輯地址,比如程式1對應的邏輯地址就是
0-999
1000-1999
2000-3999

所以在分頁思想中的難點就是對於地址的表示,我們已經說使用(p,d)來表示,但是這個數在機器指令的地址場中表示還有不同,首先會把地址分為兩部分,一部分表示頁號,一部分表示頁內地址。
雖讓說了用觸發,但是每次訪問一個主存單元都用一次除法得到頁號和頁內地址就很繁瑣,實際上效率要更差。這個時候相比前人也是考慮了很多招數,最後還是使用二進位制來搞定,指定頁面尺寸是2的冪,這樣就會省去很多額外的轉換。
最後一個例子很關鍵,如果看懂了說明你對分頁思想算是明白了。

假設頁的大小為1KB,計算邏輯地地址為4101的頁號,頁內地址。
按照二進位制的思想,4101可以這樣表示 4101=2^12+2^1+2^1+2^0
用0,1來表示就是
0001000000000101
頁的大小是1KB=2^10,則在二進位制串中,後10位就是對應的頁內地址,二進位制0101代表的是5,表示頁內地址為5
0001000000000101
頁號對應的二進位制串000100表示頁號為4
所以4101對應的邏輯地址表示為(4,5)

這種方法可以省去除法運算,硬體層面會自動把邏輯地址拆分為兩部分,對應頁號和頁內地址。
問題來了,地址能夠表示了,那使用的時候是怎麼轉換的呢,首先會把邏輯地址抽取出來,像上面的例子,頁號是4,然後根據頁號為索引找到該頁存放的主存頁架號。比如存放的地址為2000-2999,則頁架號為2,然後把頁架號取代邏輯地址,和右邊的頁內地址組成了最終的實體地址去訪問記憶體。

這種思想還是需要些時間去消化一下,優點也是很明顯的,基本上沒有頁內碎片,同時也不會存在小到無法再用的頁外碎片。因為每個碎片都是頁架的整數倍。

分頁中使用的二進位制方式處理地址是一種很值得借鑑的方式,可以減少很多額外的開銷,和oracle中的rowid儲存方式也很類似。

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

相關文章