l 區(qū)分邏輯地址與絕對地址
絕對地址:主存儲器以字節(jié)為編址單位,容量為n的主存儲器中,每個單元有唯一的編號,從0到n-1,這個唯一的編號就是主存儲器的物理地址也叫絕對地址。
邏輯地址:在多道程序設計的系統(tǒng)中,操作系統(tǒng)為了方便用戶,就允許每個用戶都認為自己作業(yè)的程序和數(shù)據(jù)存放在地址從 0開始的連續(xù)空間中。這樣用戶程序中使用的地址就是邏輯地址也叫相對地址。
l 對主存儲器為什么要區(qū)分絕對地址和邏輯地址?
中央處理器訪問主存時必須指定確切的存儲單元。在計算機系統(tǒng)中通常對主存儲器以字節(jié)(每個字節(jié)8個二進制位)為編址單位,每個字節(jié)都有一個地址與其對應,這樣的地址稱為主存儲器的“絕對地址”。
在多道程序設計系統(tǒng)中,主存中同時存放了多個用戶作業(yè)。操作系統(tǒng)根據(jù)主存的使用情況為用戶分配主存空間。每個用戶不能預先知道他的作業(yè)將被存放到主存儲器的什么地方。這樣,用戶程序中就不能使用主存的絕對地址。為了方便用戶,允許用戶程序中使用“邏輯地址”,每個用戶都可認為自己作業(yè)的程序和資料存放在一組從“0”地址開始的連續(xù)的邏輯地址空間中。
l 重定位
為了保證作業(yè)的正確執(zhí)行,必須根據(jù)分配給作業(yè)的主存區(qū)域?qū)ψ鳂I(yè)中指令和數(shù)據(jù)的存放進行重定位,這種把邏輯地址轉(zhuǎn)換成絕對地址的工作稱為“重定位”或“地址轉(zhuǎn)換”。重定位的方式有“靜態(tài)重定位”和“動態(tài)重定位”兩種。
(1)靜態(tài)重定位
在裝入一個作業(yè)時,把作業(yè)中的指令地址和數(shù)據(jù)地址全部轉(zhuǎn)換成絕對地址。這種轉(zhuǎn)換工作是在作業(yè)開始前集中完成的,在作業(yè)執(zhí)行過程中無需再進行地址轉(zhuǎn)換。所以稱為“靜態(tài)重定位”。圖4_2.1指出了靜態(tài)重定位的過程。

在圖4-2.l中,假定用戶作業(yè)的邏輯地址空間從“0”到“124”,其中第8號單元處有一條“加法”指令,該指令要求從第32號單元處取出操作數(shù)3465,然后進行加法操作。如果存儲管理為該作業(yè)分配的主存區(qū)域是從100單元開始,那么,邏輯地址第8號單元在主存中的對應位置是108單元,第32號單元在主存中的對應位置應該是132單元。如果不修改上述“加法”指令中的操作數(shù)地址,則處理器執(zhí)行該指令時將從主存的032單元中去取操作數(shù),這顯然是錯誤的。于是,應把程序中所有邏輯地址都轉(zhuǎn)換成絕對地址。上述加法指令中的操作數(shù)地址也應改成132。這樣,在執(zhí)行指令時便可從132單元取到正確的操作數(shù)。
(2)動態(tài)重定位
在裝入一個作業(yè)時,不進行地址轉(zhuǎn)換,而是直接把作業(yè)裝到分配的主存區(qū)域中。在作業(yè)執(zhí)行過程中,每當執(zhí)行一條指令時都由硬件的地址轉(zhuǎn)換機構(gòu)轉(zhuǎn)換成絕對地址。這種方式的地址轉(zhuǎn)換是在作業(yè)執(zhí)行時動態(tài)完成的,所以稱為動態(tài)重定位。圖4_2.2指出了動態(tài)重定位的過程。


