內存管理以內存分配

連續分配方式程序員

     連續分配方式指的是爲一個用戶程序劃分爲連續的內存空間。能夠把連續分配方式進一步分爲單一連續分配、固定分區分配、動態分區分配和可重定位分區分配四種方式。算法

1.單一連續分配數據結構

       在單道程序系統中,任什麼時候刻只有一個用戶程序駐留在內存。內存被劃分兩部分:系統區(供操做系統使用)和用戶區(用來存儲用戶程序和數據)。編碼

2.固定分區分配 spa

       單一連續分配只能存一個程序,爲了能同時存儲多個用戶程序,將內存分爲多個分區,每一個分區的大小固定,這就是所謂的固定分區分配。這些分區大小在操做系統初始化的時候就肯定了,每一個分區只能存放一個用戶程序。固定式分區能夠兩種方式:各分區大小相同和分區大小不一樣。爲了對分區進行分配和管理,一般按照分區大小的排隊,併爲之創建一張分區使用表。當用戶程序須要分配內存空間的時候,系統檢索該表,從表中找到一個大小知足要求且沒有被分配出去的分區,分配給用戶程序。這個分配方式的缺點是會產生內碎片,由於分區固定,分配給用戶的內存空間不是剛好匹配,這樣就產生內碎片。
操作系統

3.動態分區分配指針

      爲了減小內碎片,同時提升系統的利用率,人們提出了動態分區的概念。所謂動態分區是指事先先劃定分區的大小,根據進程的大小動態的爲之分配內存。爲了實現動態分配,系統中必須配置相應的數據結構,用來描述空閒分區和已分配分區,爲分配提供依據。經常使用的數據結構:空閒分區表和空閒分區鏈(雙向鏈表,每一個分區的起始部分設置一些分區信息和前向指針,每一個分區的尾部設有後向指針)。進程

      某個進程須要內存時,系統必需要找到可以知足需求的一個分區,一般知足需求的可能不止一個,具體分配哪個由不一樣的分配策略來決定:內存

     (1)首次適應算法(first-fit):從鏈表頭開始查找,分配找到的第一個知足要求的分區。缺點是低地址充分利用,高地址很空。隨着做業的增多,地址留下不少碎片。it

     (2)下次適應算法(next-fit):不是從頭查找,而是從上次查找的地方繼續往下查找。

     (3)最佳適應算法(best-fit):老是給內存請求者分配最適合它大小的空閒分區,提升內存利用率。實驗代表,這種方法最差,由於會致使不少的內碎片。

     (4)最壞適應算法(worst-fit):對任何給定的請求都使用當前可用的最大分區。

4.可重定位分區分配

       這種分配方式在動態分區分配的基礎上加上了內存緊湊技術。

       連續分配方式中要求做業存放在一個連續的內存空間中。當內存中沒有足夠大的空間知足用戶的請求時,這時可內存中一些小的內存空間合併成一個大的空間,這種技術叫做內存緊湊技術。實現這種技術把已佔有空間挪到一塊兒,沒被佔有的碎片空間挪到一塊兒組成一個大的空間,這樣就能知足用戶的請求。

       這種技術須要動態重定位技術配合,即一個做業裝入內存後全部的地址仍然是相對地址,在執行時轉換爲絕對地址,即做業的地址能夠在內存中隨時移動。這樣在內存的緊湊的時候只須要改變重定位寄存器能將做業的起始地址改變。


基本分頁分配方式

       分頁存儲管理將做業的邏輯地址劃分一系列同等大小的頁,將各個頁從0開始編碼。同時將內存也劃分一樣大小的連續空間,稱之爲塊或頁框。只有內存中有足夠多的頁框就可以存下用戶做業,各頁框能夠不相鄰。頁框的大小應該始終(512B-8KB)。

       分頁系統中的地址結構由兩部分組成:頁號和頁偏移量。

       在分頁系統中,頁的存放能夠是連續的也能夠是不連續的,這就增長了邏輯地址到物理地址的難度由於不連續。爲此,系統爲每一個進程建立了一個頁表,在邏輯空間中的每一頁,依次在頁表中有一個表項,記錄了對應的物理塊號。看下圖:


