天天看點

3.2 存儲(第一部分)

作業系統的存儲部分.主要有實存的管理和虛存的管理.存儲涉及到的知識點很多,有實存的管理,虛存的管理,cache,cache與主存之間它的命中率的一些計算其實也是存儲相關的,存儲的一個容量計算.

這些内容是如何分類的呢?在硬體部分(組成原理和體系結構當中),有存儲一部分的知識.作業系統裡面也有存儲這一塊的知識.它們的分類就是軟體部分的處理放在作業系統部分來講,而硬體相關的放在組成原理那一部分來講.

比如說實存管理和虛存管理都是用軟體的方法來管理存儲器.這樣子這一部分的内容就歸為作業系統.

虛存的管理是最為重要的.也就是斷頁式的管理.

3.2 存儲(第一部分)

在程式執行之前,也就是說把程式調入記憶體,CPU要通路記憶體之前,才把位址轉換出來.這裡為什麼要進行位址的轉換呢?

3.2 存儲(第一部分)

這是我們的程式所要使用到的存儲空間.由于程式它是一個比較獨立的一個概念,它要用到的空間它所指定的位址會是從0開始進行編址.這個位址稱為一個邏輯的位址.但是當程式調入到記憶體去執行的時候往往無法用到這些位址,比如說從0開始到5000這個位址段它肯定是不會被這一個作業所執行的.因為記憶體空間前一部分位址一般是配置設定給作業系統來使用的.是以留給使用者的記憶體空間可能就是從10000開始的或者是從15000開始的,或者說是使用者空間分成了很多個區域,有從10000開始的有從20000開始的也有從25000開始的位址空間.然後像這麼一個作業它要占用5000個記憶體單元,5000個位元組的記憶體單元.那麼我們就把它裝入從10000開始到15000截止的一個記憶體單元.然後就把整個的程式段(能夠執行的指令)等于是拷貝到了記憶體中.分析這種拷貝方式進去執行過程中會不會産生什麼問題?比如說在這個程式當中它就出現了一條指令,就是在1000條指令的位置出現了一個LOAD 1,2500.這一句指令的含義就是從2500号記憶體單元(存儲單元).2500是一個位址,是程式内部所使用的一個虛拟位址.從2500号單元取出資料365到寄存器1,這個程式的這個邏輯是沒有問題的.因為2500号邏輯位址确實對應的是365這一個資料.而當我們把這一個位址空間映射到了記憶體當中的時候,情況就發生了改變.我們知道程式的起始位址由0變為了10000,這一條指令LOAD 1,2500由1000的位址空間變為了11000的位址空間.但是程式内部它用到的這個位址還沒有發生變化.還是LOAD 2500到1号寄存器.這時的2500就不再是365了,是一個什麼資料我們不清楚,可能讀到的是作業系統用到的一個資料,也可能讀到的是一個使用者其他程式的一個資料.因為現在的365它的記憶體空間位址已經變為了12500,是以這樣的一個程式它的邏輯位址在程式編制的時候它是沒有錯誤的,但是當它讀到記憶體當中進行運作的時候就發現了位址的錯誤.錯誤的主要原因就是因為邏輯位址和實體位址它不對應.不對應的話我們就要想辦法讓它對應起來,對應起來就有一個位址的轉換過程.這個位址的轉換過程我們就稱它為重定位.

那麼這一個程式裝入它的正确過程應該是怎樣的呢?就是把這一段指令拷貝過去的同時把所有指令當中牽涉到的邏輯位址全部進行轉換.比如說這個2500我們就要進行轉換,轉換成2500+記憶體的起始位址=12500.是以說11000号這一條指令也就是邏輯位址為1000的這一條指令它要改為LOAD 1,12500.這樣的一個位址它就正确了.因為它實際上在記憶體中的位址應該是12500.12500就對應了這個365.可以正确地把這個365取出來.然後我們就稱這種在程式的裝入過程中把所有的位址(虛位址)變為實位址的過程稱為靜态的重定位.因為它這個過程當中它會一次性地把所有的位址全部改為絕對位址.而這個絕對位址是不會發生改變的.你在程式的運作過程中也無法對它再進行一個更改/修改的過程.是以稱為一個靜态重定位,它是一次性的一個過程.

3.2 存儲(第一部分)
3.2 存儲(第一部分)

動态重定位是把程式/一個作業調入記憶體之後,然後它這個位址空間不發生變化.也就是它還是LOAD 1,2500.剛才不是說了,不把位址轉換出來它可能就會産生錯誤.我們要如何來解決這個問題呢?