在圖4-2.2中,基址寄存器中存放了作業(yè)所在主存區(qū)域的起始地址100。當處理器從108單元取出指令后,該指令中的邏輯地址是032,把基址寄存器中的值100與邏輯地址032相加得到絕對地址132,處理器便可從132單元中取出正確的操作數(shù)。
點擊見相關動畫
l 什么是“程序浮動”?為什么動態(tài)重定位能支持程序浮動?
若在作業(yè)的執(zhí)行過程中改變了該作業(yè)在主存中的存放區(qū)域后,該作業(yè)仍然能正確執(zhí)行,則稱該作業(yè)的程序是可浮動的。采用動態(tài)重定位的系統(tǒng)能支持“程序浮動”。這是因為動態(tài)重定位是在每執(zhí)行一條指令時進行地址轉(zhuǎn)換的。當作業(yè)在主存中的位置被移動后,只要把新區(qū)域的起始地址存入基址寄存器中,作業(yè)繼續(xù)執(zhí)行時硬件的地址轉(zhuǎn)換機構(gòu)就會按基址寄存器中新存入的地址與邏輯地址相加,所得的絕對地址就是新區(qū)域中的存儲單元地址,作業(yè)當然仍可正確執(zhí)行。
第三節(jié) 分區(qū)存儲管理
l 什么是分區(qū)存儲管理?
分區(qū)存儲管理是把存儲器中的用戶區(qū)作為一個連續(xù)區(qū)或分成若干連續(xù)區(qū)進行管理。早先使用一個分區(qū)的存儲管理,后發(fā)展成多分區(qū)的存儲管理。多個分區(qū)的管理可采用固定分區(qū)方式和可變分區(qū)方式。
l 一個分區(qū)的存儲管理
(1) 一個分區(qū)的存儲管理
又稱單連續(xù)存儲管理,是最簡單的存儲管理方式。除操作系統(tǒng)占用的一部分存儲空間外,其余的用戶區(qū)域作為一個連續(xù)的分區(qū)分配給一個作業(yè)使用,即在任何時刻主存儲器中最多只有一個作業(yè)。一個分區(qū)的存儲管理只適用于單用戶的情況。
(2) 一個分區(qū)的存儲管理方法
處理器中設置一個界限寄存器,寄存器的內(nèi)容為當前可供用戶使用的主存區(qū)域的起始地址。只當操作系統(tǒng)的功能擴充或修改時改變了所占區(qū)的長度,才更改界限寄存器的內(nèi)容。
等待裝入主存儲器的作業(yè)排成一個作業(yè)隊列。當主存儲器中無作業(yè)或一個作業(yè)執(zhí)行結(jié)束;就可以讓作業(yè)隊列中的一個作業(yè)裝入主存儲器。如圖4_3.1所示。

l 固定分區(qū)存儲管理
(1) 固定分區(qū)
固定分區(qū)是指把主存儲器中可分配的用戶區(qū)域預先劃分成若干個連續(xù)區(qū)。每個連續(xù)區(qū)的大小可以相同,也可以不同。但是一旦劃分好分區(qū)之后,主存儲器中分區(qū)的個數(shù)就固定了,且每個分區(qū)的大小也固定不能再變。
(2) 固定分區(qū)存儲管理的原理
在固定分區(qū)方式管理下,每個分區(qū)可用來裝入一個作業(yè)。由于主存中有多個分區(qū),可同時在每個分區(qū)中裝人一個作業(yè),故適用于多道程序設計系統(tǒng)。
等待進人主存的作業(yè)排成隊列。當主存儲器中有空閑的分區(qū)時,依次從作業(yè)隊列中選擇一個能裝入該分區(qū)的作業(yè)。當所有的分區(qū)都裝有作業(yè),就暫停裝入其它作業(yè)。已經(jīng)裝入主存的作業(yè)能得到處理器運行時,應限定它只能在所占的分區(qū)中執(zhí)行。當作業(yè)執(zhí)行結(jié)束后,收回該作業(yè)所占的分區(qū)。收回的分區(qū)可用來裝入新的作業(yè)。
圖4_3.2是劃分成三個分區(qū)的固定分區(qū)管理方式的示意圖。