注:上面的轉換是由硬件完成的,由專用的寄存器 (頁表寄存器),而加法只是一個拼接,高20位物理頁號與低12位偏移量拼接成最後的物理地址。

       從上面的分析能夠發現地址變換的第一步就是檢索頁表。爲了實現快速檢索頁表,最好把頁表放在寄存器中,每一個表項用一個寄存器實現。若是每頁的大小爲4KB,則32位地址將有1M個頁面,即有一個1M個頁表項,每一個頁表項若是佔1B,則頁表將佔用1MB。系統中設有一個頁表寄存器,存儲了頁表的開始地址和頁表長度。平時進程未執行的時候,頁表的開始地址和頁表的長度存放在PCB中,當進程運行時,將這兩個數據導入到頁表寄存器。

       因爲頁表時放在內存中的,那麼訪問一次數據須要兩次訪問內存,第一次訪問頁表,第二次找到對應的物理塊號與偏移量拼接造成物理地址。 爲了提升速率,在地址變化機構中增長一個TLB(所謂的快表),用來存放當前訪問過頁表項。給定一個地址首先在快表中查找,找不到才轉向頁表查找。

       因爲頁表佔有1MB,且頁表的空間是連續存儲的,這顯然是不對的。解決的辦法是對把頁表看出普通的文件,對頁表再分頁存儲就造成了所謂的多級頁表。可是隨着頁表的分頁級數增長,訪問內存的次數也就要增長,這樣會增長系統的開銷,因此慎重。下面是一個二級頁表的圖:


       另外,頁面選擇不易過大(內碎片嚴重),不易太小(訪問內存的次數就增長了)。


基本分段分配方式

       分頁存儲管理能夠實現內存利用率的提升,可是一個獨立的邏輯段被離散的放在不少物理塊中,不少時候程序員但願把一個程序按照它的邏輯結構存放。

       一個程序的邏輯段在程序運行過程當中有的大小會發生變化,例如數據段和堆段。而有的邏輯段的大小運行過程當中不發生變化,如代碼段。在分頁存儲管理方式中,對於隨時動態增大的段的存儲管理是很是困難的,一旦涉及到段的增大涉及到從新分配物理塊,那麼就涉及增長頁表的修改過程。(說簡單點,分別創建來了數據段,代碼段,堆棧段)

     分頁系統中,過程被一個一個牢牢的存放在一塊兒,中間沒有空隙。這就致使修改一個過程的大小會影響到其餘地的起始地址,進而須要修改全部調用被移動的進程,以使它們訪問指向這些過程的新地址。一樣,在分頁系統中,一個邏輯段可能存放n個物理塊中,若是幾個程序共享這段代碼,須要在每一個程序填加相應的表項,增長開銷。

       分段存儲系統中,邏輯地址包括段號和段偏移量。


       分段系統中,系統爲每一個分段分配一個連續的分區,進程的各個段能夠離散地裝入內存中的不一樣的分區中。爲了實現邏輯地址到物理地址的轉換,在系統中爲每一個進程創建一個段表。(邏輯地址到物理地址轉換跟分頁系統同樣,只不過查找的是段表)

       分段系統經過不一樣進程段表中的行指向同一段地址來實現代碼的共享。(段的大小是不固定的)。


注:倘若共享一個160K代碼,若是有10個用戶程序須要共享這段代碼。在分頁系統中,這個共享代碼有40個頁表項(假設每頁大小4K),則每一個用戶程序須要添加40個頁表項,則總共要添加40*10 = 400個表項。而若是是分段系統的話,只須要額外的添加10個段表項就好了。是否是節省了空間。


段頁式分配方式

       在段頁式存儲管理中,用戶地址空間被劃分爲多個段並每一個段予一個段名,對每一個段在劃分爲多個固定大小的頁,頁大小就是主存中物理塊的大小。

       在段頁式系統中,地址由段號、段內頁號和頁內地址。


       在段頁系統中,爲了將邏輯地址轉換爲物理地址,須要查找段表和段內頁表。段表中存放的頁表的起始地址和頁表長度。在段內系統中爲了得到一條指令或者數據,須要三次訪問內存。爲了提升執行速度,在地址變化機構中增長一個高速緩衝寄存器,每次訪問它時,都續同時利用段號和頁號去檢索高速緩衝。找不到匹配項時,按照正常的段表-》頁表順序去查找。

相關文章
相關標籤/搜索