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

dbhelper發表於2015-02-24
在之前的一篇博文中討論了分頁儲存,http://blog.itpub.net/23718752/viewspace-1435671/
今天看了下分段儲存,儘管這部分內容都是大學的課程內容,但是感覺好像沒學過一樣:)
分段式儲存管理系統中,會為每個段分配一個連續的分割槽,而程式中的各個段可以離散地移入記憶體中不同的分割槽中,這一點上所說的段和資料庫中的段還是有著很大的區別,資料庫中的段是可以包含多個分割槽的,各個段
說起分段就會聯想到分頁,在這一點上自己的認識也很淺薄,查詢了下資料,個人認為下面的這段描述還是很到位的。
http://blog.163.com/clevertanglei900@126/blog/static/111352259201121734555459/
分頁與分段的主要區別
分頁和分段有許多相似之處,比如兩者都不要求作業連續存放.但在概念上兩者完全不同,主要表現在以下幾個方面:
(1)頁是資訊的物理單位,分頁是為了實現非連續分配,以便解決記憶體碎片問題,或者說分頁是由於系統管理的需要.段是資訊的邏輯單位,它含有一組意義相對完整的資訊,分段的目的是為了更好地實現共享,滿足使用者的需要.
(2)頁的大小固定,由系統確定,將邏輯地址劃分為頁號和頁內地址是由機器硬體實現的.而段的長度卻不固定,決定於使用者所編寫的程式,通常由編譯程式在對源程式進行編譯時根據資訊的性質來劃分.
(3)分頁的作業地址空間是一維的.分段的地址空間是二維的.

從資料庫的角度來看,感覺和資料庫中的段概念還是比較類似的。資料庫中段包含多個分割槽。各個分割槽也可以在不相鄰的分割槽中。
上一個圖來說明。
在分段情況下,會要求每個程式的地址空間劃分為若干個段,每個段都有自己的段名,對應到下圖中就是一個段號。每個段的地地址空間都是從0開始,是一個連續的地址空間,
從地址的儲存情況來說,段和頁的儲存方式都是類似的,都會包含兩部分。分段儲存中是段號和段內地址,和分頁儲存中的頁號和頁內地址類似。



由於一個程式由很多段組成,而且各個段可能被分配在主存中的多個不相鄰的分割槽中,為了將程式的邏輯地址轉換為實體地址,需要有一個短標來指出程式的某段放在主存中的位置以及段長。
這一點從資料庫層面來說有類似的方面,首先是程式由多個段組成,資料庫中可以理解為一個表包含多個段,資料段,索引段,lob段,lob索引段等等。這些都是獨立的段,在儲存的時候也可能分佈在不同的表空間中,所以可能不是一個相鄰的分割槽。
而段的資訊在作業系統層面是通過段表來維護的,資料庫層面則是通過資料字典,user_segment,user_extents來維護的,每個表包含的段,每個段包含的區都是很詳實的。

從分段和分頁的優點來說,因為它們涉及的層面和應用方向不同,但是還是有一定的可比性,在段共享方面,分段儲存還是很有優勢,誰讓它是段共享呢。
從作業系統層面舉個例子就是一個多使用者系統,有一個應用程式可能包含的程式段是100K,資料段是40K,按理說需要40K*40+100k*40=1600+4000=5600k
在分段儲存中則需要100k+40k*40=1700k,從這一點上來說還是很大的改進。
從這一點上來說,資料庫中的同義詞就有點分段儲存的味道,每個同義詞都可以訪問源表,相當於共享了資料,同義詞佔用的儲存空間很小,幾乎可以忽略。

可能分段儲存和分頁儲存都各有千秋,但是都是在不斷的使用和改進中主鍵發展起來的,分段儲存沒有段內碎片,只有外部碎片,簡單分段技術也是基於多重分割槽技術的發展而來。另外簡單分頁對於使用者是不可見的,使用者無法瞭解程式被分頁或者分頁的細節,但是簡單分段對於使用者基本是可見的,當程式被交換出記憶體的時候,對應的頁表和段表也需要隨著程式一起撤出記憶體。

當然分頁分段方式還在不斷的發展中,要不怎麼有後續的段頁式儲存呢,在後續章節繼續分享,需要多充充電,補補作業系統方面的東西。理解透了才能準確的類比資料庫層面的東西。

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

相關文章