進(jìn)程使用內(nèi)從內(nèi)存的界定
- 一個進(jìn)程使用的地址范圍 基地址寄存器 和 界限地址寄存器 決定
- 基地址是開始位置 界限地址寄存器是偏移量
內(nèi)存空間劃定意義
- 避免系統(tǒng)區(qū)域被用戶程序修改
- 確保用戶進(jìn)程不被其他進(jìn)程訪問
地址綁定
-
地址綁定
是進(jìn)程內(nèi)內(nèi)存到物理實際內(nèi)存的映射 - 物理地址可以直接尋址
-
地址綁定是邏輯地址到物理地址的映射
源程序中的地址 -> 可重定位地址-> 絕對地址 -
3種情況
編譯時就知道進(jìn)程在內(nèi)存中的地址
加載時進(jìn)行 編譯器生成可重定位代碼后
運行時進(jìn)行 進(jìn)程可以從一個內(nèi)存段移到另一個內(nèi)存段,猶如動態(tài)鏈接庫
LINUX內(nèi)存文件
- 6列 地址范圍 權(quán)限 偏移量 設(shè)備 節(jié)點 路徑
動態(tài)加載
-
優(yōu)點
不使用的程序不會加載到內(nèi)存
適合操作大量不常發(fā)生的事件
不需要操作系統(tǒng)特別支持退疫,由程序員設(shè)計 - 本質(zhì)是融柬,進(jìn)程運行時載入了一段別的代碼,用于使用
交換 本質(zhì)是主存進(jìn)程的交換
- 交換到快速磁盤
-
換出再換入時調(diào)入哪個內(nèi)存的算法
編譯時決定 加載時決定 運行時決定
內(nèi)存分配 實際上是進(jìn)程放在內(nèi)存的哪里比較好
連續(xù)分配
- 多分區(qū)方法 多個固定大小分區(qū) 分區(qū)大小相同 分區(qū)大小不同
- 可變分區(qū)方法 內(nèi)存記錄已用未用內(nèi)存肪笋,就是實驗4內(nèi)容
不連續(xù)分配
- 分頁 進(jìn)程塊為頁 內(nèi)存塊為幀
- 一個進(jìn)程分的內(nèi)存塊可以不是連續(xù)的
- 一個進(jìn)程持有一個頁表
頁表
-
頁表的地址變換
頁號:頁表基地址 與 頁偏移:與頁表基地址形成幀號 - 頁表的實現(xiàn) 可用專用寄存器 或 載入內(nèi)存 來實現(xiàn)
-
頁表載入內(nèi)存的問題
為了訪問數(shù)據(jù)需要兩次訪問內(nèi)存
第一次為了獲取頁表信息
第二次為了使用頁表信息訪問數(shù)據(jù) -
地址轉(zhuǎn)換旁觀緩沖
使用高速緩沖區(qū)存放頁表
訪問數(shù)據(jù)只需要訪問一次 -
在分頁環(huán)境下實現(xiàn)內(nèi)存保護(hù) 使用保護(hù)位
頁表的長度是固定的,如果有程序不需要用到所有的頁表的話度迂,必定有尾部幾塊的頁表是無效的藤乙,所以要避免進(jìn)程訪問不屬于它自己的數(shù)據(jù) -
分頁優(yōu)點
使用共享頁表實現(xiàn)代碼共享 -
頁表結(jié)構(gòu)
層次頁表:
避免進(jìn)程同一時間持有的頁表過于龐大,層次頁表的本質(zhì)是 按需讀區(qū)某一小段的頁表惭墓,使其他頁表強(qiáng)制失效
多級頁表示意圖
哈希結(jié)構(gòu):
邏輯地址的定義為:虛擬頁碼 + 偏移量
哈希頁表每一條目是鏈表坛梁,鏈著 虛擬頁碼,此頁對應(yīng)的幀號腊凶,下一個元素指針
通過進(jìn)程頁號轉(zhuǎn)移到哈希表中 -> 找到對應(yīng)的幀號 -> 用幀號與頁偏移形成物理地址
反向頁表:
不是重點罚勾,不做贅述