關於計算機的儲存管理,大體上其實就是如何分配記憶體的問題。我們都知道我們的程式是存放在硬碟裡的,而執行程式是需要把程式讀到記憶體裡,然後cpu才可以處理程式。在這裡,cpu和記憶體是直接交流的,硬碟和cpu是無法交流的,硬碟那就是個存東西的地。流程就是 硬碟→記憶體→cpu。
記憶體作為乙個看得見摸得著的東西,它的每乙個儲存單元都是有實際的實體地址的。這裡可以把記憶體上每乙個單元的記憶體都看做乙個小房間,每個房間都有它的唯一門牌號。
但是我們寫程式的時候,可是不知道到時候記憶體的**是空著可以使用的,我們最後究竟會放在**?所以我們的程式擁有的只是邏輯上的位址,而並不是真實的實體地址。要想要程式正常執行,我們必須把所有的邏輯位址轉換為他們真實存在記憶體上的實體地址,否則,程式連他自己的資料都找不到那還怎麼執行。
如果我們寫了一段4k的程式,它的邏輯位址可能是1-4000,但是實體地址那就沒準了,可能是1001-5000(前面的被其它程式佔了),我們要找到具體的資料,必須要從1001-5000裡面找。舉個例子,如果記憶體是房間,乙個個旅遊隊是程式的話,他們可能在出發前就有各自的序號,但是住進具體的房間後,就不能按照原來的序號了,要想找到具體的人,那得按現在重排的房間號來找,這裡的房間號就是具體的實體地址。
靜態重定位:把作業中的指令位址和資料位址全部轉換成絕對位址。
例:如果旅行隊有100人,一次性的把連續的100個房間分給他們,比如房間101—200
動態重定位:設定基址暫存器,指令執行的過程中通過位址轉化機動態的轉化位址。
例:還是那100人,分兩次來,第一波的基址是101,則他們房間動態分配為101—150,第二波的基址是301,則他們的房間動態分配為301—350
固定分割槽管理就是:把主儲存器中可分配的使用者區域預先劃分成若干個連續區,每乙個連續區稱為乙個分割槽
現在我們可以知道裝入記憶體的作業都是大小不一的連續程式段,所以最開始的記憶體就是提前分配好大小不一的分割槽,以便各種程式可以直接裝入記憶體,方便他們的重定位。
這樣設計的原因很淳樸,就像我們剛管理乙個賓館,面對乙個個不同大小的旅遊隊,他們各自都要求連續的房間,所有我們會天然的把自己的房間分成一組組大小不一的房間組,方便旅遊隊挑選合適的**。
但是暴露出來的問題就是:記憶體資源的浪費(因為不可能正好合適,每個分割槽肯定都用不完)
可變分割槽:分割槽的長度不是預先固定的,而是按作業的實際需求來劃分的;分割槽的個數也不是預先確定的,而是由裝入的作業數決定的。
由於固定分割槽造成資源的浪費,那就進行可變分割槽,你要多少記憶體我就給你多少記憶體。
按照剛才的那個例子,如果我們管理這1000房間,那麼就根據每個旅遊隊的人數具體給他們分配不同數量的連續房間。但是又出問題了,如果是100人,200人,300人按順序入住之後,200人退出之後,房間按理說剩下600間,但是如果有個500人的隊伍是進不去的,因為此時房間的狀態是 100、200(空)、300、400(空),沒有500的連續房間,如果後面有更小的隊伍,會不斷的插入連續區,隨著各個隊伍的進入,整個房間一直處於各種切斷的狀態,也就是沒有完整的連續區。
這時候,就引入了最先適應分配演算法、最優適應分配演算法、最壞適應分配演算法來解決,同時也用移動技術來集中分散的空閒區,這裡很像磁碟中的碎片清理,通過移動那些空閒區集中起來就可以得到完整的連續區。
但是這樣也會造成系統的開銷,同時移動也是有條件的,不是什麼都能移的。
分頁式儲存管理:把主儲存器分成大小相等的許多區,每個區稱為一塊。與此對應,編制程式的邏輯位址也分成頁,頁的大小與塊的大小相等。
通過分頁儲存管理,就可以解決可變分割槽必須通過移動來得到連續分割槽的困境,同時也可以有效的解決固定分割槽造成的浪費。
還是剛才的例子,如果我們繼續分1000個房間的話,我們將房間分為10間為一組(一層也可以),所以可以劃分100層,也就是10³=10²x10
¹。模擬於分頁就是分了100頁,每頁10個位址。那麼同時旅遊隊也是按照10人一組編組,有幾組就分幾層。只要我們知道自己對應的層數就可以完整的獲得所有的隊員,同理,只要我們知道程式對於的所有頁數,就可以知道程式所有的位址。
每次的劃分,我們只需要提供足量的頁數,標明每一頁具體對應的記憶體區,以及每一頁對應的程式段,就可以完成記憶體分配。這樣我們可以不用分配連續的頁數,不用移動技術來浪費開銷,也可以很好降低浪費。
回顧一下剛才的例子,1000個房間,120人,220人,320人相繼進入,220人退出後400人想要進入。
固定分割槽分為100,200,300,400,結局是:100(空),200(存120),300(存220),400(存320),後果是資源浪費;
可變分割槽處理完220退出後,結局是:120(存120),220(空),320(
存320
),320(空),即使現在共空餘540,但是400還是進不去,只有通過移動技術才可以解決;
分頁儲存管理,都以10為單位,處理完220退出後是:120(分12頁
),220(空22頁),320
(分32頁
),320(空32頁),所以空54頁,400人用其中40頁就可以解決,只需要用一張表記錄每乙個小組對應的那一頁就可以,不需要連續,完全可以分頁運算找到具體的位置。
可以看出,記憶體管理是不斷進化的,既要效率同時也要避免浪費。
在作業系統的這部分學習過程中,我們可以很好體會到硬體和軟體的結合後產生的各種問題,通過各種天才般的處理讓軟體和硬體更好的結合,充分提高效率。
作業系統儲存管理
分段單元 分頁單元 邏輯位址 段基址 32位偏移量 線性位址 虛擬位址,0 4gb 實體地址 6個段暫存器 cs code段 ss stack段 ds data段 es fs gs 通用段暫存器 16位的段選擇符就存放在以上段暫存器中 線性位址 4gb 被分成以固定長度為單位的組,即頁。頁內部連續的...
作業系統 儲存管理
儲存管理 1 所謂虛擬儲存技術,即在記憶體中保留一部分程式或資料,在外存 硬碟 中放置整個位址空間的副本。程式執行過程中可以隨機訪問記憶體中的資料或程式,但需要的程式或資料不在記憶體中時,就將記憶體中的部分內容根據情況寫回外存,然後從外存調入所需程式或資料,實現作業內部的區域性對換,從而允許程式的位...
作業系統 儲存管理
儲存管理中大概涉及到了下圖所示的這些知識點。在了解儲存管理之前,我們必須要知道計算機當中有那些儲存器,這些儲存器有那些特點,他們是如何工作的!如下圖所示 除了上面這三種儲存器,還有暫存器。暫存器是 處理器內的組成部分。暫存器是有限存貯容量的高速存貯部件,它們可用來暫存指令 資料和位址。在 處理器的控...