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

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

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

3天內不再提示

Linux虛擬內存和物理內存的詳細資料講解

Wildesbeast ? 來源:今日頭條 ? 作者:編程資源庫 ? 2020-02-24 15:53 ? 次閱讀

虛擬內存:

第一層理解

1. 每個進程都有自己獨立的4G內存空間,各個進程的內存空間具有類似的結構

2. 一個新進程建立的時候,將會建立起自己的內存空間,此進程的數據,代碼等從磁盤拷貝到自己的進程空間,哪些數據在哪里,都由進程控制表中的task_struct記錄,task_struct中記錄中一條鏈表,記錄中內存空間的分配情況,哪些地址有數據,哪些地址無數據,哪些可讀,哪些可寫,都可以通過這個鏈表記錄

3. 每個進程已經分配的內存空間,都與對應的磁盤空間映射

問題:

計算機明明沒有那么多內存(n個進程的話就需要n*4G)內存

建立一個進程,就要把磁盤上的程序文件拷貝到進程對應的內存中去,對于一個程序對應的多個進程這種情況,浪費內存!

第二層理解

1. 每個進程的4G內存空間只是虛擬內存空間,每次訪問內存空間的某個地址,都需要把地址翻譯為實際物理內存地址

2. 所有進程共享同一物理內存,每個進程只把自己目前需要的虛擬內存空間映射并存儲到物理內存上。

3. 進程要知道哪些內存地址上的數據在物理內存上,哪些不在,還有在物理內存上的哪里,需要用頁表來記錄

4. 頁表的每一個表項分兩部分,第一部分記錄此頁是否在物理內存上,第二部分記錄物理內存頁的地址(如果在的話)

5. 當進程訪問某個虛擬地址,去看頁表,如果發現對應的數據不在物理內存中,則缺頁異常

6. 缺頁異常的處理過程,就是把進程需要的數據從磁盤上拷貝到物理內存中,如果內存已經滿了,沒有空地方了,那就找一個頁覆蓋,當然如果被覆蓋的頁曾經被修改過,需要將此頁寫回磁盤

總結:

優點:

1.既然每個進程的內存空間都是一致而且固定的,所以鏈接器在鏈接可執行文件時,可以設定內存地址,而不用去管這些數據最終實際的內存地址,這是有獨立內存空間的好處

2.當不同的進程使用同樣的代碼時,比如庫文件中的代碼,物理內存中可以只存儲一份這樣的代碼,不同的進程只需要把自己的虛擬內存映射過去就可以了,節省內存

3.在程序需要分配連續的內存空間的時候,只需要在虛擬內存空間分配連續空間,而不需要實際物理內存的連續空間,可以利用碎片。

另外,事實上,在每個進程創建加載時,內核只是為進程“創建”了虛擬內存的布局,具體就是初始化進程控制表中內存相關的鏈表,實際上并不立即就把虛擬內存對應位置的程序數據和代碼(比如.text .data段)拷貝到物理內存中,只是建立好虛擬內存和磁盤文件之間的映射就好(叫做存儲器映射),等到運行到對應的程序時,才會通過缺頁異常,來拷貝數據。還有進程運行過程中,要動態分配內存,比如malloc時,也只是分配了虛擬內存,即為這塊虛擬內存對應的頁表項做相應設置,當進程真正訪問到此數據時,才引發缺頁異常。

補充理解:

虛擬存儲器涉及三個概念: 虛擬存儲空間,磁盤空間,內存空間

可以認為虛擬空間都被映射到了磁盤空間中,(事實上也是按需要映射到磁盤空間上,通過mmap),并且由頁表記錄映射位置,當訪問到某個地址的時候,通過頁表中的有效位,可以得知此數據是否在內存中,如果不是,則通過缺頁異常,將磁盤對應的數據拷貝到內存中,如果沒有空閑內存,則選擇犧牲頁面,替換其他頁面。

mmap是用來建立從虛擬空間到磁盤空間的映射的,可以將一個虛擬空間地址映射到一個磁盤文件上,當不設置這個地址時,則由系統自動設置,函數返回對應的內存地址(虛擬地址),當訪問這個地址的時候,就需要把磁盤上的內容拷貝到內存了,然后就可以讀或者寫,最后通過manmap可以將內存上的數據換回到磁盤,也就是解除虛擬空間和內存空間的映射,這也是一種讀寫磁盤文件的方法,也是一種進程共享數據的方法 共享內存

