操作系統基本分段存儲管理方式


1、分段存儲管理方式的引入

---- 引入分段存儲管理方式,主要是為了滿足用戶和程序員的下述一系列需要:

1)方便編程

通常,用戶把自己的作業按照邏輯關系划分為若干個段,每個段都是從0開始編址,並有自己的名字長度

因此,希望要訪問的邏輯地址是由段名(段號)和段內偏移量(段內地址)決定的。

2)信息共享

在實現對程序和數據的共享時,是以信息的邏輯單位為基礎的。比如共享某個例程和函數,分頁系統中的“頁”只是存放信息的物理單位(塊),

並無完整的意義,不便於實現共享,然而段卻是信息的邏輯單位

3)信息保護

信息保護同樣是對信息的邏輯單位進行保護,因此,分段管理方式能更有效和方便的實現信息保護功能。

4)動態增長

在實際應用中,往往有些段,特別是數據段,在使用過程中會不斷地增長,而事先又無法確切地知道數據段會增長到多大。前面的幾種存儲

管理方式都難以應付這種動態增長的情況,分段存儲管理方式能較好的解決這一問題。

5)動態鏈接

動態鏈接是指在作業運行之前,並不把幾個目標程序段鏈接起來。要運行時,先將主程序所對應的目標程序裝入內存並啟動運行,當運行過程

中又需要調用某段時,才將該段(目標程序)調入內存並進行鏈接。可見,動態鏈接也要求以段作為管理的單位。

 

2、分段和段表

---- 在分段存儲管理方式中,作業的地址空間被划分為若干個段,每個段 定義了一組邏輯信息。每個段都有自己的名字,通常可用一個段號

代替段名每個段都從0開始編址,並采用一段連續的地址空間。段的長度由相應的邏輯信息組的長度決定,因而各段長度不等。整個作業的

地址空間分成多個段,是二維的

---- 在動態分區(可變分區)分配方式中,系統為整個進程分配一個連續的內存空間。而在分段式存儲管理系統中,則是為每個分段分配一個

連續的分區,而進程中的各個段可以離散地裝入內存中不同的分區中。為使程序能正常運行,即能從物理內存中找出每個邏輯段所對應的位置,

應像分頁系統那樣,在系統中為每個進程建立一張段映射表,簡稱“段表”。

---- 每個段在表中占有一個表項,其中記錄了該段在內存中的起始地址(“基址”)和段長(字節)。段表一般放在內存中。在配置了段表后,

執行中的進程可通過查找段表找到每個段所對應的內存區。可見,段表是用於實現從邏輯段物理內存區的映射。

 

3、地址變換機構

---- 為了實現從進程的邏輯地址到物理地址的變換功能,在系統中設置了段表寄存器,用於存放段表始址 段表長度TL。在進行地址變換時,

系統將邏輯地址中的段號S(0~TL-1)段表長度TL進行比較。--  若S>=TL,表示段號太大,是訪問越界,於是產生越界中斷信號;

----  若未越界,則根據段表的始址和該段的段號,計算出該段對應段表項的位置(段表的始址+段號x段表項的長度),從中讀出該段在內存的

起始地址,然后再檢查段內地址d是否超過該段的段長SL。若超過,即d>SL,同樣發出越界中斷信號;若未越界,則將該段的基址段內地址d

相加,即可得到要訪問的內存物理地址

---- 像分頁系統一樣,當段表放在內存中時,每當要訪問一個數據,都需訪問兩次內存(第一次是得到物理地址,第二次是從地址中取數據),

從而極大地降低了計算機的速率。解決方法是再增設一個聯想存儲器(TLB),用於保存最近常用的段表項。一般情況下是段比頁大,因而

段表項的數目比頁表項的數目少,需要的TLB也相對較小,可以顯著的減少存取數據的時間。

 

4、分頁和分段的主要區別

---- 分頁和分段系統都采用離散分配方式,且都要通過地址映射機構來實現地址變換。但在概念上兩者完全不同,主要表現在3個方面:

-- 1)頁是信息的物理單位,分頁是為實現離散分配方式,消減外部碎片,提高內存的利用率。分頁僅僅是由於系統管理的需要而不是用戶的需要。

段則是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是為了更好的滿足用戶的需要。

-- 2)頁的大小固定且由系統決定,由系統把邏輯地址划分為頁號和頁內地址兩部分,是由機器硬件實現的,因而在系統中只能有一種大小的頁面;

段的長度不固定,決定於用戶所編寫的程序,通常由編譯程序在對源程序進行編譯時,根據信息的性質來划分。

-- 3)分頁的作業地址空間是一維的,即單一的線性地址空間,程序員只需利用一個記憶符,即可表示一個地址;而分段的作業地址空間是二維的

程序員在標識一個地址時,既需給出段名,又需給出段內地址

 

5、信息共享

---- 段的共享:即允許若干個進程共享一個或多個分段。

---- 可重入代碼(Reentrant Code)又稱為“純代碼”(Pure Code),是一種允許多個進程同時訪問的代碼。為使各個進程所執行的代碼完全相同,

絕對不允許可重入代碼在執行中有任何改變。因此,可重入代碼是一種不允許任何進程對它進行修改的代碼

---- 但事實上,大多數代碼在執行時都可能有些改變,例如,用於控制程序執行次數的變量以及指針、信號量及數組等。為此,在每個進程中,都必

須配以局部數據區,把在執行中可能改變的部分拷貝到該數據區,這樣,程序在執行時,只需對該數據區(屬於該進程私有)中的內容進行修改,並

不去改變共享的代碼,這時的可共享代碼即成為可重入碼。

 

轉自:http://blog.csdn.net/dongyanxia1000/article/details/51787275


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM