close
 

9.1.1 位址連結 (Address Binding)

通常,程式是以二進位可執行檔的形態存於磁碟上。程式必須被載入記憶體,並且放在行程中才能執行。根據系統所使用的記憶體管理技巧,行程在執行的過程中可能會在磁碟和記憶體之間來回移動。在磁碟上正等待被載入到記憶體執行的所有行程形成一個輸入佇列

(input queue)

正常的步驟是由輸入佇列選擇一個行程,並且將它載入到記憶體中。當此行程執行時,它會從記憶體存取指令和資料。最後,這個行程結束時,它所佔用的記憶體空間會被宣告釋放。

 

9.1.2 邏輯地址空間和實體地址空間

(Logical versus Physical Address Space)

CPU所產生的地址通常稱為邏輯地址(logical address),而記憶體單元所看到的地址(也就是載入到記憶體的記憶體地址暫存器之數值)通常叫做實體地址(physical address)

編譯時間和載入時間的地址鏈結技巧造成邏輯地址和實體地址相同的情況。但是,執行時間的地址鏈結技巧卻會造成邏輯地址和實體地址不相同。在這種情況下我們通常把邏輯地址叫做虛擬地址

(virtual address)。在本書中,我們把邏輯地址和虛擬地址交替地使用。一個程式產生的所有邏輯地址所形成的集合叫做邏輯地址空間(logical address space);這些邏輯地址所對應的實體地址之集合就稱為實體地址空間(physical address space)。因此在執行時間的地址鏈結技巧中,實體地址空間和邏輯地址空間是不相同的。

 

9.2 置換

(Swapping)

一個行程必須在記憶體裏被執行,然而一個行程可能會暫時的被置換出記憶體到備份儲存,而後再回到記憶體被繼續執行。比方說我們現在有多重規劃程式都是以依序循環排班方式按排

CPU。當一個時間量終了時,記憶體管理程式便開始將剛剛結束的行程置換出去,並換入該區間的另一個行程(圖9.4)。在這個時候CPU排班程式又可以同時安排時間量給記憶體的其他的行程。當一個行程的時間量用完時,將置換另一個行程執行。理想上記憶體管理程式能快速地置換行程,使CPU排班程式在重新安排CPU時,仍然隨時有行程在記憶體區間內等著執行。另外,時間量必須足夠大,才能在兩次置換間有合理的計算次數。

這種置換的方法有時候還可以配上優先順序的排班法則。當高優先的行程進來並要求系統服務時,記憶體管理程式可以將較低優先的行程換出,以便載入並執行較高優先的行程。等到較高優先的行程結束之後,再將原先被置換出去的較低優先行程換入,繼續原來的行程。這種置換方式有時候我們又稱之為輸出/輸入方式

(roll-out/roll-in)

                         

                         圖9-4 利用磁碟當備份儲存體來置換兩個行程

 

一般而言,一個被置換出去的行程,當再度被換入時也都是被安排在原先所佔據相同的記憶體區間內。這個限制我們可以位址連結方法來探討,如果連結的動作是在組譯或載入的時候完成,則同一個行程不能在不同的區間內運作。如果在執行時間使用連結,則可能置換一個行程到不同的記憶體空間,因為實體地址是在執行時計算得到的。

置換的過程需要有備份儲存體的配合。通常備份儲存體就是高速的磁碟。這些備份儲存體必須具有相當大的容量,足以容納所有使用者程式的拷貝。在這種架構中待命佇列上所儲存的,便是備份儲存體內所有待命執行的行程所在位址。

CPU排班程式決定了下一個執行的行程之後,便交由分派程式(dispatcher)來處理。分派程式首先查核這個等待執行的行程是不是正在主記憶體內,如果不是,而且記憶體中沒有足夠的可用記憶體區域,分派程式將主記憶體中的一個行程換出(swap out),並且換入(swap in),再換入(swap in)所要執行的行程,再和往常一樣重新載入暫存器內容,並將控制權交給這新的行程。

很明顯的,置換系統在內容轉換

(context switch)的過程上需要耗費大量的時間。我們可以實際的狀況來說明,假設有一個使用者行程佔一百萬字組的位置,而備份儲存體是一個標準頭的磁碟,其資料傳遞速度為每秒百百萬字組。則傳遞一百萬字組的行程到(或從)記憶體內,需要時間:

1000k5000k∕秒

= 15

= 200毫秒

 

9.4 分頁

(Paging)

分頁是一種允許行程之邏輯記憶體空間可以不連續的技巧。分頁法避免了把不同大小記憶體區塊放回到回存裝置時所遇到的嚴重問題,而這個問題卻是先前記憶體管理方法所苦惱的問題。當主記憶體中某些片斷程式碼或資料需要被換出時,必須在回存裝置找到適當的空間。主記憶體所討論的分裂問題一樣會出現在回存裝置,只是回存裝置的存取速度較慢,所以聚集法是不可能用上。因為分頁法優於前面介紹的記憶體管理方法,所以經常在很多的作業系統中以不同的型式被使用。

 

9.4.2.1 硬體的支援

(Hardware Support)

