1. 程式人生 > >Linux記憶體管理中的分頁,分段

Linux記憶體管理中的分頁,分段

什麼是分頁?

無論你的NT伺服器的記憶體有多大,它總是顯得不夠充足。當物理RAM從低端開始執行時,Windows NT使用了分頁檔案Pagefile.sys。

為了執行不同的程序和應用程式,Pagefile.sys給實體記憶體分配了一些空間。在這些空間內允許交換資料頁。

分段?

程式分段的好處。

cpu中的段暫存器中儲存了段址(base)和偏移值的上限(limit)。段址:有效地址 中,如果有效地址大於limit,便會引發異常。

這樣就可以限制程式不能範圍當前段外的資料,不能訪問其他程式的資料。總之就是不能訪問它不能訪問的資料。

面向物件的好處。

物件就是一塊連續的記憶體中的資料吧。這點跟上面一點類似。通過限制訪問,就做到了private的效果吧。

分段與分頁:

(1)記憶體分段和記憶體分頁一樣都是一種記憶體管理技術,分段是為了許可權保護,分頁是為了虛擬記憶體.

 (2)分段後,程式設計師可以定義自己的段,各段有獨立的地址空間,象程序的地址空間互相獨立一樣.

 (3)同一個類的例項分配在一個段中,只有該類的方法可以訪問,如果其他類的方法去訪問,會因為段保護而出錯.可以從硬體上實現類的資料保護和隱藏

什麼是缺頁?

為什麼會出現缺頁?你的問題中已經有了答案。實體記憶體和系統“提供”給使用者的記憶體的不對稱性。是不是很容易就出現缺頁的情況?像windows nt這樣的系統,

每個程序擁有4G的虛存,記住,是每個程序。其中3-4G影射為作業系統的核心,是隻讀的,1-2G對映為使用者空間,其中一部分是系統提供的動態連結庫。

對於每一個程序,作業系統只向實體記憶體對映少數的地址,這是因為 RAM 實在是太寶貴、太稀缺了。程序的剩下的記憶體實際上都儲存在二級儲存器

(通常是硬碟)上。這就是為什麼要叫虛擬記憶體的原因。沒有對映到物理 RAM 的地址都被做上了標記。只要程序一訪問這樣的地址,作業系統就將資料從

二級儲存器上取回到記憶體。若作業系統把物理 RAM 用光了,它就把一些資料換出來騰出空間。之後我們還可以把這些資料取回,因為它們都儲存在在二級儲存器上。

那些資料被換出是由替換策略決定的。Windows NT 使用先進先出(First-In-First-Out,FIFO)的策略。根據這個策略,當空間不夠時,最老的資料

(即最先取進記憶體的資料)被換出。缺頁的頻率取決於你係統的實際記憶體的大小和系統的程序數目等因素。例如同時跑著幾千個程序的網路伺服器,缺頁肯定

是非常頻繁的。

什麼是分頁

分頁是作業系統中的記憶體管理機制。通過這種方式計算機可以為主存存取其他儲存介質上的資料。在頁儲存管理機制中,OS從其他介質中得到相同大小的資料塊,

這種塊即為頁。

為什麼分頁

分頁的蛀牙作用是可以讓連續的地址空間儲存在不連續的介質中。若不分頁,作業系統需要把整個程式放到物理主存中連續的位置上,這會帶來很多儲存和碎片問題。分頁是現代通用作業系統虛擬儲存實現中的重要部分。它可以讓OS使用磁碟儲存RAM放不下的資料。

Linux中的分頁

Linux使用swap描述在RAM和硬碟之間移動頁,以及磁碟上用來儲存頁的區域。通常,使用一個磁碟分割槽做swap。2.6的核心已經支援直接 使用檔案來做swap。核心負責維護swap檔案的位置,並直接訪問硬碟。當有多個可供swap的磁碟空間時,Linux還支援優先順序。當OS需要把某些 記憶體頁面swap時,會選擇高優先順序的裝置。

效能問題

因為磁碟訪問的延時比直接訪問記憶體要高3到4個數量級。所以頻繁的使用swap將大大降低效能。Linux提供了一個/proc/sys/vm/swappiness引數,可以通過它調整swap略。

只需要簡單的echo 0-100中的一個數值到這個檔案中即可。值越大,系統swap到硬碟的越多。本博的筆記本預設是60。網上看到一個2.6核心維護者,將它設定成 100。給出的理由:“我的觀點是降低kernel swap出記憶體資料不對。你實際上不想讓幾百兆的記憶體在自己的機器記憶體中呆著,但從未被訪問。所以把這些資料請到磁碟上,留出更多的主存給要用的程式”.

Page Fault