它還是有方法可以解決的,就是CPU要執行這一條指令的時候,我們就要對這個位址進行重新的核算.重新核算看從虛位址轉為實位址,重新的核算的過程是怎樣的呢?就是把這個相對的這個虛位址給取出來,取出來然後與重定位寄存器中的一個值進行相加,相加之後就得到了實位址.然後從這個實位址去取這一個資料出來.而重定位寄存器中存的是什麼呢?存的是我們裝入主存的時候它的一個主存起始位址:10000.這樣的一個過程就是動态的重定位.

實存部分:

其實實存部分考的知識點是比較少的.主要是為了講虛存,是以也要把實存拿出來講一講.這樣子可以讓大家更深刻地了解虛存和實存的差別.概念上的差別.實存的管理是對實實在在存在的這個主存的一個管理,虛存的管理待會會講到.虛存和實存在概念上的差別:

實存的管理管理到的全部都是實實在在的記憶體/主存,虛存是一種折中的方案,由于記憶體數量少外存數量多,為了解決記憶體數量少的問題我們就用一定的外存來當做記憶體使用.

引入了虛存的概念那麼我們就有可能執行大的程式,比如我的記憶體現在是640KB,然而我現在要運作的程式它需要耗費的記憶體為1MB,如果僅僅有實存的管理而沒有引入虛存的概念那麼這一個系統它是無法執行這一個1MB的程式的.因為記憶體無法裝入這個程式而虛存它就不一樣了,虛存它可以把這一個程式進行分段、分頁,把它拆分為幾個部分依次裝入主存.其實這種處理方法是非常科學的.虛存處理大的程式的過程是一個非常科學的過程.

在實存的管理部分通常會把主存進行配置設定,配置設定的話有幾種配置設定方案.第一種配置設定方案就是單一的連續配置設定,第二種是固定分區配置設定,第三種是可變分區的配置設定.三種配置設定方式各有特色.

單一配置設定和固定配置設定都是屬于靜态的配置設定法.靜态的含義是配置設定完之後它就不再做調動/調整了.靜态重定位就是一旦重定位完成以後它就不再做修改,這裡就是進行單一連續配置設定和固定分區配置設定的時候一旦配置設定完成就不再做處理了.而可變分區的配置設定它是在配置設定完之後它是可以靈活地調動的.

系統給使用者的存儲空間是64KB.單一連續配置設定它就是把整個的使用者記憶體區劃為一個塊,這樣做的缺點是它同一時間隻能夠在記憶體當中裝入一個程式,無法裝入多個程式.是以這種配置設定方式最多隻能夠用于單使用者的作業系統,而且是單使用者單任務,它無法同時執行多個任務,而隻能夠執行一個任務.因為它把記憶體已經劃為了一個區,一個塊.

固定分區配置設定方案.單一連續配置設定它是把整個記憶體區劃為一個區,而固定分區配置設定它就存在着一個分區的過程了.它就把記憶體分成了幾塊.64KB記憶體分成了10KB,22KB,32KB這三個塊.這三個塊就使一種現象成為可能,我要運作三個程式,一個程式占用空間是5KB,另外一個是10KB,第三個是20KB.這三個程式可以同時被裝入記憶體,分别裝到這三個區當中來.這種分區配置設定方案把分區給定死了,就是一旦分區完成就隻有10KB,22KB和32KB這三個區,無法再做變更.比如說我現在要執行一個35KB的程式,那麼這一個記憶體系統它就不能夠執行這樣的程式.因為它每一個區都不夠35KB的大小.但是即使它們三個區都空閑都無法把它們進行合并來執行一個大的程式,是以記憶體雖然有64KB,但是無法執行一個35KB的一個程式.這也是固定分區的它的一個弊病所在.

