前言
??上篇文章基本分頁存儲管理介紹了不連續(xù)分配的第一種方式——基本分頁存儲管理蔑祟,本文繼續(xù)介紹另一種不連續(xù)分配方式——基本分段存儲管理方式须板。
本文內(nèi)容
1 分段
??進程的地址空間:按照程序自身的邏輯關系劃分為若干個段闸准,每個段都有一個段名(在低級語言中,程序員使用段名來編程)锭汛,每段從0開始編址秃臣。
??內(nèi)存分配規(guī)則:以段為單位進行分配,每個段在內(nèi)存中占據(jù)連續(xù)空間淮蜈,但各段之間可以不相鄰斋攀。
??舉例說明,進程A大小為16KB梧田,其中main函數(shù)占7KB淳蔼,某個子函數(shù)占3KB,用于保存全局變量的占6KB裁眯,所以按照邏輯功能將進程A劃分為3個段鹉梨,每個段的邏輯地址都是從0開始的。程序運行時各個段在內(nèi)存中占用連續(xù)的空間穿稳,但是各個段之間可以不相鄰存皂。
??由于是按邏輯功能模塊劃分,用戶編程更方便逢艘,程序可讀性更高旦袋。
注:K表示數(shù)字大小,KB表示存儲容量大小埋虹。1K = 1024,1KB = 1024B猜憎。
??分段系統(tǒng)的邏輯地址結構是由段號(段名)和段內(nèi)地址(段內(nèi)偏移量)所組成娩怎。
??例如搔课,若系統(tǒng)是按字節(jié)尋址,用32個二進制位表示邏輯地址,如果段號占和段內(nèi)地址各占16位爬泥,那么它的邏輯地址結構圖如下所示柬讨。
??段號的位數(shù)決定了每個進程最多可以分幾個段。
??段內(nèi)地址位數(shù)決定了每個段的最大長度袍啡。
??在上述的例子中踩官,段號占16位,所以每個進程最多有216 = 64K(64 * 1024)個段境输,段內(nèi)地址占16位蔗牡,因此每個段的最大長度是216 = 64KB。
2 段表
??和分頁存儲一樣嗅剖,為了能保證程序能正常運行辩越,就必須能從物理內(nèi)存中找到各個邏輯段存放的位置。為此每個進程建立一張段映射表信粮,簡稱“段表”黔攒。
(1) 每個段對應一個段表項,其中記錄了該段在內(nèi)存中的起始位置(又稱“基址”)和段的長度强缘。頁表中沒有頁長是因為所有的頁的長度都是相等的督惰。
(2) 各個段表項的長度是相同的。
??例如上圖旅掂,某關系系統(tǒng)中按字節(jié)尋址赏胚,采用分段存儲管理,邏輯結構為(段號16位商虐,段內(nèi)地址16位)栅哀,因此用16位即可表示最大段長。物理內(nèi)存大小為4GB(可用32位表示整個物理內(nèi)存的存儲地址空間)称龙。因此留拾,可以讓每個段表項占 16 + 32 = 48位,即6B鲫尊。由于段表項長度是相同的痴柔,因此段號可以是隱含的,不占存儲空間疫向。若段表在內(nèi)存中存放的起始地址為M咳蔚,則K號段對應的段表項存放的地址M + 6 * K。
??下面介紹一下上面的幾個參數(shù):
(1) 段內(nèi)地址決定了段的最大段長搔驼,上例中最大段長是7K = 7 * 210 < 8 * 210 谈火,所以最少需要13個二進制位就可以表示改進程的最大段長,即最少需要2個字節(jié)(16個二進制位)舌涨。
(2) 內(nèi)存4GB = 232 B 糯耍,按字編址,一個內(nèi)存單元大小為1B,所以共有232 B/ 1B = 232個內(nèi)存單元温技,所以內(nèi)存的編號0~232 - 1革为,給基址分配的空間大小就需要可以表示0~232 - 1中的任何一個數(shù),最大是232 - 1舵鳞,所以需要32個二進制位震檩,即4個字節(jié)。
(3) 所以蜓堕,一個段表項的大小就是 2 + 4 = 6B(字節(jié))抛虏。
3 地址的轉換
??進程運行時,操作系統(tǒng)會將內(nèi)存中PCB中段表的起始地址F和段表長度M傳送到段表寄存器中套才。
(1) 根據(jù)邏輯地址得到段號嘉蕾、段內(nèi)地址。
(2) 判斷段號是否越界霜旧。
(3) 查詢段表错忱,找到對應的段表項,段表項存放的地址為F + S * 段表項長度挂据。
(4) 檢查段內(nèi)地址是否超過段長以清。這是分段和分頁的區(qū)別,具體后面分析崎逃。
(5) 計算得到物理地址掷倔,物理地址 = 段基址 + 段內(nèi)地址。
(6) 訪問目標內(nèi)存單元个绍。
??在分頁中為什么不需判斷頁內(nèi)偏移量是否大于頁長勒葱?而分段需要判斷段內(nèi)偏移量大于段長?
??在分頁系統(tǒng)中巴柿,頁面大辛菟洹(頁長)是固定的L,如4KB = 4096广恢,而頁內(nèi)偏移量W = 邏輯地址 % 頁面大小L凯旋,所以頁內(nèi)偏移量W一定是小于L的,所以不需要判斷頁內(nèi)偏移量大于頁長钉迷。
??同理至非,根據(jù)邏輯地址也可以判斷。如果每個頁面的大小為2kB糠聪,用二進制表示邏輯地址荒椭,則末尾的K位表示頁內(nèi)偏移量,其余部分就是頁號舰蟆。例如趣惠,如果頁面大小為2KB狸棍,則邏輯地址結構圖如下,那么頁內(nèi)偏移量最大為212 - 1 < 2KB信卡。
對于分段存儲管理的系統(tǒng)中隔缀,由于段長的不固定的题造,這就可能會有段內(nèi)地址(段內(nèi)偏移量)大于段長的情況傍菇,所以需要判斷段內(nèi)偏移量是否大于段長。拿第二節(jié)的圖為例界赔,用16位表示段內(nèi)地址丢习,即段內(nèi)偏移量最大為64K,而三個段的段長都小于64K淮悼,所以需要進行判斷咐低。
4 分段、分頁管理的對比
??(1) 頁是信息是物理單位袜腥。分頁的主要目的是為了實現(xiàn)離散分配见擦,提高內(nèi)存利用率。分頁僅僅是系統(tǒng)管理上需要羹令,完全是系統(tǒng)行為鲤屡,對用戶不可見。
??(2) 段是信息的邏輯單位福侈。分段的主要目的是更好的滿足用戶需求酒来。一個段通常包含一組屬于一個邏輯塊的信息。分段對用戶是可見的肪凛,用戶編程時需要顯示給出段名堰汉。
??(3) 頁的大小固定且由系統(tǒng)決定。段的長度不固定伟墙,決定于用戶編寫的程序翘鸭。
??分頁的用戶進程地址空間是一維的。在確定頁的大小情況下戳葵,只需要給出邏輯地址就可以定位到相應的內(nèi)存地址矮固。分段的用戶進程地址空間是二維的。要標識一個地址必須給出段名和段內(nèi)地址譬淳。
??(4) 分段比分頁更容易實現(xiàn)信息的共享和保護档址。
??不能被修改的代碼稱為純代碼或可重入代碼(不屬于臨界資源),這樣的代碼是可以被共享的邻梆。而可修改的代碼一般是不用于共享的守伸,如一個代碼中有多個變量,各進程并發(fā)同時訪問可能造成數(shù)據(jù)不一致浦妄。
??例如尼摹,如下圖见芹,將生產(chǎn)者進程分為三段,其中1號段是允許被生產(chǎn)者和消費者共享訪問的蠢涝。
??如果想要將1好號段給消費者共享玄呛,只需將消費者進程段表中加入與生產(chǎn)者進程相同的1號段的段表項即可。
??下面在看分頁存儲系統(tǒng)中的信息共享
??同樣將生產(chǎn)者進程分段和二,假設頁面大小為4KB徘铝,那么分頁后的共享的一號段被分為兩頁,同時每頁還有不可共享代碼惯吕,都只有一部分功能共享代碼惕它,從而就很難實現(xiàn)信息保護。
??(5) 訪問內(nèi)存的次數(shù)
(1) 分頁(單機頁表):第一次訪問內(nèi)存——查詢內(nèi)存中的頁表废登,第二次訪問內(nèi)存——訪問目標內(nèi)存單元淹魄。總共兩次訪問內(nèi)存堡距。
(2) 分段:第一次訪問內(nèi)存——查內(nèi)存中段表甲锡,第二次訪問內(nèi)存——訪問目標內(nèi)存單元∮鸾洌總共訪問兩次內(nèi)存缤沦。
??與分頁系統(tǒng)類似,分段系統(tǒng)也可以引入*快表機構半醉,將近期訪問過的段表項放到快表中疚俱,這樣可以少訪問一次內(nèi)存,加速地址變換速度缩多。