32位系統中,每個程序擁有的最大記憶體空間是4G,也整個作業系統能夠識別的最大記憶體空間也是4G(除非使用high memory support)。因此Linux系統中程式訪問某些頁時,很可能這些頁不在RAM中,如何找到這個頁,並讀取之,是分頁系統的首要問題,即頁缺失問 題,Page fault。 作業系統接收到頁缺失訊號後,首先確定缺失的資料在硬碟中的位置,在RAM中獲得一個空白頁,以便儲存資料,把需要的資料從硬碟裝載到RAM內的頁面中。 更新頁表,把控制權返回給程式,讓程式可以重試導致頁缺失的指令。核心所作的這一系列工作對程式都是透明的。

頁大小

每個頁能儲存的資料多少,不同的系統會有不同。可以寫個小程式判斷頁大小(如何得到當前linux系統的頁大小)。 頁容量大,頁缺失就少,減少不必要的核心動作。但這也有壞處,因為系統只能在一個頁內通過分段來訪問主存。若頁太大,記憶體可用的頁少,則勢必浪費儲存空 間。通常的頁大小為4KB-8KB.你可以通過修改核心標頭檔案asm/param.h的EXEC_PAGESIZE,設定頁大小。

參考:

輸出系統分頁大小:
#include <unistd.h>
#include "stdio.h"

main()
{
printf("page size = %d\n",getpagesize());
}

http://www.cublog.cn/u3/102979/showart_2195943.html

相關推薦

Linux記憶體管理,分段

什麼是分頁? 無論你的NT伺服器的記憶體有多大,它總是顯得不夠充足。當物理RAM從低端開始執行時,Windows NT使用了分頁檔案Pagefile.sys。 為了執行不同的程序和應用程式,Pagefile.sys給實體記憶體分配了一些空間。在這些空間內允許交換資料頁。

作業系統記憶體管理分段

分段分段本是由於8086是16位匯流排,為定址20位記憶體地址而增加的。在32位作業系統中,分段依然有用。1)段描述符:描述該段的安全屬性,為一個64位長的值。在實地址模式中,只需要使用段暫存器(CS,DS,SS和ES)就可以了,每個段暫存器都是16位的,對應於地址匯流排中的

計算機原理學習(6)-- x86-32 CPU和記憶體管理管理

前言 上一篇我們瞭解了x86-16 CPU計算機的記憶體訪問方式,定址方式,以及基於MS-DOS的應用程式的記憶體佈局。這一篇會主要介紹32位處理器的記憶體訪問,記憶體管理以及應用程式的記憶體佈局。雖然目前64位CPU已經非常普及了,不過相對於32位的記憶體管理方式並沒

linux記憶體管理-段式和管理

該博文參考國嵌視訊和http://www.cnblogs.com/image-eye/archive/2011/07/13/2105765.html,在此感謝作者。 一、地址型別 實體地址:CPU通過地址匯流排的定址,找到真實的實體記憶體對應地址。   邏輯地址:程式

Linux記憶體管理之三 的分配和釋放

如上圖,Linux分配頁時,只能分配2^n個頁。核心維護MAX_ORDER個連結串列,每個連結串列記錄著連續的空閒頁。第一個連結串列中的每一項為1個空閒頁,第二個連結串列中的每一項為2個空閒頁,第三個連結串列中的每一項為4個空閒頁。。。,依次類推。分配頁時,從對應的連結串列上摘除空閒頁;釋放頁時,將對應的頁歸

記憶體管理機制

