寫在前面 本系列的文章是博主邊學邊記錄的,可能不是特別的正確,因為會加上博主自己的理解,僅供參考。 正文: 為了能夠將用戶程式裝入記憶體,必須為它分配一定大小的記憶體空間。常見的分配方式有: 1.連續分配 連續分配方式是最早出現的一種存儲器分配方式,該分配方式為一個用戶程式分配一個連續的記憶體空間。常見的 ...
寫在前面
本系列的文章是博主邊學邊記錄的,可能不是特別的正確,因為會加上博主自己的理解,僅供參考。
正文:
為了能夠將用戶程式裝入記憶體,必須為它分配一定大小的記憶體空間。常見的分配方式有:
1.連續分配
連續分配方式是最早出現的一種存儲器分配方式,該分配方式為一個用戶程式分配一個連續的記憶體空間。常見的連續分配方式有:
1.單一連續分配
單一連續分配適合早期的單道批操作系統,在用戶區中,僅裝入一道用戶程式。整個記憶體的用戶空間由該程式獨占。這樣的存儲器分配方式稱為單一連續分配。
2.固定分區分配
在多道程式系統中,為了在記憶體中裝土多道程式,且這些程式之間又不會發生相互干擾,於是將整個用戶空間劃分成若幹隔固定大小的區域。每個分區中只裝入一道作業。這樣形成了最早、也是最簡單的一種可運行多道程式的分區式存儲管理方式。
劃分分區的方法:
1.將用戶空間劃分成若幹個固定大小的分區
這種分配方式缺乏靈活性。但是對於利用一臺電腦同時控制多個相同大小對象的場合,這種劃分方式比較方便和使用。
2.將用戶空間劃分成若幹個大小不定的分區
這種分配方式靈活性較高,通常式根據用戶的需求來進行劃分。為不同大小的進程分配不同的記憶體空間。
分區表:
為了便於記憶體的管理,通常將記憶體按照其大小進行排隊,併為之建立一張分區使用表。
分區表包括每個分區的起始地址,大小、狀態等。
3.動態分區分配
為了實現動態分區分配,系統配置了相應的一些數據機構。用以描述空閑分區和已分配分區的情況。常見的數據結構有:
1.空閑分區表
在系統中設置一張空閑分區表,用戶記錄每個空閑分區的情況。包括分區號、大小、起始地址等。
2.空閑分區鏈
以鏈表形式組織空閑分區。
3.動態分區分配演算法
為了實現動態分配呢,通常將系統中的空閑分區鏈接成一個鏈。下麵介紹下基於順序搜索的動態分區分配演算法:
所謂順序搜索,是指依次搜索空閑分區鏈上的空閑分區,去尋找一個其大小能夠滿足要求的分區。常見的演算法有:
1.首次適應演算法 FF
特點:
空閑分區鏈以地址遞增的次序鏈接。
流程:
每次都從鏈首開始順序查找,直至找到一個大小能滿足要求的空閑分區為止。然後進行切割分配。
優點:
該演算法優先利用記憶體中低地址的部分的空閑分區,從而保留了高地址部分的大空閑區。為大作業分分配大的記憶體空間創建了條件。
缺點:
1.每次查找都從頭部開始,會增加查找可用空閑分區的開銷
2.低地址部分不斷被劃分,會留下很多難以利用的小空間,也就是外部碎片。浪費記憶體空間。
2.迴圈首次適應演算法 NF
區別於首次適應演算法,NF不再是每次都從鏈首開始查找,而是從上次找到的空閑分區的下一個空閑分區開始查找,直至找到一個能滿足要求的空閑分區。
3.最佳適應演算法 BF
最佳適應演算法,每次分配空間的時候,總是把能滿足要求、又是最小的空閑分區分配給作業。避免"大材小用"
同樣也是從遞增的方式形成空閑鏈表。每次分配完記憶體後,要進行及時的調整,保證鏈表的遞增性。
該種分配方式,也同樣有可能造成碎片化。
4.最壞適應演算法 WF
以遞減的方式形成空閑鏈表,分配作業的時候,總是挑選一個最大的空閑分區,從中分割一部分存儲空間給作業使用。
缺點:
導致存儲器中缺乏大的空閑分區,所以稱為最壞適應演算法。
提一個問題,BF和WF真的就是最好或者最壞的嗎?
其實不然,BF看似每次分配的都是最佳的方式,但是每次分配後所切割下來的剩餘部分總是最小的。這樣會形成大量的碎片。
而WF,由於每次都是從大空間中切分出去要分配的空閑,可使剩下的空閑分區不至於太小,產生碎片的可能性小。對中、小型作業有利。WF查找效率也很高,查找的時候只需要看第一個分區能否滿足作業要求即可。
可見,沒有最好和最壞一說,各有所長,也各有所短。
4.動態可重定位分區分配
首先在這裡面涉及一個"緊湊"的概念,就是將記憶體中不相鄰的作業移動,使得之間間距的空間碎片聚集到一起,形成一個空用的空間。看下圖應該就懂了.......
可以看到後,緊湊後,空間得以重新利用。但是程式的地址也發生了改變。所以在每次緊湊後,都必須對移動的程式和數據進行重定位。但是這樣做,很是麻煩。於是引入了動態重定位:
為了使得地址的轉換為不會影響到指令的執行速度,必須有硬體地址變換機構的支持。於是引入一個重定位寄存器。用它來存放程式在記憶體中起始地址。
2.離散分配
上面我們瞭解了連續分配會形成許多碎片,雖然可以通過緊湊方法將許多碎片拼接成可用的大塊空間,但是必須付出很大的開銷。如果允許將一個進程直接分散的裝入去多不相鄰接的分區中,便可以充分的利用記憶體空間。而無須再進行緊湊。
基於這一思想,產生了離散分配方式,根據離散分配時所分配地址空間的基本單位的不同,又可以將離散分配分為以下三種:
1.分頁存儲管理方式
分頁存儲管理方式,個人理解的是將用戶程式的離散的存入到不同的物理塊中,但是為了找到這些程式的地址,需要用一個數據結構來記錄。這個數據結構就是頁。當然一般情況下將頁組織起來,形成該程式的頁表。從而讓系統得知該程式分配在記憶體中的哪些物理塊中。
補充一下分頁涉及的概念:
1.頁面。分頁存儲管理將進程的邏輯地址空間分成若幹個頁,併為各頁加以編號。同時也將記憶體的物理地址空間分成若幹個塊。
一頁對應一個塊。在進行分配記憶體的時候,以塊為單位,將進程中的若幹頁分別裝入到多個可以不相鄰的物理塊中。
2.頁面大小:顧名思義,但是頁面大小要適中選擇,不能過大也不能過小。
3.地址結構
分頁地址中的地址結構:
4.頁表
為了保證進程能夠在記憶體中找到每個頁面所對應的物理塊,系統為每個進程建立了一張頁面映像表。簡稱為頁表。
TLB(Translation Look aside Buffer) /快表:
頁表是存放在記憶體中的,cpu每次存取一個數據的時候,都要訪問兩次記憶體。第一是訪問頁表,從中找到指定頁的物理塊號,形成物理地址。第二次是訪問該物理地址,並寫入或者取出數據。可見效率是比較低的。
為了提高地址的變換速度,可以設置一個緩衝寄存器,也就是TLB。用來存放之前訪問的那些頁表項。再進行查找的時候,可以先查找TLB。如果命中,可直接讀出改頁對應的物理塊號,並寫入物理地址寄存器中。
沒有命中的化,還是需要再次訪問頁表。後期把本次頁表項存入快表中。從而提高訪問的速度。
2.分段存儲管理方式
分段存儲管理方式主要是為了滿足用戶在編程和使用上多方面的要求。像主程式段、子程式段、數據段、堆棧段等等。因此分段存儲大小並不固定,因為每個段的大小並不是固定的。
分段地址的結構:
段表:和頁表的作用是一樣的,方便程式定址。看一下段表的組成:
當採用分段的方式分配空間的時候,需要先比較分區的大小也就是段長是否合適,否則是不能夠分配的。
3.段頁式存儲管理方式
分頁系統以頁面作為記憶體分配的基本單位,能夠有效的提高記憶體利用率。分段系統以段作為記憶體分配的基本單位,能夠更好地滿足用戶多方面地需求。所以,我們可以對這兩種存儲管理方式各取所長,則可形成一種新的存儲管理方式,也就是段頁式存儲管理方式。
分段和分頁是有很大區別的,下麵具體來看下它們的區別吧!!
總結下分段和分頁的區別
1.分頁是系統管理上的需要,完全是系統來進行管理的,對於用戶是不可見的。分段目的主要是更好地滿足用戶地需求。是信息邏輯上地單位。
2.頁得大小固定且有系統進行決定。這裡指的是物理塊或者說頁面大小是固定的。但是分段則不是,每段的長度取決於用戶所編寫的程式。
3.分頁的用戶程式地址空間是一維的。分段是二維的,因為程式員在編程的時候需要給出段名和段內地址。
以上就是本文的所有內容了,我們下篇再見
不驕不躁,保持學習