(3) 主存空間的分配與去配
設置一張“主存分配表”,以說明各分區(qū)的分配情況。主存分配表中應指出各分區(qū)的起始地址和長度,并為每個分區(qū)設一個標志位。當標志位為“0”時,表示對應的分區(qū)是空閑分區(qū),當標志位為非“0”時,表示對應的分區(qū)已被占用。空閑分區(qū)可以用來裝作業(yè),已被占用的分區(qū)需指出被哪個作業(yè)占用。
用“順序分配算法”進行主存空間的分配。順序查看主存分配表,找到一個標志為“0”的分區(qū),再把欲裝入作業(yè)的邏輯地址空間的長度與找到的分區(qū)長度進行比較。當能容納該作業(yè)時,則把此分區(qū)分配給該作業(yè),把它的作業(yè)名填到占用標志位上。當找到的分區(qū)不能容納該作業(yè)時,則重復上述過程繼續(xù)順序查看主存分配表中是否有能滿足該作業(yè)長度要求的且標志為“0”的分區(qū),若有,則分配,若無,則該作業(yè)暫時得不到主存空間而不能裝入。
(4) 地址轉(zhuǎn)換
固定分區(qū)管理可采用靜態(tài)重定位的方式裝入作業(yè)。裝入程序把作業(yè)中的邏輯地址轉(zhuǎn)換為絕對地址與分區(qū)的下限地址相加,得到相應的絕對地址。
(5)
存儲保護
實現(xiàn)存儲保護需要軟件與硬件相互配合。采用固定分區(qū)方式管理時,處理器中應設置兩個寄存器:下限寄存器和上限寄存器。
當一個被裝入分區(qū)的作業(yè)能占用處理器時,由操作系統(tǒng)把該分區(qū)的上限地址和下限地址分別存入處理器的上限寄存器和下限寄存器之中。處理器執(zhí)行該作業(yè)時,對每條指令中的地址都要核對絕對地址是否在上下限地址之間,即核對
“下限地址<絕對地址<上限地址”
是否成立。若成立,表示絕對地址在規(guī)定的分區(qū)之內(nèi),可按絕對地址訪問主存,否則便形成“地址越界”的程序性中斷事件。從而達到存儲保護的目的。
當一個作業(yè)讓出處理器時,另一作業(yè)可能被選中占用處理器。這時應更改上、下限寄存器的內(nèi)容為當前被選中作業(yè)所在分區(qū)的上限地址和下限地址,以保證處理器能控制每個作業(yè)都在規(guī)定的分區(qū)內(nèi)執(zhí)行。
(6) 固定分區(qū)管理方式不能充分利用主存空間
采用固定分區(qū)方式管理主存時,規(guī)定每個分區(qū)只能裝入一個作業(yè),且總是要為作業(yè)分配一個不小于作業(yè)長度的分區(qū)。這樣就有可能造成很多作業(yè)實際上只占用了分區(qū)的一部分空間,使分區(qū)中有一部分空間不能被利用,影響了主存空間的利用率。
(7) 固定分區(qū)管理方式提高主存空間利用率的辦法
1)分區(qū)按大小順序排列,這樣可以使作業(yè)總是先使用滿足要求的最小分區(qū)。
2)根據(jù)經(jīng)常出現(xiàn)的作業(yè)大小和頻率劃分分區(qū)。
3)按作業(yè)對主存空間的需求量排成多個隊列,規(guī)定隊列與分區(qū)的對應關系。也就是說多大的作業(yè)只能放在多大的分區(qū)里,就算有更大的分區(qū)空著,也不許他進入。
l 可變分區(qū)的管理
可變就是指分區(qū)的大小和位置不是固定的,而是根據(jù)作業(yè)要求的主存量來分配分區(qū)的大小。
圖4_3.3是可變分區(qū)管理方式的存儲空間分配示意圖。

(1)主存的分配和去配
在系統(tǒng)初始化時,主存除了操作系統(tǒng)所占部分外,整個用戶區(qū)是一個大的空閑區(qū),可以按作業(yè)需要的空間大小順序分配空閑區(qū)直到不夠時為止。
當作業(yè)結(jié)束時,它的占用分區(qū)被收回。這個空閑區(qū)又可以根據(jù)新作業(yè)的大小重新用于分配,所以主存中的已占分區(qū)和空閑區(qū)的數(shù)目和大小都是在變化的。可以用兩張表“已分配區(qū)表”和“空閑區(qū)表”來記錄和管理。
例如,某主存容量為2560K(1K為1024字節(jié)),其中操作系統(tǒng)占用400K,現(xiàn)依次有五個作業(yè)J1,J2,J3,J4,J5要求裝入主存,它們對主存的需求量分別是600K,1000K,300K,700K,500K。圖4_3.4指出了作業(yè)被裝入、執(zhí)行結(jié)束后撤離的主存空間分配情況。
圖4_3.5是可變分區(qū)管理方式的主存分配表,表中內(nèi)容是按圖4_3.4(b)的情況填寫的。