一、問題提出: 我們經常會使用malloc()以及free()函式進行堆區記憶體申請與釋放。那麼你是否會這樣做: int * p = malloc(0);/*malloc分配了0個位元組嗎,如果是那麼p指向誰呢,是NULL嗎*/ free(p);/*假如

Linux記憶體管理之一 分段

現代作業系統的記憶體管理機制有兩種:段式管理和頁式管理。段式記憶體管理,就是將記憶體分成段,每個段的起始地址就是段基地址。地址對映的時候,由邏輯地址加上段基地址而得到實體地址。純粹的段式記憶體管理的缺點很明顯,就是靈活性和效率比較差。首先是段的長度是可變的,這給記憶體的換入

Linux記憶體管理解析(一) : 分段機制

背景 : 在此文章裡會從分頁分段機制去解析Linux記憶體管理系統如何工作的,由於Linux記憶體管理過於複雜而本人能力有限。會盡量將自己總結歸納的部分寫清晰。 從真實模式到保護模式的定址方式的不同 :    16位CPU的定址方式 : 在 8086 CPU 中,提供了兩類暫存器來進行定址,分別為段

Linux機制之概述--Linux記憶體管理(六)

1 分頁機制 在虛擬記憶體中,頁表是個對映表的概念, 即從程序能理解的線性地址(linear address)對映到儲存器上的實體地址(phisical address). 很顯然,這個頁表是需要常駐記憶體的東西, 以應對頻繁的查詢對映需要(實際上,現代支援VM的處理器都有一個叫TLB的硬體級頁表快取部件

Linux機制之機制的演變--Linux記憶體管理(七)

1 頁式管理 1.1 分段機制存在的問題 分段,是指將程式所需要的記憶體空間大小的虛擬空間,通過對映機制對映到某個實體地址空間(對映的操作由硬體完成)。分段對映機制解決了之前作業系統存在的兩個問題: 地址空間沒有隔離 程式執行的地址不確定 不過分段方法存在一個嚴重的問題:記憶體的使用效率

linux下的虛擬記憶體分段機制

前言:由於計算機的記憶體是有限的,比0到2的32次方就是對應4G,這時候作業系統就引入了虛擬記憶體這一個概念, 1,首先可以從程式的編譯下手,對於java或者c++而言,程式在編譯的時候需要記憶體,但是此時程式並沒有在真的物理機上執行著,所以就引入虛擬記憶體這

linux記憶體管理2:記憶體對映和需求(英文名字:demand Paging,又叫:缺中斷)

        圖 10-5 vm_area_struct 資料結構示意圖當可執行映象對映到程序的虛擬地址空間時,將產生一組 vm_area_struct 結構來描述虛擬記憶體區域的起始點和終止點,每個 vm_struct 結構代表可執行映象的一部分,可能是可執行程式碼,也可能是初始化的變數或未初始化的資料。

Linux機制之機制的實現詳解--Linux記憶體管理(八)

[注意] 如果您當前使用的系統並不是linux,或者您的系統中只有一份linux原始碼,而您又期待能夠檢視或者檢索不同版本的linux原始碼 LXR (Linux Cross Reference)是比較流行的linux

操作系統筆記(十)內存管理分段和段

分段式內存管理 筆記 關系 代碼 保護 系統 長度 段頁式內存管理 bit 基本內存管理: 進程占用空間必須連續,導致外部碎片以及附加的compaction 整個進程的swap in 和 swap out十分耗時。 解決:分頁 ->內存空間不必連續,無外部碎片,

Linux 的內存管理

簡單的 任務 virtual 有一個 應用 保存 內存區域 硬盤 共享 架構師必讀:Linux 的內存分頁管理 來源:Linux愛好者 ID:LinuxHub 內存是計算機的主存儲器。內存為進程開辟出進程空間,讓進程在其中保存數據。我將從內存的物理特性出發,深入到內存管理

記憶體管理機制

一、問題提出: 我們經常會使用malloc()以及free()函式進行堆區記憶體申請與釋放。那麼你是否會這樣做: int * p = malloc(0);/*malloc分配了0個位元組嗎,如果是那麼p指向誰呢,是NULL嗎*/ free(p);/*假如malloc分配了0個位元組,p指向了NU

第四章 記憶體離散分配 分段

連續分配方式:一個程序連續的裝進記憶體一個大小合適的區。  “碎片”  “緊湊”  增大開銷 如果允許一個程序直接分散裝入多個不相鄰分割槽中,則無需“緊湊” 產生儲存管理的離散分配方式。

第四章 儲存器管理 + + 分段

主存:儲存程序執行時的程式和資料 暫存器:速度最快,價格昂貴容量不大,一般以字為單位,只要存放指令一次操作的資料就夠了 。 快取記憶體:總之:速度快、存放部分記憶體資料、硬體自動處理 磁碟快取:記憶體的一部分,將頻繁使用的一部分磁碟資料資訊預讀入在磁碟快取,減少磁碟

記憶體管理,邏輯地址,線性地址,實體地址的區別

虛擬記憶體(Virtual Memory) 是指計算機呈現出要比實際擁有的記憶體大得多的記憶體量。因此它允許程式設計師編制並執行比實際系統擁有的記憶體大得多的程式。這使得許多大型專案也能夠在具有有限記憶體資源的系統上實現。一個很恰當的比喻是:你不需要很長的軌道就可以讓一列火車從上海開到北京。你只需要足夠長的鐵

記憶體離散分配 分段

基本分頁儲存管理方式 本部分討論不具備對換功能的純分頁模式,作業執行需要全部裝入記憶體。 離散分配記憶體: 作業規定大小劃分成小份;記憶體也按同樣大小劃分成小份 作業的任一小份可分散放入記憶體任意未使用的小份 (分頁方式下,記憶體的使用率高,浪費少。但不是絕對沒