【操做系統】存儲器管理

相關文章(寫的較爛):
【操做系統】處理機調度簡述
【操做系統】之進程管理
【操做系統】經典的同步問題(http://www.cnblogs.com/libra-yong/p/6985526.html)html

基本概念

多層結構的存儲器系統

主存儲器與寄存器

主存儲器簡稱主存或內存, 用於保存程序運行時的指令和數據.算法

寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數據和地址.緩存

一般, 處理機從指存中讀出數據放入指令寄存器, 這一時間段咱們稱之爲取指週期; 處理機從數存中讀取數據放入數據寄存器, 再流入運算器, 這一時間段咱們稱之爲執行週期.數據結構

高速緩存和磁盤緩存

高速緩衝存儲器是介於寄存器和存儲器之間的存儲器, 主要用於備份主存中較經常使用的數據, 用來減小處理機對主存儲器的訪問次數, 提升運行效率.函數

磁盤緩存主要用於暫時存放頻繁使用的一部分磁盤數據和信息, 以減小訪問磁盤的次數.spa

程序在系統中若想成爲可執行程序, 一般須要經歷如下三個階段:操作系統

  • 編譯 : 由編譯程序對源程序進行編譯, 造成若干個目標模塊3d

  • 連接 : 由連接程序將若干目標模塊以及所需庫函數鏈接在一塊兒, 造成一個完成的裝入模塊指針

  • 轉入 : 由裝入程序將裝入模塊裝入內存code

程序的連接和裝入

程序的連接

用戶程序通過編譯後獲得一組目標模塊. 連接程序的功能即是將這組目標模塊以及它們所須要的庫函數轉配成一個完整的裝入模塊. 在對目標模塊進行裝入時, 可把連接分爲入下三種:

靜態連接
在程序運行以前, 先將各目標模塊及它們所需的庫函數連接成一個完善的裝配模塊, 之後再也不拆開.

裝入時動態連接
用戶源程序編譯後的目標模塊在轉入內存時, 採用邊裝入邊連接的方式.
在裝入一個目標模塊時, 若發生一個外部調用事件, 將引發裝入程序去找出相應的外部目標模塊, 並將它裝入內存.

優勢: 便於修改和更新, 便於實現對目標模塊的共享.

運行時動態連接
將某些目標模塊的連接推遲到程序時才執行.
在執行過程當中, 當發現一個被調用模塊還沒有裝入內存時, 當即由OS取找到該模塊, 並將之裝入內存, 將其連接到調用者模塊上. 凡在執行過程當中未被用到的目標模塊, 都不會被調入內存和被連接到裝入模塊上, 這樣不只能加快程序的裝入過程, 並且可節省大量的內存空間

程序的裝入

絕對裝入方式
在運行單道程序時, 能夠知道程序駐留在內存中的位置, 程序通過編譯後, 將產生絕對地址的目標代碼.

可重定位裝入方式
在多道程序環境下, 程序根據內存的具體的狀況將裝入到內存的適當位置.

動態運行時裝入方式
此方式在的裝入程序把轉入模塊裝入內存後, 並不當即把裝入模塊中的邏輯地址轉換爲物理地址, 而是把這種地址轉換推遲到程序真正要執行時才進行.

連續分配管理方式

連續分配是最先出現的一種存儲器分配方式大體可分爲四類:

  • 單一連續分配
  • 固定分區分配
  • 動態分區分配
  • 動態可重定位分區分配

單一連續分配

在單道程序環境下, 當時的存儲器管理方式把內存分爲系統區和用戶區兩部分, 系統區僅提供給OS使用, 它一般是放在內存的低址部分. 在用戶區內存中, 僅裝有一道用戶程序, 即整個內存的用戶空間由該程序獨佔.這樣的存儲器分配方式被稱爲單一連續分配方式.

固定分區分配

在多道程序環境下, 將用戶空間劃分爲若干個固定大小的區域, 在每一個分區中只裝入一道做業. 這樣就能夠有個多個做業裝入分區同時運行.

  1. 劃分分區方法
    • 分區大小相等
      將全部的內存分爲分區大小的塊
      缺點: 缺少靈活性
    • 分區大小不等
      將內存分爲較多較小的分區, 適量的中等的分區, 少許的大分區. 根據程序的大小爲之分配適當的分區.
  2. 內存分配
    爲便於分配, 一般將分區按其大小排隊, 併爲之創建一張分區表. 其中各表項包括每一個分區的起始地址, 大小及狀態.

動態分區分配

又稱爲可變分區分配, 它根據實際須要, 動態地爲之分配內存空間.

  1. 動態分區中的數據結構
    • 空閒分區表
      在系統中設置一張空閒分區表, 用於記錄每一個空閒分區的狀況. 每一個空閒分區佔一個表目, 表目中包括分區號, 分大小等原始數據項.
    • 空閒分區鏈
      在每一個分區頭尾部分別設置向前指針和向後指針, 分別指向前移分區和後一分區. 在分區頭部設置一些控制分區的信息, 在分區尾部重複設置狀態位和分區大小表.
  2. 動態分區算法
    • 基於順序索引的動態分區分配算法
      • 首次適應算法(First Fit)
        FF算法要求空閒分區鏈以地址遞增的次序連接.
        在分配內存時, 從鏈首順序查找大小知足的空閒分區, 按照做業大小從該分區中劃分一塊內存空間並分配給做業.
      • 循環首次適應算法(Next Fit)
        NF算法從上次找到的空閒分區開始查找, 直到找到一個知足的空閒從中劃出一塊與請求大小相等的內存空間分配個做業.該算法要求設置一塊兒始指針(指向下一次起始查找的空閒分區), 並採用循環方式
      • 最佳適應算法(Best Fit)
        BF算法每次爲做業分配內存時, 總能把知足要求, 又是最下的空閒分區分配給做業. 該算法要求全部的空閒分區按容量從小到大的順序造成一個空閒分區鏈.
      • 最壞適應算法(Worst Fit)
        WF算法在掃描整個空閒分區表或空閒分區鏈表時, 老是挑選最大的空閒區, 從中分割一部分空間個做業.
    • 基於索引搜索的的動態分區分配算法
      • 快速適應算法
      • 夥伴系統
      • 哈希算法
  3. 分區分配操做
    • 分配內存
      設請求的分區大小爲u.size, 表中每一個空閒分區的大小可表示爲m.size-u.size<=size(size是事先規定的再也不切割的剩餘分區的大小).說明多餘部分過小, 可再也不切割, 將整個分區分配給請求者. 不然, 便從該分區中按請求的大小分出一塊內存空間分配出去. 而後將分配區的首址返回給調用者.

    • 回收內存
      當進程運行完畢釋放內存時, 系統根據回收區的首址, 從空閒區鏈表中找到相應的插入點, 此時可能出現如下四種狀況之一:
      • 回收區與插入點的前一個空閒分區F1相鄰, 此時應將回收區與插入點的前一分區合併, 沒必要爲回收分區分配新表項, 只需修改其前一分區F1便可.
      • 回收分區與插入點的後一空閒分區F2相鄰, 此時也可將兩分區合併, 造成新的空閒分區, 但用回收區的首址做爲新空閒區的首址, 大小爲二者之和.
      • 回收區同時與插入點的先後連個分區鄰接, 此時將三個分區合併, 使用F1的表項和F1的首址, 取消F2的表項, 大小爲三者之和.
      • 回收區既不與F1鄰接, 又不與F2鄰接. 此時回收區創建一個新表項, 填寫回收區的首址和大小, 並根據其首址插入到空閒鏈中的適當位置.

動態可重定位分區分配

經過移動內存中做業的位置, 把原來多個分散的小分區拼接成一個大分區的方法稱爲拼接或緊湊.
在動態運行時裝入方式中, 做業轉入內存後任然是(相對)邏輯地址, 在程序指令真正要執行時才轉換爲絕對地址. 地址變換機構將相對地址轉換爲絕對地址, 地址變換機構在進程執行期間, 隨着對每條指令或數據的的方位自動進行的, 稱爲動態重定位

爲了地址的轉換不影響到指令的執行速度, 在地址變換機構中增設了一個重定位寄存器, 用來存儲程序或數據在內存中的起始地址.

與連續分配管理方式對應的是非連續(離散)管理方式, 它們包括:

  • 分頁管理方式
  • 分段管理方式
  • 段頁式管理方式

對換

對換
: 把內存中暫時不能運行的進程或者暫時不用的程序和數據換出到外存上, 以便騰出足夠的內存空間, 再把已具有運行條件的進程或進程所需的程序和數據還如內存.

對換分爲總體對換和頁面(分段)對換.

  • 總體對換
    處理機的中級調度實際就是存儲器的對換功能, 在中級調度中對換是以進程爲單位的, 故稱之爲進程對換或*總體對換**
  • 頁面(分段)對換
    該對換是以進程的一個頁面或分段爲單位進行的.
  1. 對換空間的數據結構形式與動態分區分配方式類似, 在空閒分區表的每一個表目中包含兩項: 對換區的首址和其大小, 分別用盤塊號和盤塊數表示.
  2. 對換空間的內存分配與回收與動態分區分配方式的相同.

進程的換出

將進程中的某些進程調出至兌換區, 以便騰出內存空間

  1. 選擇被換出的進程.
  2. 進程換出

進程的換入

系統應定時地查看全部進程的狀態,從中找出「就緒」狀態但已換出的進程,將其中換出時間(換出到磁盤上)最久的進程做爲換入進程,將之換入,直至已無可換入的進程或無可換出的進程爲止

分頁存儲管理方式

該方式中將用戶程序的地址空間分爲若干個固定大小的區域, 稱爲頁或頁面, 將內存分爲若干個大小的物理塊或頁框, 頁和塊大小相同, 這樣就能夠將用戶的任意頁放入任一物理塊了, 實現離散分配.

頁面: 分頁存儲管理將進程的邏輯地址空間分紅若干頁, 併爲各頁編號(0頁, 1頁, ...); 把內存的物理地址空間分爲若干塊(0#塊, 1#塊, ...);一般頁和塊的大小相同.

在進程分配內存時, 以塊爲單位, 將進程中的若干個頁分別裝入到多個能夠不相鄰接的物理塊中.
進程的最後一頁常常裝不滿一塊, 塊中剩餘的空間又沒法利用, 咱們稱之爲頁內碎片.

頁面大小: 由於頁內碎片的存在, 爲了提升塊的利用率, 頁面的大小選擇應適中, 頁面大小爲2的冪, 一般爲1KB~8KB.

分頁地址中的地址結構結構

P(31-12) W(11-0)

分爲頁號P和偏移量W. 頁號P有20個二進制位, 經過不一樣的0,1組合方式能夠指向1M(即\(2^{20}\))個頁. 偏移量W表示頁內地址, 它有12個二進制位, 經過組合能夠指向4K(即\(2^{12}\))個頁內地址(存儲單元), 即4KB, 也是每頁的大小.

若給定邏輯空間地址A, 頁面大小爲L, 則頁號P和頁內地址W可求得:
\(P=INT[\frac{A}{L}]\), INT爲整除函數
\(W=[A] MOD L\), MOD爲取餘函數

頁表: 是一個頁面映射表, 用來幫助進程地址空間的頁找到內存中對應的物理塊.
在進程空間的全部頁, 依次在頁表中有一個頁表項, 其記錄了相應頁在內存中的物理塊號.

地址變換機構

地址變換機構的功能即是將進程空間中的邏輯地址轉變爲內存空間中的物理地址.

具備快表的地址變換機構
快表: 實質爲一個高速緩衝存儲器.

分段存儲管理方式

分段存儲管理方式將用戶的程序地址空間氛圍若干個大小不一樣的段, 每段定義一組相對完整的信息. 段在內存中能夠不相互鄰接(離散分配). 存儲器分配時以段爲單位.

分段地址中的地址結構

段號 段內地址

該地址同分頁存儲管理方式相似, 分爲段號P和段內地址W.
段號P能夠指向64K個段(\(2^{16}\)), 每一個段的最大長度爲W爲64KB(\(2^{16}\)).

段表: 每一個段在表中佔有一個表項, 其中記錄了該段在內存中的段的長度和起始地址(基址).

地址變換機構

分頁和分段的區別

  1. 頁是信息的物理單位, 段是信息的邏輯單位
  2. 頁的大小是固定的, 段的長度由程序決定
  3. 分頁的進程地址空間是一維的, 分段的進程地址空間是二維的

段頁式存儲管理方式

此方式將用戶的程序氛圍若干個段,併爲每一個段賦予段名, 再在將若干個段分爲若干個頁.

段頁式的地址結構

段號(S) 段內頁號P 頁內地址W

分爲段號S, 段內頁號P, 頁內地址W

段表和頁表: 段表包括頁表始址和頁表長度等其餘信息

地址表換過程

相關文章
相關標籤/搜索