(2)常用的分配算法
最先適應分配算法:空閑區(qū)按地址順序由小到大登記在空閑區(qū)表中,在分區(qū)表中順序查找,找到夠大的空閑區(qū)就分配。但是這樣的分配算法可能形成許多不連續(xù)的空閑區(qū),造成許多“碎片”,使主存空間利用率降低。 點擊見相關動畫
最優(yōu)適應分配算法:這種算法總是挑選一個能滿足作業(yè)要求的最小空閑區(qū)。
點擊見相關動畫
在實現(xiàn)這種算法時,可把空閑區(qū)按長度以速增順序登記在空閑區(qū)表中。分配時順序查找空閑區(qū)表,由于查找時每次總是從最小的一個區(qū)開始,同時要不斷調(diào)整空閑區(qū)表,每當收回一個分區(qū),必須把收回后的分區(qū)按長度順序插入登記到空閑區(qū)表的適當位置。
但是這種算法可能形成一些極小的空閑區(qū),以致無法使用,這也會影響主存利用率。
最壞適應分配算法:這種算法總是挑一個最大的空閑區(qū)分給作業(yè)使用,使剩下的空間不至于太小。空閑區(qū)按長度以遞減順序登記在空閑區(qū)表中。
收回主存空間:收回主存空間時,應檢查是否有與歸還區(qū)相鄰的空閑區(qū)。若有,則應合并成一個空閑區(qū)登記。
一個歸還區(qū)可能有上鄰空閑區(qū),也可以有下鄰空閑區(qū),或既有上鄰又有下鄰空閑區(qū),或既無上鄰又無下鄰空閑區(qū)。在實現(xiàn)去配時應順序檢查空閑區(qū)表中標志為“未分配”的欄目,以確定是否有相鄰空閑區(qū)。四種情形如圖4_3.6所示。

假定作業(yè)歸還的分區(qū)始址為s,長度為L,則:
(1)歸還區(qū)有下鄰空閑區(qū)。如果S+L正好等于空閑區(qū)表中某個登記欄目(假定為第j欄)所示分區(qū)的始址,則表明歸還區(qū)有一個下鄰空閑區(qū)。這時修改第j欄登記項的內(nèi)容:
始址:=S
長度:=原長度+L
則第j欄指示的空閑區(qū)是歸還區(qū)與下鄰空閑區(qū)合并后的一個大空閑區(qū)。
(2)歸還區(qū)有上鄰空閑區(qū)。如果空閑區(qū)表中第j個登記欄中的“始址+長度”正好等于s,則表明歸還區(qū)有一個上鄰空閑區(qū)。這時修改第j欄登記項的內(nèi)容:始址不變,長度為原長度加上L。于是,歸還區(qū)便與上鄰空閑區(qū)合在一起了。
(3)歸還區(qū)既有上鄰空閑區(qū)又有下鄰空閑區(qū)。
S=第j欄始址+長度
如果
S+L=第k欄始址
則表明歸還區(qū)既有上鄰空閑區(qū),又有下鄰空閑區(qū)。此時,須把這三個區(qū)合并成一個空閑區(qū)登記入空閑區(qū)表中,只需使用一個登記欄目。進行如下修改:第j欄始址不變;第j欄長度為“j欄中原長度+k欄中長度+L”;第k欄的標志應修改成“空”狀態(tài)。于是,第j欄中登記的空閑區(qū)就是合并后的空閑區(qū),而第k欄成為空表目了。
(4)歸還區(qū)既無上鄰又無下鄰空閑區(qū)。如果在檢查空閑區(qū)表時,無上述三種情況出現(xiàn),則表明歸還區(qū)既無上鄰又無下鄰空閑區(qū)。這時,應找一個標志為“空”的登記欄,把歸還區(qū)的始址和長度登記入表,且把該欄目中的標志位修改成“未分配”。
(3) 可變方式管理主存時的存儲保護
硬件設置兩個專用的控制寄存器:限長寄存器和基址寄存器。當進程調(diào)度選中某作業(yè)進程占用處理器時,把作業(yè)所占分區(qū)的始址和長度送入基址寄存器和限長寄存器中。作業(yè)執(zhí)行過程中,處理器每執(zhí)行一條指令都要取出指令中的邏輯地址。當邏輯地址小于限長寄存器中的限長值時,由該邏輯地址加基址寄存器之值就可得到合法的(即不越界的)絕對地址。當邏輯地址大于或等于限長寄存器中的限長值時,表示欲訪問的主存地址超出了所分配的分區(qū)的范圍,這時就不允許訪問該主存地址,并形成一個“地址越界”的程序性中斷事件。由此可知,存儲保護是需要操作系統(tǒng)與硬件相互配合來實現(xiàn)的。
(4)
移動技術(shù)的應用
移動技術(shù)要“移動”的東西就是主存空間中的作業(yè)。把某個作業(yè)移到另一處主存空間去(在磁盤整理中我們應用的也是類似的移動技術(shù)),這樣的最大好處就是可以合并一些空閑區(qū)。如圖4_3.7 所示

