進程如何使用內存
進程是操作系統資源分配的最小單元。操作系統分配給進程的內存空間中包含五種段:數據段、代碼段、BSS、堆、棧。
數據段:存放程序中的靜態變量和已初始化且不爲零的全局變量。
代碼段:存放可執行文件的操作指令,代碼段是隻讀的,不可進行寫操作。這部分的區域在運行前已知其大小。
BSS段( Block Started By Symbol):存放未初始化的全局變量,在變量使用前由運行時初始化爲零。
堆:存放進程運行中被動態分配的內存,其大小不固定。
棧:存放程序中的臨時的局部變量和函數的參數值。
內存區域中以上五個段的組織形式:
邏輯地址、相對地址與物理地址
邏輯地址:與當前數據在內存中的物理分配地址無關的訪問地址,在執行對內存的訪問之前必須轉化爲物理地址。
內存管理技術
幾種內存管理技術整理
技術 |
簡要說明 |
優點 |
缺點 |
固定分區 |
主存被分爲很多大小固定的分區,進程可以裝載到大於等於自身大小的分區。 |
實現簡單 |
1.有內部碎片 2.活動進程的數目是固定的 |
動態分區 |
分區是被動態創建的,進程可以裝載到正好等於自身大小的分區。 |
沒有內部碎片,內存使用更完全 |
有外部碎片,需要壓縮外部碎片 |
簡單分頁 |
主存被分爲很多大小相同的幀,進程被分爲很多與幀大小相同的頁。要裝入一個進程,需要將進程所有的頁裝入主存,可以是不連續的幀中。 |
沒有外部碎片 |
有很少的內部碎片(僅出現在進程的最後一頁) |
簡單分段 |
進程被分爲很多的段,要裝入一個進程,需要將進程所有的段裝入主存中不一定連續的動態分區。 |
沒有內部碎片,比較與動態分區,內存利用率更高,開銷小 |
有外部碎片,需要壓縮外部碎片 |
虛擬內存分頁 |
與簡單分頁相比,不需要將進程的所有頁裝入主存 |
|
複雜的內存管理開銷 |
虛擬內存分段 |
與簡單分段相比,不需要將進程所有的段都裝入主存 |
具有虛擬內存分頁的三個優點,並且支持保護和共享 |
複雜的內存管理開銷 |
分頁
邏輯地址到物理地址的映射過程
1. 提取頁號,即邏輯地址最左的n位
2. 以這個頁號爲索引,查找該進程頁表中相應的幀號k
3. 該幀的起始物理地址爲k*2^m,被訪問字節的物理地址是這個數加上偏移量
騰訊今年的實習生筆試的某個選擇題
根據上面的三個步驟可以很容易得到結果:物理地址 = 3 * 8 * 1024 + 9612 % 8192 = 25996
分段
邏輯地址到物理地址的映射過程
1. 提取段號,即邏輯地址最左的n位s
2. 以這個段號爲索引,查找該進程段表中該段的起始物理地址
3. 最右m位表示偏移量,偏移量和段長度比較,如果偏移量大於該長度,則該地址失效
4. 物理地址爲該段的起始物理地址加上偏移量的和
分頁、分段的特點
1. 進程的所有存儲器訪問的都是邏輯地址,在運行時動態地轉換爲物理地址。
2. 一個進程可以劃分爲許多塊,在執行的過程中,這些塊不需要連續的存在主存中。
段頁式結合
對於每一個虛擬地址,處理器使用段號檢索進程段表來尋找該段的頁表;頁號用來檢索頁表並查找到幀號。