物理內存:

在內核態申請內存比在用戶態申請內存要更為直接,它沒有采用用戶態那種延遲分配內存技術。內核認為一旦有內核函數申請內存,那么就必須立刻滿足該申請內存的請求,并且這個請求一定是正確合理的。相反,對于用戶態申請內存的請求,內核總是盡量延后分配物理內存,用戶進程總是先獲得一個虛擬內存區的使用權,最終通過缺頁異常獲得一塊真正的物理內存。

1.物理內存的內核映射

IA32架構中內核虛擬地址空間只有1GB大小(從3GB到4GB),因此可以直接將1GB大小的物理內存(即常規內存)映射到內核地址空間,但超出1GB大小的物理內存(即高端內存)就不能映射到內核空間。為此,內核采取了下面的方法使得內核可以使用所有的物理內存。

1).高端內存不能全部映射到內核空間,也就是說這些物理內存沒有對應的線性地址。不過,內核為每個物理頁框都分配了對應的頁框描述符,所有的頁框描述符都保存在mem_map數組中,因此每個頁框描述符的線性地址都是固定存在的。內核此時可以使用alloc_pages()和alloc_page()來分配高端內存,因為這些函數返回頁框描述符的線性地址。

2).內核地址空間的后128MB專門用于映射高端內存,否則,沒有線性地址的高端內存不能被內核所訪問。這些高端內存的內核映射顯然是暫時映射的,否則也只能映射128MB的高端內存。當內核需要訪問高端內存時就臨時在這個區域進行地址映射,使用完畢之后再用來進行其他高端內存的映射。

由于要進行高端內存的內核映射,因此直接能夠映射的物理內存大小只有896MB,該值保存在high_memory中。內核地址空間的線性地址區間如下圖所示:

從圖中可以看出,內核采用了三種機制將高端內存映射到內核空間:永久內核映射,固定映射和vmalloc機制。

2.物理內存管理機制

基于物理內存在內核空間中的映射原理,物理內存的管理方式也有所不同。內核中物理內存的管理機制主要有伙伴算法,slab高速緩存和vmalloc機制。其中伙伴算法和slab高速緩存都在物理內存映射區分配物理內存,而vmalloc機制則在高端內存映射區分配物理內存。

伙伴算法

伙伴算法負責大塊連續物理內存的分配和釋放,以頁框為基本單位。該機制可以避免外部碎片。

per-CPU頁框高速緩存

內核經常請求和釋放單個頁框,該緩存包含預先分配的頁框,用于滿足本地CPU發出的單一頁框請求。

slab緩存

slab緩存負責小塊物理內存的分配,并且它也作為高速緩存,主要針對內核中經常分配并釋放的對象。

vmalloc機制

vmalloc機制使得內核通過連續的線性地址來訪問非連續的物理頁框,這樣可以最大限度的使用高端物理內存。

3.物理內存的分配

內核發出內存申請的請求時,根據內核函數調用接口將啟用不同的內存分配器。

3.1 分區頁框分配器

分區頁框分配器 (zoned page frame allocator) ,處理對連續頁框的內存分配請求。分區頁框管理器分為兩大部分:前端的管理區分配器和伙伴系統,如下圖:

管理區分配器負責搜索一個能滿足請求頁框塊大小的管理區。在每個管理區中,具體的頁框分配工作由伙伴系統負責。為了達到更好的系統性能,單個頁框的申請工作直接通過per-CPU頁框高速緩存完成。

該分配器通過幾個函數和宏來請求頁框,它們之間的封裝關系如下圖所示。

這些函數和宏將核心的分配函數__alloc_pages_nodemask()封裝,形成滿足不同分配需求的分配函數。其中,alloc_pages()系列函數返回物理內存首頁框描述符,__get_free_pages()系列函數返回內存的線性地址。

3.2 slab分配器

slab 分配器最初是為了解決物理內存的內部碎片而提出的,它將內核中常用的數據結構看做對象。slab分配器為每一種對象建立高速緩存。內核對該對象的分配和釋放均是在這塊高速緩存中操作。一種對象的slab分配器結構圖如下:

可以看到每種對象的高速緩存是由若干個slab組成,每個slab是由若干個頁框組成的。雖然slab分配器可以分配比單個頁框更小的內存塊,但它所需的所有內存都是通過伙伴算法分配的。

slab高速緩存分專用緩存和通用緩存。專用緩存是對特定的對象,比如為內存描述符創建高速緩存。通用緩存則是針對一般情況,適合分配任意大小的物理內存,其接口即為kmalloc()。

3.3 非連續內存區內存的分配

內核通過vmalloc()來申請非連續的物理內存,若申請成功,該函數返回連續內存區的起始地址,否則,返回NULL。vmalloc()和kmalloc()申請的內存有所不同,kmalloc()所申請內存的線性地址與物理地址都是連續的,而vmalloc()所申請的內存線性地址連續而物理地址則是離散的,兩個地址之間通過內核頁表進行映射。

vmalloc()的工作方式理解起來很簡單:

1).尋找一個新的連續線性地址空間;

2).依次分配一組非連續的頁框;

3).為線性地址空間和非連續頁框建立映射關系,即修改內核頁表;

vmalloc()的內存分配原理與用戶態的內存分配相似,都是通過連續的虛擬內存來訪問離散的物理內存,并且虛擬地址和物理地址之間是通過頁表進行連接的,通過這種方式可以有效的使用物理內存。但是應該注意的是,vmalloc()申請物理內存時是立即分配的,因為內核認為這種內存分配請求是正當而且緊急的;相反,用戶態有內存請求時,內核總是盡可能的延后,畢竟用戶態跟內核態不在一個特權級。

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

    關注

    15

    文章

    5517

    瀏覽量

    118982
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10854

    瀏覽量

    211587
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209333
收藏 人收藏

    評論

    相關推薦

    一文詳解Linux虛擬內存技術

      以存儲單元為單位來管理顯然不現實,因此Linux把虛存空間分成若干個大小相等的存儲分區,Linux把這樣的分區叫做頁。為了換入、換出的方便,物理內存也就按頁的大小分成若干個塊。由于
    發表于 07-17 17:29 ?568次閱讀
    一文詳解<b class='flag-5'>Linux</b><b class='flag-5'>虛擬內存</b>技術

    物理內存虛擬內存之間的轉換

    內存操作:涉及到了物理內存虛擬內存之間的轉換,需要用到兩個函數: ioremap 和 iounmap。ioremap :函 數 用 于 獲 取 指 定 物 理 地 址 空 間 對 應
    發表于 12-17 06:48

    如何定義虛擬內存

    虛擬內存中。這是通過地址轉換完成的。圖4. 虛擬地址映射到虛擬物理內存地址轉換如前所述,物理
    發表于 04-11 10:20

    Linux虛擬內存物理內存的深刻分析

    進程這種情況,浪費內存!第二層理解每個進程的4G內存空間只是虛擬內存空間,每次訪問內存空間的某個地址,都需要把地址翻譯為實際物理
    發表于 05-31 08:00

    虛擬內存是什么_虛擬內存有什么用

    虛擬內存是計算機系統內存管理的一種技術。它使得應用程序認為它擁有連續的可用的內存(一個連續完整的地址空間),而實際上,它通常是被分隔成多個物理內存
    發表于 11-01 10:03 ?9741次閱讀
    <b class='flag-5'>虛擬內存</b>是什么_<b class='flag-5'>虛擬內存</b>有什么用

    簡單剖析虛擬內存與交換分區

    很多朋友會把虛擬內存認為就是交換分區。其實,虛擬內存并非真正存在的物理空間,它僅僅是一個虛擬的東西。
    的頭像 發表于 02-09 08:44 ?6272次閱讀

    虛擬內存是什么意思

    虛擬內存是計算機系統內存管理的一種技術。它使得應用程序認為它擁有連續的可用的內存(一個連續完整的地址空間),而實際上,它通常是被分隔成多個物理內存
    的頭像 發表于 03-14 14:50 ?7535次閱讀

    虛擬內存怎么設置_虛擬內存注意事項

    虛擬內存是什么呢?虛擬內存,它只是相對于我們平時用的內存而說的,就比如如果系統的物理內存的空間是處于入不敷出的狀態的時候,電腦的操作系統此時
    發表于 06-11 10:45 ?2089次閱讀

    Linux:測試進程占用的虛擬內存大小

    Linux:測試進程占用的虛擬內存大小
    的頭像 發表于 06-23 09:23 ?2880次閱讀
    <b class='flag-5'>Linux</b>:測試進程占用的<b class='flag-5'>虛擬內存</b>大小

    Linux虛擬內存究竟是什么?

    前不久組內又有一次我比較期待的分享:”Linux虛擬內存”。
    的頭像 發表于 06-21 16:41 ?1997次閱讀
    <b class='flag-5'>Linux</b>的<b class='flag-5'>虛擬內存</b>究竟是什么?

    虛擬內存的作用和原理 如何調整虛擬內存設置

    虛擬內存,也稱為虛擬內存管理或頁面文件,是計算機操作系統中的一種內存管理技術。它允許系統使用硬盤空間作為額外的RAM(隨機存取存儲器),以彌補物理
    的頭像 發表于 12-04 09:13 ?359次閱讀

    虛擬內存不足如何解決 虛擬內存物理內存的區別

    虛擬內存不足的解決方案 虛擬內存不足是計算機用戶經常遇到的問題,尤其是在運行大型軟件或多任務處理時。以下是一些解決虛擬內存不足問題的方法: 增加物理
    的頭像 發表于 12-04 09:14 ?360次閱讀

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

    虛擬內存分頁概述 在Windows操作系統中,虛擬內存是通過分頁機制實現的。分頁允許系統將內存中的數據移動到硬盤上,以便為當前運行的程序騰出空間。這個過程對于保持系統的流暢運行至關重要,尤其是在
    的頭像 發表于 12-04 09:16 ?297次閱讀

    Linux下如何管理虛擬內存 使用虛擬內存時的常見問題

    Linux系統中,虛擬內存管理是操作系統內核的一個重要功能,負責管理物理內存和磁盤上的交換空間。以下是對Linux下如何管理
    的頭像 發表于 12-04 09:19 ?360次閱讀

    虛擬內存溢出該怎么處理 虛擬內存在服務器中的應用

    在現代計算機系統中,虛擬內存是一種重要的資源管理技術,它允許系統使用硬盤空間來擴展物理內存的容量。然而,當系統運行的程序和進程超出了物理內存
    的頭像 發表于 12-04 09:49 ?136次閱讀
    主站蜘蛛池模板: 狼人大香伊蕉国产WWW亚洲| 黑兽在线观看高清在线播放樱花| 成人在线视频播放| 国产97碰免费视频| 国产免费变态视频网址网站| 精品人妻伦一二三区久久AAA片| 九九热在线视频精品店| 老司机亚洲精品影院| 欧洲vs美洲完整视频| 偷拍精品视频一区二区三区| 亚洲理论片在线中文字幕| 18黄女脱内衣| 东京热一本无码av| 果冻传媒完整免费网站在线观看| 久久婷婷五月综合色精品首页| 欧美激情一区二区三区视频| 双腿被绑成M型调教PLAY照片| 亚洲男人的天堂久久精品麻豆| 中文在线无码高潮潮喷在线| WWW亚洲精品久久久无码| 国产白丝JK被疯狂输出视频| 簧片免费观看| 欧美性狂猛bbbbbbxxxx| 午夜国产免费视频亚洲| 中国老妇xxxhd| 东北真实仑乱| 久久国产影院| 日日摸天天添天天添无码蜜臀| 亚洲精品拍拍央视网出文| 1819sextub欧美中国| 国产精品美女WWW爽爽爽视频| 久久偷拍vs国产在线播放| 色狠狠一区二区| 月夜直播免费观看全集| 福利啪啪吧| 久久久久国产一级毛片高清片| 日本邪恶全彩工囗囗番海贼王| 亚洲欧美一区二区三区九九九| 99久久就热视频精品草| 国产午夜福利片| 女同给老师下媚药|