但是移動技術(shù)的應用也要注意以下問題:
1)
移動會增加系統(tǒng)開銷。所以要盡量減少移動。
2)移動是有條件的,如果作業(yè)在執(zhí)行過程中正等待與外圍設備傳輸信息,就不能移動。因此在移動時首先要判定該作業(yè)是否與外設交換信息。
第四節(jié) 頁式存儲管理
l 基本原理
頁式存儲管理中有兩個名詞:“頁”和“塊”,其中的“塊”是針對硬件來說的,就是把存儲器分成若干相等大小的區(qū),每個區(qū)就稱為一個塊。對應的,在程序中,邏輯地址進行“分頁”,其大小和每個塊相一致。
事實上,頁面的大小是由塊的大小自然決定的。對于程序來說,其邏輯地址還是和原來一樣采用連續(xù)的地址。只是按照塊的位數(shù)取其前面數(shù)位做為頁號。
分配空間時,根據(jù)作業(yè)長度可以確定它的頁面數(shù),根據(jù)這個頁面數(shù)在主存中分配相應的塊數(shù),只要是空閑塊就可以放入,即使不是相鄰的。并把分配情況記在“頁表”中,根據(jù)頁表可以找到相對應的頁號與塊號,就得出絕對地址了。
采用頁式管理,使主存空間充分利用,頁不必為了得到連續(xù)空間而進行移動。可以提高系統(tǒng)效率。
l 頁式存儲管理中主存塊的大小是如何決定的?
主存塊的大小是由硬件地址結(jié)構(gòu)確定的。在頁式存儲管理中,地址由兩部分組成:頁號和頁內(nèi)地址。假定地址用m個二進制位表示,其中頁內(nèi)地址部分占用了n個二進制,那么每一個塊的長度就是
。
l 頁表的構(gòu)造與作用
每個被裝入主存的作業(yè)都有一張頁表,指出該作業(yè)邏輯地址中的頁號與所占用的主存塊號之間的對應關系。頁表的長度由作業(yè)擁有的頁面數(shù)決定,行號對應為頁號,行中記錄的是主存中的塊號。
頁表是硬件進行地址轉(zhuǎn)換的依據(jù),每執(zhí)行一條指令時按邏輯地址中的頁號查找頁表并轉(zhuǎn)換成絕對地址。絕對地址的計算公式如下:
絕對地址= 塊號* 塊長+ 頁內(nèi)地址
圖4_4.1指出了作業(yè)按頁裝入主存的示例。