第三種是可變分區,可變分區采用的是動态的配置設定方法.可變分區最初的一種狀态和單一連續配置設定是一樣的.就是還沒有執行任何的使用者程式的時候它是一個空白的大區.當有程式裝入的時候它就開始進行分區了.比如說作業1需要5KB的記憶體,那麼作業系統就給作業1劃分5KB的記憶體,作業2需要10KB的記憶體是以當作業1在運作的時候空閑區就隻剩下59KB了,第二個作業進來的時候它需要10KB的資源,那麼作業系統就從這個剩餘的59KB的資源當中給它劃了一塊10KB的,作業3進來的時候它需要20KB的資源,那麼作業系統就從這個剩餘的空間裡面又劃了一個20KB的空間給作業3,當作業1執行完畢的時候它這一塊空間它就空餘出來了,就空餘出來一塊5KB的資源.同時如果作業2它的10KB的這個程式執行完了,作業2也會釋放它的資源.這裡就有一個10KB的塊了.但與這種固定分區有不同的就是說它雖然這裡分了5KB這裡分了10KB,但是當它兩個都是空閑的時候,那麼這兩個分區可以進行合并.它合并成為一個15KB的單元.也就是說如果說作業3在執行完畢的時候它釋放了20KB的資源,現在系統的64KB的資源又合成了一個整體的塊了.是以可變分區配置設定方案它的适用範圍和靈活度大一些,就是我們剛才說的作業1和作業2執行完了空閑區就會進行合并,合并成一個大的空閑區.是以可變分區配置設定方案就比較靈活了.當然靈活意味着需要花更多的資源去對它進行管理,是以說我們待會就要講一講可變分區配置設定方案的幾種管理方式,對空閑區的一種管理方式.

這裡舉的例子是一種比較理想的狀态.就是為了讓大家不混淆概念,是以我是取了64KB從0000H開始到FFFFH.而通常情況下想要達到這種效果是不可能的,因為記憶體區它要分一塊給作業系統用,作業系統它的記憶體空間是占了前面的一部分,基本上都是占前面的一部分是以一般在使用者區前面它會有一塊記憶體是用于作業系統專用的.是以往往使用者的記憶體不是從0開始.但是這個不要緊,我們了解這一個概念就可以了.

3.2 存儲(第一部分)

可變分區配置設定方案的幾種配置設定算法.

當程式運作到一定的程度,系統運作了一段時間以後,它的記憶體區肯定不是一個連續的區域,因為它執行了一些程序又釋放掉了一些資源這樣反反複複可能現在的記憶體空間就是非常零散的一些資源,第一段一個5KB的空閑區,第二段是一個作業在運作,第三部分它可能又是一個空閑區,第四部分它又是一個作業在運作.這樣它記憶體的空閑區可能就分成了很多個小塊,這樣當記憶體中要調入新的作業的時候我們就要考慮把這個作業放在哪一塊空閑區比較合理.這樣子就形成了配置設定算法,就是我們以什麼樣的一個規則來把作業調入空閑區這樣的一個過程,是以我們提出來這四種算法.

最佳适應算法:把程式/作業放到和它大小剛好合适或者是大小接近的一個記憶體區當中.

首次适應法:從主存低位址開始,把所有的自由區可以說是連成一個串,第一個空閑區第二個空閑區第三個空閑區,你要裝入一個作業的時候就要從第一個空閑區開始判斷,判斷這個空閑區的大小是不是比你作業的大小要大,如果說比你作業的大小要大的話那麼我們就從空閑區劃一塊空間給這個作業使用.也就是說隻要第一次發現了這種比作業大的空閑塊,我們就把這個作業放進去執行.這樣子它就是一種首次/第一次适應算法.第一次适應那麼我們就給它進行配置設定.這種算法可以快速地進行記憶體的配置設定,

最差适應算法:最佳适應算法雖然每一次的運作、每一次的配置設定它都會把與作業大小基本上相符的記憶體塊配置設定出去,看上去它是一種最佳的方案.但是實際上是存在着問題的.比如一個6KB的塊裝入了5KB的程式,那麼就形成了一個1KB的空閑區.這個1KB的空閑區是一個很小的空閑區,它往往無法被任何的一個程式/一個作業所使用.因為很少會有1KB這麼大的作業.是以說多次進行這種适應配置設定的話,它就産生了一個問題:系統中間的記憶體的這種碎片越來越多,這種碎片又無法得到使用.是以說到後期執行了很多次這種配置設定之後可能系統就存在很多很多這種碎片,是以這種最佳适應算法它也是有弊端的.

 循環首次适應算法:和首次适應算法非常類似.唯一不同的是首次适應算法它是每次從主存的低位址出發尋找可用的記憶體區.而循環首次适應算法,

3.2 存儲(第一部分)

例題:

 計算機系統中給使用者使用的記憶體大小是128KB.

最佳适應算法把記憶體空閑區進行一個排列,從小到大的一個排列.10KB<25KB<28KB.

最差适應算法是最佳适應算法的逆過程.

循環首次适應算法是從上一次執行完的地方開始算起.

3.2 存儲(第一部分)

軟考的真題: