色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何管理Linux 的內存分頁?

Linux愛好者 ? 來源:未知 ? 作者:工程師李察 ? 2018-07-28 08:24 ? 次閱讀

內存是計算機的主存儲器。內存為進程開辟出進程空間,讓進程在其中保存數據。我將從內存的物理特性出發,深入到內存管理的細節,特別是了解虛擬內存和內存分頁的概念。

內存

簡單地說,內存就是一個數據貨架。內存有一個最小的存儲單位,大多數都是一個字節。內存用內存地址(memory address)來為每個字節的數據順序編號。因此,內存地址說明了數據在內存中的位置。內存地址從0開始,每次增加1。這種線性增加的存儲器地址稱為線性地址(linear address)。為了方便,我們用十六進制數來表示內存地址,比如0x00000003、0x1A010CB0。這里的“0x”用來表示十六進制。“0x”后面跟著的,就是作為內存地址的十六進制數。

內存地址的編號有上限。地址空間的范圍和地址總線(address bus)的位數直接相關。CPU通過地址總線來向內存說明想要存取數據的地址。以英特爾32位的80386型CPU為例,這款CPU有32個針腳可以傳輸地址信息。每個針腳對應了一位。如果針腳上是高電壓,那么這一位是1。如果是低電壓,那么這一位是0。32位的電壓高低信息通過地址總線傳到內存的32個針腳,內存就能把電壓高低信息轉換成32位的二進制數,從而知道CPU想要的是哪個位置的數據。用十六進制表示,32位地址空間就是從0x00000000 到0xFFFFFFFF。

內存的存儲單元采用了隨機讀取存儲器(RAM, Random Access Memory)。所謂的“隨機讀取”,是指存儲器的讀取時間和數據所在位置無關。與之相對,很多存儲器的讀取時間和數據所在位置有關。就拿磁帶來說,我們想聽其中的一首歌,必須轉動帶子。如果那首歌是第一首,那么立即就可以播放。如果那首歌恰巧是最后一首,我們快進到可以播放的位置就需要花很長時間。我們已經知道,進程需要調用內存中不同位置的數據。如果數據讀取時間和位置相關的話,計算機就很難把控進程的運行時間。因此,隨機讀取的特性是內存成為主存儲器的關鍵因素。

內存提供的存儲空間,除了能滿足內核的運行需求,還通常能支持運行中的進程。即使進程所需空間超過內存空間,內存空間也可以通過少量拓展來彌補。換句話說,內存的存儲能力,和計算機運行狀態的數據總量相當。內存的缺點是不能持久地保存數據。一旦斷電,內存中的數據就會消失。因此,計算機即使有了內存這樣一個主存儲器,還是需要硬盤這樣的外部存儲器來提供持久的儲存空間。

虛擬內存

內存的一項主要任務,就是存儲進程的相關數據。我們之前已經看到過進程空間的程序段、全局數據、棧和堆,以及這些這些存儲結構在進程運行中所起到的關鍵作用。有趣的是,盡管進程和內存的關系如此緊密,但進程并不能直接訪問內存。在Linux下,進程不能直接讀寫內存中地址為0x1位置的數據。進程中能訪問的地址,只能是虛擬內存地址(virtual memory address)。操作系統會把虛擬內存地址翻譯成真實的內存地址。這種內存管理方式,稱為虛擬內存(virtual memory)。

每個進程都有自己的一套虛擬內存地址,用來給自己的進程空間編號。進程空間的數據同樣以字節為單位,依次增加。從功能上說,虛擬內存地址和物理內存地址類似,都是為數據提供位置索引。進程的虛擬內存地址相互獨立。因此,兩個進程空間可以有相同的虛擬內存地址,如0x10001000。虛擬內存地址和物理內存地址又有一定的對應關系,如圖1所示。對進程某個虛擬內存地址的操作,會被CPU翻譯成對某個具體內存地址的操作。

如何管理Linux 的內存分頁?

圖1 虛擬內存地址和物理內存地址的對應

應用程序來說對物理內存地址一無所知。它只可能通過虛擬內存地址來進行數據讀寫。程序中表達的內存地址,也都是虛擬內存地址。進程對虛擬內存地址的操作,會被操作系統翻譯成對某個物理內存地址的操作。由于翻譯的過程由操作系統全權負責,所以應用程序可以在全過程中對物理內存地址一無所知。因此,C程序中表達的內存地址,都是虛擬內存地址。比如在C語言中,可以用下面指令來打印變量地址:

intv = 0;

printf("%p",(void*)&v);

本質上說,虛擬內存地址剝奪了應用程序自由訪問物理內存地址的權利。進程對物理內存的訪問,必須經過操作系統的審查。因此,掌握著內存對應關系的操作系統,也掌握了應用程序訪問內存的閘門。借助虛擬內存地址,操作系統可以保障進程空間的獨立性。只要操作系統把兩個進程的進程空間對應到不同的內存區域,就讓兩個進程空間成為“老死不相往來”的兩個小王國。兩個進程就不可能相互篡改對方的數據,進程出錯的可能性就大為減少。

另一方面,有了虛擬內存地址,內存共享也變得簡單。操作系統可以把同一物理內存區域對應到多個進程空間。這樣,不需要任何的數據復制,多個進程就可以看到相同的數據。內核和共享庫的映射,就是通過這種方式進行的。每個進程空間中,最初一部分的虛擬內存地址,都對應到物理內存中預留給內核的空間。這樣,所有的進程就可以共享同一套內核數據。共享庫的情況也是類似。對于任何一個共享庫,計算機只需要往物理內存中加載一次,就可以通過操縱對應關系,來讓多個進程共同使用。IPO中的共享內存,也有賴于虛擬內存地址。

內存分頁

虛擬內存地址和物理內存地址的分離,給進程帶來便利性和安全性。但虛擬內存地址和物理內存地址的翻譯,又會額外耗費計算機資源。在多任務的現代計算機中,虛擬內存地址已經成為必備的設計。那么,操作系統必須要考慮清楚,如何能高效地翻譯虛擬內存地址。

記錄對應關系最簡單的辦法,就是把對應關系記錄在一張表中。為了讓翻譯速度足夠地快,這個表必須加載在內存中。不過,這種記錄方式驚人地浪費。如果樹莓派1GB物理內存的每個字節都有一個對應記錄的話,那么光是對應關系就要遠遠超過內存的空間。由于對應關系的條目眾多,搜索到一個對應關系所需的時間也很長。這樣的話,會讓樹莓派陷入癱瘓。

因此,Linux采用了分頁(paging)的方式來記錄對應關系。所謂的分頁,就是以更大尺寸的單位頁(page)來管理內存。在Linux中,通常每頁大小為4KB。如果想要獲取當前樹莓派的內存頁大小,可以使用命令:

$getconf PAGE_SIZE

得到結果,即內存分頁的字節數:

4096

返回的4096代表每個內存頁可以存放4096個字節,即4KB。Linux把物理內存和進程空間都分割成頁。

內存分頁,可以極大地減少所要記錄的內存對應關系。我們已經看到,以字節為單位的對應記錄實在太多。如果把物理內存和進程空間的地址都分成頁,內核只需要記錄頁的對應關系,相關的工作量就會大為減少。由于每頁的大小是每個字節的4000倍。因此,內存中的總頁數只是總字節數的四千分之一。對應關系也縮減為原始策略的四千分之一。分頁讓虛擬內存地址的設計有了實現的可能。

無論是虛擬頁,還是物理頁,一頁之內的地址都是連續的。這樣的話,一個虛擬頁和一個物理頁對應起來,頁內的數據就可以按順序一一對應。這意味著,虛擬內存地址和物理內存地址的末尾部分應該完全相同。大多數情況下,每一頁有4096個字節。由于4096是2的12次方,所以地址最后12位的對應關系天然成立。我們把地址的這一部分稱為偏移量(offset)。偏移量實際上表達了該字節在頁內的位置。地址的前一部分則是頁編號。操作系統只需要記錄頁編號的對應關系。

如何管理Linux 的內存分頁?

圖2 地址翻譯過程

多級分頁表

內存分頁制度的關鍵,在于管理進程空間頁和物理頁的對應關系。操作系統把對應關系記錄在分頁表(page table)中。這種對應關系讓上層的抽象內存和下層的物理內存分離,從而讓Linux能靈活地進行內存管理。由于每個進程會有一套虛擬內存地址,那么每個進程都會有一個分頁表。為了保證查詢速度,分頁表也會保存在內存中。分頁表有很多種實現方式,最簡單的一種分頁表就是把所有的對應關系記錄到同一個線性列表中,即如圖2中的“對應關系”部分所示。

這種單一的連續分頁表,需要給每一個虛擬頁預留一條記錄的位置。但對于任何一個應用進程,其進程空間真正用到的地址都相當有限。我們還記得,進程空間會有棧和堆。進程空間為棧和堆的增長預留了地址,但棧和堆很少會占滿進程空間。這意味著,如果使用連續分頁表,很多條目都沒有真正用到。因此,Linux中的分頁表,采用了多層的數據結構。多層的分頁表能夠減少所需的空間。

我們來看一個簡化的分頁設計,用以說明Linux的多層分頁表。我們把地址分為了頁編號和偏移量兩部分,用單層的分頁表記錄頁編號部分的對應關系。對于多層分頁表來說,會進一步分割頁編號為兩個或更多的部分,然后用兩層或更多層的分頁表來記錄其對應關系,如圖3所示。

如何管理Linux 的內存分頁?

圖3 多層分頁表

在圖3的例子中,頁編號分成了兩級。第一級對應了前8位頁編號,用2個十六進制數字表示。第二級對應了后12位頁編號,用3個十六進制編號。二級表記錄有對應的物理頁,即保存了真正的分頁記錄。二級表有很多張,每個二級表分頁記錄對應的虛擬地址前8位都相同。比如二級表0x00,里面記錄的前8位都是0x00。翻譯地址的過程要跨越兩級。我們先取地址的前8位,在一級表中找到對應記錄。該記錄會告訴我們,目標二級表在內存中的位置。我們再在二級表中,通過虛擬地址的后12位,找到分頁記錄,從而最終找到物理地址。

多層分頁表就好像把完整的電話號碼分成區號。我們把同一地區的電話號碼以及對應的人名記錄同通一個小本子上。再用一個上級本子記錄區號和各個小本子的對應關系。如果某個區號沒有使用,那么我們只需要在上級本子上把該區號標記為空。同樣,一級分頁表中0x01記錄為空,說明了以0x01開頭的虛擬地址段沒有使用,相應的二級表就不需要存在。正是通過這一手段,多層分頁表占據的空間要比單層分頁表少了很多。

多層分頁表還有另一個優勢。單層分頁表必須存在于連續的內存空間。而多層分頁表的二級表,可以散步于內存的不同位置。這樣的話,操作系統就可以利用零碎空間來存儲分頁表。還需要注意的是,這里簡化了多層分頁表的很多細節。最新Linux系統中的分頁表多達3層,管理的內存地址也比本章介紹的長很多。不過,多層分頁表的基本原理都是相同。

綜上,我們了解了內存以頁為單位的管理方式。在分頁的基礎上,虛擬內存和物理內存實現了分離,從而讓內核深度參與和監督內存分配。應用進程的安全性和穩定性因此大為提高。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209328
  • 內存
    +關注

    關注

    8

    文章

    3019

    瀏覽量

    74003
  • 十六進制
    +關注

    關注

    2

    文章

    32

    瀏覽量

    37731

原文標題:Linux 的內存分頁管理

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux內存管理是什么,Linux內存管理詳解

    Linux內存管理 Linux內存管理是一個非常復雜的過程,主要分成兩個大的部分:內核的
    的頭像 發表于 05-11 17:54 ?6039次閱讀
    <b class='flag-5'>Linux</b>的<b class='flag-5'>內存</b><b class='flag-5'>管理</b>是什么,<b class='flag-5'>Linux</b>的<b class='flag-5'>內存</b><b class='flag-5'>管理</b>詳解

    深度解析Linux內存管理體系

    Linux內存管理的整體模式是虛擬內存管理(分頁內存
    發表于 08-06 16:55 ?1733次閱讀

    走進Linux內存系統探尋內存管理的機制和奧秘

    Linux 內存是后臺開發人員,需要深入了解的計算機資源。合理的使用內存,有助于提升機器的性能和穩定性。本文主要介紹Linux 內存組織結構
    的頭像 發表于 01-05 09:47 ?1624次閱讀

    關于Linux內存管理的詳細介紹

    Linux內存管理是指對系統內存的分配、釋放、映射、管理、交換、壓縮等一系列操作的管理。在
    發表于 03-06 09:28 ?1064次閱讀

    Linux內核的內存管理詳解

    內存管理的主要工作就是對物理內存進行組織,然后對物理內存的分配和回收。但是Linux引入了虛擬地址的概念。
    發表于 08-31 14:46 ?779次閱讀
    <b class='flag-5'>Linux</b>內核的<b class='flag-5'>內存</b><b class='flag-5'>管理</b>詳解

    Linux內存系統---走進Linux 內存

    的運算數據· 2)硬盤等外部存儲器交換的數據· 3)保障 cpu 計算的穩定性和高性能 二、 Linux 內存地址空間 1、Linux 內存地址空間
    發表于 08-26 08:05

    linux內存管理機制淺析

    本內容介紹了arm linux內存管理機制,詳細說明了linux內核內存管理,
    發表于 12-19 14:09 ?73次下載
    <b class='flag-5'>linux</b><b class='flag-5'>內存</b><b class='flag-5'>管理</b>機制淺析

    linux內存管理

    linux內存管理
    發表于 10-24 11:12 ?3次下載
    <b class='flag-5'>linux</b><b class='flag-5'>內存</b><b class='flag-5'>管理</b>

    你知道linux內存管理基礎及方法?

    linux內存管理采取的分頁存取機制,會將內存中不經常使用的數據塊交換到虛擬內存中。
    發表于 04-28 17:12 ?1155次閱讀

    一文詳解linux分頁模型

    也就是我們實際中編碼時遇到的內存地址并不是對應于實際內存上的地址,我們編碼中使用的地址是一個邏輯地址,會通過分段和分頁這兩個機制把它轉為物理地址。而由于linux使用的分段機制有限,可
    的頭像 發表于 05-18 08:59 ?2118次閱讀
    一文詳解<b class='flag-5'>linux</b>的<b class='flag-5'>分頁</b>模型

    深入了解虛擬內存內存分頁的概念

    內存是計算機的主存儲器。內存為進程開辟出進程空間,讓進程在其中保存數據。我將從內存的物理特性出發,深入到內存管理的細節,特別是了解虛擬
    的頭像 發表于 05-28 14:02 ?4079次閱讀
    深入了解虛擬<b class='flag-5'>內存</b>和<b class='flag-5'>內存</b><b class='flag-5'>分頁</b>的概念

    Linux內存管理的基礎知識科普

    Linux內存管理可謂是學好Linux的必經之路,也是Linux的關鍵知識點,有人說打通了內存
    的頭像 發表于 06-08 15:24 ?2108次閱讀

    圖文詳解Linux分頁機制

    分頁機制是 80x86 內存管理機制的第二種機制,分段機制用于把虛擬地址轉換為線性地址,而分頁機制用于把線性地址轉換為物理地址。
    發表于 05-30 09:10 ?451次閱讀
    圖文詳解<b class='flag-5'>Linux</b><b class='flag-5'>分頁</b>機制

    Linux 內存管理總結

    一、Linux內存管理概述 Linux內存管理是指對系統內存
    的頭像 發表于 11-10 14:58 ?525次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>內存</b><b class='flag-5'>管理</b>總結

    什么是虛擬內存分頁 Windows系統虛擬內存優化方法

    虛擬內存分頁概述 在Windows操作系統中,虛擬內存是通過分頁機制實現的。分頁允許系統將內存
    的頭像 發表于 12-04 09:16 ?297次閱讀
    主站蜘蛛池模板: 好男人在线高清WWW免费观看| 交换年轻夫妇HD中文字幕| 花蝴蝶hd免费| 男男被强bl高h文| 性绞姿始动作动态图| 2019天天射干| 国产精品亚洲第一区二区三区| 久久永久影院免费| 神马电影我不卡4k手机在线观看| 与嫂子同居的日子在线观看 | 66美女人体| 国产国产乱老熟视频网站| 久久久久久久伊人电影| 少妇无码吹潮久久精品AV| 在线免费福利| 国产精品人妻无码77777| 蜜桃成熟时33D在线嘟嘟网| 午夜福利在线观看6080| 96精品视频| 狠狠色综合7777久夜色撩人| 日本精油按摩| 中国女人内谢69xxxxxx直播| 国产精品美女WWW爽爽爽视频| 美艳人妻在厨房翘着屁股| 亚洲成人黄色在线| 白丝女仆被强扒内裤| 考试考90就可以晚上和老师C| 亚洲 国产 日韩 欧美 在线| YELLOW视频直播在线观看| 久久在精品线影院精品国产| 午夜伦理 第1页| 成年人视频在线免费看| 琉璃美人煞在线观看| 亚洲字幕在线观看| 国产精品视频在线自在线| 日本xxxx69动漫| 99精品视频| 久久水蜜桃亚洲AV无码精品偷窥| 丫鬟粗大狠狠贯穿h| 法国剧丝袜情版h级在线电影| 美女被爽cao免费漫画|