圖4-4.1中假定作業(yè)J有四個頁面:
JP0,
JP1,
JP2,
JP3,現(xiàn)只要找出四個空閑塊就可把作業(yè)1裝入主存。如果找到的四個空閑塊是第5,23,24,
27塊,則四個頁面就分別裝入其中。同時應為該作業(yè)建立一張“頁表”,指出邏輯地址中的頁號與主存中塊號的對應關系,頁表的一般格式如圖4-4.1中所示。作業(yè)執(zhí)行時,按邏輯地址中的頁號查“頁表”,得到該頁對應的塊號,就可知道該頁在主存中的位置,再按頁內(nèi)地址就能算出欲訪問的絕對地址。絕對地址的計算公式為:絕對地址=
塊號*
塊長+
頁內(nèi)地址。因此,雖然作業(yè)被存放在若干個不連續(xù)的塊中,但在作業(yè)執(zhí)行中總是能按確切的絕對地址進行存取。
l 在采用頁式存儲管理的系統(tǒng)中,怎樣利用“位示圖”來進行主存空間的分配與回收?
位示圖:位示圖中的每一位與一個主存塊對應,每一位的值可以是“0”或“1”,當取值為“0”時表示對應塊為空閑,當取值為“1”時表示對應塊已被占用。在位示圖中增加一個字節(jié)記錄當前剩余的空閑塊數(shù)
當需要分配一塊主存空間時,可從位示圖中找一個為“0”的位,把該位置成占用標志“1”,且根據(jù)它在位示圖中的字號和位號,按如下公式計算出與它對應的塊號:
塊號=字號x字長+位號
這個塊號就是當前所分配用來裝作業(yè)信息的主存塊的塊號。
當一個作業(yè)執(zhí)行結(jié)束時,應收回該作業(yè)所占用的主存塊。根據(jù)歸還的塊號可計算出歸還塊在位示圖中的對應位置,計算公式如下,并將該位的占用標志置為“0”。
字號=[塊號/字長],位號=塊號 mod
字長
l 地址轉(zhuǎn)換
每執(zhí)行一條指令時按邏輯地址中的頁號查頁表,若頁表中無此頁號,則產(chǎn)生一個“地址錯”的程序性中斷事件;若頁表中有此頁號,則可得到對應的主存塊號,按計算公式可轉(zhuǎn)換成欲訪問的主存絕對地址。按絕對地址的計算公式為“塊號*塊長+頁內(nèi)地址”
在多道程序設計的系統(tǒng)中,進入主存儲器的每個作業(yè)都有一張頁表。硬件要增加一個“頁表控制寄存器”。調(diào)度程序選中某個作業(yè)占用處理器時,就把該作業(yè)的頁表起站地址和長度送入頁表控制寄存器。于是,地址轉(zhuǎn)換機構(gòu)根據(jù)頁表控制器就可找到該作業(yè)的頁表。

l 采用頁式存儲管理為什么會延長指令的執(zhí)行周期?有什么辦法可提高指令的執(zhí)行速度?
頁式存儲管理中的頁表一般是存放在主存中的。當要按給定的邏輯地址進行讀/寫時,首先要按頁號從頁表中讀出對應的塊號,然后算出絕對地址進行讀/寫。這樣就必須訪問主存兩次,多花了一次訪問主存的時間,因而延長了指令的執(zhí)行周期,降低了執(zhí)行速度。
為了提高存取速度,通常都設置一個小容量的高速緩沖存儲器,用來存放頁表的一部分。把這部分頁表稱為“快表”。根據(jù)程序執(zhí)行局部性的特點,在一段時間內(nèi)總是經(jīng)常訪問某些頁。若把這些頁登記在快表中,就可不要從主存中查頁表,而是從高速緩沖存儲器中查快表,這樣就可縮短查找時間,從而提高了指令執(zhí)行速度。
l 頁的共享與保護
頁的共享解決共享信息的保護問題。通常的辦法是在頁表中增加一些標志位,指出對該頁信息可執(zhí)行的操作。處理器執(zhí)行指令時要核對操作要求,若想向只讀塊寫入信息,則指令停止執(zhí)行。同樣地,對共享程序塊不允許讀或?qū)懀荒苷{(diào)用執(zhí)行,否則也停止指令的執(zhí)行。當違反規(guī)定的訪問權(quán)限時,將產(chǎn)生一個“非法操作”的程序性中斷事件。