分頁表在硬體上的製成方式有數種不同的方法。在最簡單的情況下,分頁表是以一組專用的暫存器來執行其工作。而這些暫存器應該以極高速的邏輯電路製成藉以提高分頁位址的轉換效率。對記憶體的存取都必須經過分頁的對映,因此效率是最主要的考慮。

CPU分派程式如同重新載入其他程式暫存器一般地重新載入這些暫存器。當然了,用來載入或修改分頁表暫存器的指令都屬特權式的指令,因此,只有作業系統可以改變記憶體的對映。DECPOP-11就是這種架構的一個範例。其中地址有16個位元,每頁大小是8K。因此,分頁表中有8項,這8項全都放在快速暫存器中。

      

9.4.5 共用分頁

(Shared Pages)

分頁的另外一項好處就是可以共用相同的程式碼。這項考慮在分時作業的環境中尤其重要。試考慮一個可以提供

40人使用的系統,每個使用者都執行一個本文編輯程式。如果本文編輯程式中有150K的程式碼和50K的資料空間,那就一共需要8000K來供40個使用者使用。但是,如果這些程式碼都是可重進入(reentrant)的,則40位使用者可共用這150K的程式碼,如圖9.15中所示。在此我們看到了一個3頁的編輯程式(每一分頁大小是50K,分頁較大是為了簡化這個圖)正被3個行程共用中。每個行程都有它本身的資料頁。

可重進入的程式碼(又稱做純程式碼)是一種不可自行修改的碼

(nonself-modifying code)。如果程式碼是可重進入的,那麼它就永遠不會在執行中被改變。因此兩個以上的行程可以同時執行同一個程式碼。每一個行程都有它本身對暫存器的一份拷貝,以及用來儲存執行時候資料的資料儲存器。兩個不同行程所用的資料當然是不盡相同的。

      

9.4.5 共用分頁

(Shared Pages)

分頁的另外一項好處就是可以共用相同的程式碼。這項考慮在分時作業的環境中尤其重要。試考慮一個可以提供

40人使用的系統,每個使用者都執行一個本文編輯程式。如果本文編輯程式中有150K的程式碼和50K的資料空間,那就一共需要8000K來供40個使用者使用。但是,如果這些程式碼都是可重進入(reentrant)的,則40位使用者可共用這150K的程式碼,如圖9.15中所示。在此我們看到了一個3頁的編輯程式(每一分頁大小是50K,分頁較大是為了簡化這個圖)正被3個行程共用中。每個行程都有它本身的資料頁。

可重進入的程式碼(又稱做純程式碼)是一種不可自行修改的碼

(nonself-modifying code)。如果程式碼是可重進入的,那麼它就永遠不會在執行中被改變。因此兩個以上的行程可以同時執行同一個程式碼。每一個行程都有它本身對暫存器的一份拷貝,以及用來儲存執行時候資料的資料儲存器。兩個不同行程所用的資料當然是不盡相同的。

      

                               圖9.15 在分頁環境中的共用程式碼

 

我們只需要將編輯程式的一份拷貝存放在實體記憶體中就可以了。每個使用者的分頁表都對映到編輯程式的相同實際拷貝上,但是資料頁卻對映到不同的欄裏面。因此在提供

40個使用者的時候,我們只需要編輯程式的一份拷貝(150K),外加每個使用者50K資料空間的40份拷貝。現在一共需要的空間是2150K,而不再是先前的8000K了,省下相當大的空間。

 

 

9.5 分段

(Segmentation)

在分頁法中一項重要觀念就是使用者對記憶體的看法與實際記憶體之間之不一致乃是不可避免的。使用者對記憶體的看法和實際上的記憶體並不相同。使用者的觀點是對映到實際記憶體上。這項對映法允許在邏輯上記憶體與實際記憶體之間存有差異。

 

9.6 分頁式的分段

(Segmentation with Paging)

分頁法和分段法各有其利弊。實際上,在目前最流行的兩種微處理機中,

Motorola 68000系列之設計是採用平面位址空間(flat address space),然而Intel 80x86Pentium家族採用分段法。二者均朝向將分頁和分段混合的記憶體模式前進。我們也可以將這兩種方法合併在一起去改進兩者。這種組合最好用Intel 386架構來說明。

新的

IBM OS/2 32位元版本是在Intel 386(和以後的)架構上執行的作業系統。386使用分頁式的分段方法做記憶體的管理。每個行程的區段數目最多是16K,而每個區段可以大到4Go位元組。分頁的大小是4K位元組。在本書裏,我們將無法對386的記憶體管理架構做完整的描述,我們只介紹主要的觀念。

一個行程的邏輯地址被分成兩部份。第一部份是由該行程私有的區段(至少有

8K)所組成。第二部份是由所有行程共同使用的區段(至多有8K)所組成。第一部份的資料存放在LDT (local descriptor table)中,第二部份的資料存放在GDT (global descriptor table)中。LDTGDT中的每一項皆佔用8個位元組,其中包含關於某一特殊區段的詳細資料,包括基底位址以及該區段的長度。
大頭 / Xuite日誌 / 回應(0) / 引用(2)
沒有上一則|日誌首頁|沒有下一則
回應