內存由大量的字或字節組成,每一個字或字節都有本身的地址。CPU根據程序計數器的值從內存中提取指令,這些指令可能會致使須要從特定的存儲器地址進行額外的加載並將其存儲到特定的存儲器地址。一般,程序以二進制可執行文件的形式駐留在磁盤上,該程序必須被帶入內存並放置在一個進程中才能執行。該執行過程可能會在磁盤和內存之間進行交互,磁盤上等待被帶入內存以供執行的進程的集合造成了輸入隊列。將程序加載到進程中執行勢必要進行內存管理,那麼咱們如何纔能有效的進行內存管理呢?算法
主內存必須同時容納操做系統和各類用戶進程。所以,咱們須要以最有效的方式在主內存中分配不一樣部分。內存一般分爲兩個分區:一個分區用於駐留的操做系統,另外一個分區用於用戶進程。咱們可能會將操做系統放在低內存或高內存中。使用這種方法,每一個進程都包含在內存的單個連續部分中。在早期對內存管理採起連續分配方式,可是咱們必須解決2個主要問題。首先是空間分配,這意味着咱們如何以連續的方式存儲數據。其次,是地址轉換,這意味着CPU生成一個邏輯地址,該邏輯地址應用於訪問輔助存儲器,而後如何將邏輯地址轉換爲物理地址以訪問主存儲器。所以,首先咱們將瞭解空間分配策略。數組
連續內存空間分配是將內存劃分爲幾個固定大小的分區。每一個分區可能只包含一個進程。在這種多分區方法中,當一個分區空閒時,將從輸入隊列中選擇一個進程並將其加載到空閒分區中。當進程終止時,該分區可用於另外一個進程。假設輔助存儲器中有進程P1,若是要將P1帶入主存儲器,則P1將以連續方式分配空間。若是有10 KB的內存,那麼咱們將分區劃分爲固定大小的分區,可是全部分區之間的大小可能並不相同。所以,這種分區方法稱爲固定大小分區。在固定大小分區中, 咱們對內存進行分區,而且每一個分區的大小都是固定的,沒法更改操作系統
舉一個栗子:當咱們去餐館吃飯時,咱們會看到那裏有固定的多個餐桌,有可供一人坐,有提供兩人坐,甚至也有提供了四人座,如此而知足光顧餐館的不一樣人數線程
如圖兩人坐,若此時來的是一我的,那麼將剩餘一個座位,若接下來餐館來了兩人以上,那麼剩餘的一個座位將再也不知足需求,這就是咱們所說的「碎片問題」。若經過連續內存空間分配將內存進行固定大小分區,如今,若是要在第2張圖片中放置大小爲4KB的進程P,則只能放置一個5KB的分區。當在5KB槽中放置4KB的進程時,將剩下1KB,這將致使內部碎片。所以,這是固定大小分區的一個主要缺點,即咱們沒法重用分區,而且會浪費內部空間。當進程從輔助存儲器移動到主存儲器時,因爲固定大小分區,因此它不會被分紅幾部分,而是總體上將其放置在主存儲器中。訪問數組是連續內存分配的一個很好例子,由於在數組中,咱們只需記住數組第一個元素的基地址,因爲內存連續,所以咱們可輕鬆訪問各個元素,因此連續分配的優勢是可快速訪問即訪問時間很是短。3d
如上,若是咱們有5KB的數據並將其放置在上述存儲塊中,那麼將沒法放置它。即便咱們有8KB可用的空間,但該8KB空間也是非連續的。這就是爲何咱們不能在內存中放置5KB數據的緣由。這將致使外部碎片。外部碎片意味着咱們能夠插入內存中的數據大小可用,但因爲空間不連續,咱們沒法放置它們。在連續內存分配的狀況下,這也是一個很是廣泛的問題。指針
爲了消除固定大小分區的缺點,引入了可變大小分區。在可變大小分區中,咱們不對內存進行分區。只要有內存,進程就會到來,咱們就會在內存中分配空間。假設內存大小爲10KB,若進程P1須要4KB,那麼咱們將爲P1分配4KB,如今剩餘大小爲6KB。假設P2須要3KB,那麼咱們將爲P2分配3KB,如今剩下3KB。在可變大小分區中,咱們不會遇到內部碎片。blog
不管咱們經過【首次適配(選擇第一知足存儲需求的可用空閒塊)】、【最優適配(選擇使用最小的可用空閒塊)】、【最差適配(選擇使用最大的可用空閒塊)】算法都會引發上述外部碎片的問題,這三個算法很簡單,在這裏我就再也不詳細闡述。隊列
因爲連續內存分配或多或少會都引發內部或外部碎片,同時也爲了更好的對內存進行利用和管理,因此纔有了咱們前面所將講解過的非連續內存分配的分段和分頁,好比其優勢除此以外呢,還有容許共享代碼和數據,支持動態加載和動態連接(接下來咱們也會講到)在這種狀況下,當進程從輔助存儲器移動到主存儲器時,咱們能夠將其分爲幾部分並放置在主存儲器中。例如鏈表,咱們能夠直接訪問鏈表的最後一個節點嗎?固然不能夠,由於咱們只能從訪問第一個節點開始,而且在第一個節點的幫助下,咱們必須遍歷到最後一個節點。同理,在非連續的內存分配中,數據會分散在內存中,而且咱們只能訪問該數據的開頭。非連續內存分配徹底不會受到外部碎片的影響。若在非連續內存分配的狀況下,能夠在上圖中插入5KB數據,由於5KB能夠分爲幾部分(第一部分爲4KB,第二部分爲剩餘1KB)。但非連續內存分配的缺點是訪問速度很是慢,由於咱們必須在指針的幫助下才能訪問其餘節點,而且必須逐個遍歷,這是很顯然也是必然的,可是它帶來的好處卻遠勝於此。進程
內存管理大概內容基本都已講解完畢,本節也是內存管理最後一小節內容,接下來咱們將進入程序執行操做、線程、進程等內容的詳細講解,感謝您的閱讀,咱們下節見。圖片