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

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

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

3天內不再提示

研究一下linux內存管理

Linux愛好者 ? 來源:LemonCode ? 2020-05-20 09:17 ? 次閱讀

過去的一周有點魔幻,有印象的有三個新聞:天貓總裁緋聞事件,蘑菇街裁員,不可能打工的周某也放出來了。三件事,兩件和互聯網行業相關,好像外面的世界很是精彩啊!吃瓜歸吃瓜,學習還是不能落下。

連續寫了兩周的「微服務」有點膩,不過這個系列還會繼續寫。今天來帶大家研究一下Linux內存管理。

對于精通CURD的業務同學,內存管理好像離我們很遠,但這個知識點雖然冷門(估計很多人學完根本就沒機會用上)但絕對是基礎中的基礎。

這就像武俠小說中的內功修煉,學完之后看不到立竿見影的效果,但對你日后的開發工作是大有裨益的,因為你站的更高了。

文中所有示例圖都是我親手畫的,畫圖比碼字還費時間,但大家看圖理解比文字更直觀,所以還是畫了。需要高清示例圖片的同學,文末有獲取方式自取。

再功利點的說,面試的時候不經意間透露你懂這方面知識,并且能說出個一二三來,也許能讓面試官對你更有興趣,離升職加薪,走上人生巔峰又近了一步。

前提約定:本文討論技術內容前提,操作系統環境都是x86架構的 32 位Linux系統。

虛擬地址

即使是現代操作系統中,內存依然是計算機中很寶貴的資源,看看你電腦幾個T固態硬盤,再看看內存大小就知道了。

為了充分利用和管理系統內存資源,Linux采用虛擬內存管理技術,利用虛擬內存技術讓每個進程都有4GB互不干涉的虛擬地址空間。

進程初始化分配和操作的都是基于這個「虛擬地址」,只有當進程需要實際訪問內存資源的時候才會建立虛擬地址和物理地址的映射,調入物理內存頁。

打個不是很恰當的比方,這個原理其實和現在的某某網盤一樣。假如你的網盤空間是1TB,真以為就一口氣給了你這么大空間嗎?那還是太年輕,都是在你往里面放東西的時候才給你分配空間,你放多少就分多少實際空間給你,但你和你朋友看起來就像大家都擁有1TB空間一樣。

虛擬地址的好處

避免用戶直接訪問物理內存地址,防止一些破壞性操作,保護操作系統

每個進程都被分配了4GB的虛擬內存,用戶程序可使用比實際物理內存更大的地址空間

4GB的進程虛擬地址空間被分成兩部分:「用戶空間」和「內核空間」

用戶空間內核空間

物理地址

上面章節我們已經知道不管是用戶空間還是內核空間,使用的地址都是虛擬地址,當需進程要實際訪問內存的時候,會由內核的「請求分頁機制」產生「缺頁異常」調入物理內存頁。

把虛擬地址轉換成內存的物理地址,這中間涉及利用MMU內存管理單元(Memory Management Unit ) 對虛擬地址分段和分頁(段頁式)地址轉換,關于分段和分頁的具體流程,這里不再贅述,可以參考任何一本計算機組成原理教材描述。

段頁式內存管理地址轉換

Linux內核會將物理內存分為3個管理區,分別是:

ZONE_DMA

DMA內存區域。包含0MB~16MB之間的內存頁框,可以由老式基于ISA的設備通過DMA使用,直接映射到內核的地址空間。

ZONE_NORMAL

普通內存區域。包含16MB~896MB之間的內存頁框,常規頁框,直接映射到內核的地址空間。

ZONE_HIGHMEM

高端內存區域。包含896MB以上的內存頁框,不進行直接映射,可以通過永久映射和臨時映射進行這部分內存頁框的訪問。

物理內存區劃分

用戶空間

用戶進程能訪問的是「用戶空間」,每個進程都有自己獨立的用戶空間,虛擬地址范圍從從0x00000000至0xBFFFFFFF總容量3G 。

用戶進程通常只能訪問用戶空間的虛擬地址,只有在執行內陷操作或系統調用時才能訪問內核空間。

進程與內存

進程(執行的程序)占用的用戶空間按照「 訪問屬性一致的地址空間存放在一起 」的原則,劃分成5個不同的內存區域。訪問屬性指的是“可讀、可寫、可執行等 。

代碼段

代碼段是用來存放可執行文件的操作指令,可執行程序在內存中的鏡像。代碼段需要防止在運行時被非法修改,所以只準許讀取操作,它是不可寫的。

數據段

數據段用來存放可執行文件中已初始化全局變量,換句話說就是存放程序靜態分配的變量和全局變量。

BSS段

BSS段包含了程序中未初始化的全局變量,在內存中bss段全部置零。

堆heap

堆是用于存放進程運行中被動態分配的內存段,它的大小并不固定,可動態擴張或縮減。當進程調用malloc等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張);當利用free等函數釋放內存時,被釋放的內存從堆中被剔除(堆被縮減)

棧stack

棧是用戶存放程序臨時創建的局部變量,也就是函數中定義的變量(但不包括static聲明的變量,static意味著在數據段中存放變量)。除此以外,在函數被調用時,其參數也會被壓入發起調用的進程棧中,并且待到調用結束后,函數的返回值也會被存放回棧中。由于棧的先進先出特點,所以棧特別方便用來保存/恢復調用現場。從這個意義上講,我們可以把堆棧看成一個寄存、交換臨時數據的內存區。

上述幾種內存區域中數據段、BSS段、堆通常是被連續存儲在內存中,在位置上是連續的,而代碼段和棧往往會被獨立存放。堆和棧兩個區域在i386體系結構中棧向下擴展、堆向上擴展,相對而生。

你也可以在linux下用size命令查看編譯后程序的各個內存區域大小:

[lemon ~]# size /usr/local/sbin/sshd text data bss dec hexfilename1924532 12412 4268962363840 2411c0/usr/local/sbin/sshd

內核空間

在x86 32位系統里,Linux 內核地址空間是指虛擬地址從0xC0000000開始到0xFFFFFFFF為止的高端內存地址空間,總計1G的容量, 包括了內核鏡像、物理頁面表、驅動程序等運行在內核空間 。

內核空間細分區域.

直接映射區

直接映射區Direct Memory Region:從內核空間起始地址開始,最大896M的內核空間地址區間,為直接內存映射區。

直接映射區的896MB的「線性地址」直接與「物理地址」的前896MB進行映射,也就是說線性地址和分配的物理地址都是連續的。內核地址空間的線性地址0xC0000001所對應的物理地址為0x00000001,它們之間相差一個偏移量PAGE_OFFSET = 0xC0000000

該區域的線性地址和物理地址存在線性轉換關系「線性地址 =PAGE_OFFSET+ 物理地址」也可以用virt_to_phys()函數將內核虛擬空間中的線性地址轉化為物理地址。

高端內存線性地址空間

內核空間線性地址從 896M 到 1G 的區間,容量 128MB 的地址區間是高端內存線性地址空間,為什么叫高端內存線性地址空間?下面給你解釋一下:

前面已經說過,內核空間的總大小 1GB,從內核空間起始地址開始的 896MB 的線性地址可以直接映射到物理地址大小為 896MB 的地址區間。

退一萬步,即使內核空間的1GB線性地址都映射到物理地址,那也最多只能尋址 1GB 大小的物理內存地址范圍。

請問你現在你家的內存條多大?快醒醒都 0202 年了,一般 PC 的內存都大于 1GB 了吧!

所以,內核空間拿出了最后的 128M 地址區間,劃分成下面三個高端內存映射區,以達到對整個物理地址范圍的尋址。而在 64 位的系統上就不存在這樣的問題了,因為可用的線性地址空間遠大于可安裝的內存。

動態內存映射區

vmalloc Region該區域由內核函數vmalloc來分配,特點是:線性空間連續,但是對應的物理地址空間不一定連續。vmalloc分配的線性地址所對應的物理頁可能處于低端內存,也可能處于高端內存。

永久內存映射區

Persistent Kernel Mapping Region該區域可訪問高端內存。訪問方法是使用alloc_page (_GFP_HIGHMEM)分配高端內存頁或者使用kmap函數將分配到的高端內存映射到該區域。

固定映射區

Fixing kernel Mapping Region該區域和 4G 的頂端只有 4k 的隔離帶,其每個地址項都服務于特定的用途,如ACPI_BASE等。

內核空間物理內存映射

回顧一下

上面講的有點多,先別著急進入下一節,在這之前我們再來回顧一下上面所講的內容。如果認真看完上面的章節,我這里再畫了一張圖,現在你的腦海中應該有這樣一個內存管理的全局圖。

內核空間用戶空間全圖

內存數據結構

要讓內核管理系統中的虛擬內存,必然要從中抽象出內存管理數據結構,內存管理操作如「分配、釋放等」都基于這些數據結構操作,這里列舉兩個管理虛擬內存區域的數據結構。

用戶空間內存數據結構

在前面「進程與內存」章節我們提到,Linux進程可以劃分為 5 個不同的內存區域,分別是:代碼段、數據段、BSS、堆、棧,內核管理這些區域的方式是,將這些內存區域抽象成vm_area_struct的內存管理對象。

vm_area_struct是描述進程地址空間的基本管理單元,一個進程往往需要多個vm_area_struct來描述它的用戶空間虛擬地址,需要使用「鏈表」和「紅黑樹」來組織各個vm_area_struct。

鏈表用于需要遍歷全部節點的時候用,而紅黑樹適用于在地址空間中定位特定內存區域。內核為了內存區域上的各種不同操作都能獲得高性能,所以同時使用了這兩種數據結構。

用戶空間進程的地址管理模型:

wm_arem_struct

內核空間動態分配內存數據結構

在內核空間章節我們提到過「動態內存映射區」,該區域由內核函數vmalloc來分配,特點是:線性空間連續,但是對應的物理地址空間不一定連續。vmalloc分配的線性地址所對應的物理頁可能處于低端內存,也可能處于高端內存。

vmalloc分配的地址則限于vmalloc_start與vmalloc_end之間。每一塊vmalloc分配的內核虛擬內存都對應一個vm_struct結構體,不同的內核空間虛擬地址之間有4k大小的防越界空閑區間隔區。

與用戶空間的虛擬地址特性一樣,這些虛擬地址與物理內存沒有簡單的映射關系,必須通過內核頁表才可轉換為物理地址或物理頁,它們有可能尚未被映射,當發生缺頁時才真正分配物理頁面。

動態內存映射

總結一下

Linux內存管理是一個非常復雜的系統,本文所述只是冰山一角,從宏觀角度給你展現內存管理的全貌,但一般來說,這些知識在你和面試官聊天的時候還是夠用的,當然也希望大家能夠通過讀書了解更深層次的原理。

本文可以作為一個索引一樣的學習指南,當你想深入某一點學習的時候可以在這些章節里找到切入點,以及這個知識點在內存管理宏觀上的位置。

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

    關注

    87

    文章

    11295

    瀏覽量

    209348
  • 固態硬盤
    +關注

    關注

    12

    文章

    1461

    瀏覽量

    57338

原文標題:別再說你不懂 Linux 內存管理了,10 張圖給你安排的明明白白

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

收藏 人收藏

    評論

    相關推薦

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

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

    Linux用戶管理詳解

    用戶分為普通用戶和超級用戶,超級用戶在Windows系統中為Administrator在Linux系統中為root。登陸Linux系統需要提供用戶名與密碼,登陸后通過定的方法管理該系
    的頭像 發表于 11-01 09:48 ?157次閱讀

    Linux內存泄露案例分析和內存管理分享

    作者:京東科技 李遵舉 、問題 近期我們運維同事接到線上LB(負載均衡)服務內存報警,運維同事反饋說LB集群有部分機器的內存使用率超過80%,有的甚至超過90%,而且內存使用率還再不
    的頭像 發表于 10-24 16:14 ?734次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內存</b>泄露案例分析和<b class='flag-5'>內存</b><b class='flag-5'>管理</b>分享

    Linux內存管理中HVO的實現原理

    代碼閱讀工具:vim+ctags+cscope本文主要介紹內存管理中的HVO(HugeTLB Vmemmap Optimization)特性,通過HVO可以節省管理HugeTLB 頁面元數據
    的頭像 發表于 10-22 16:51 ?237次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內存</b><b class='flag-5'>管理</b>中HVO的實現原理

    Windows管理內存的三種主要方式

    Windows操作系統提供了多種方式來管理內存,以確保系統資源的有效利用和性能的優化。以下是關于Windows管理內存的三種主要方式的詳細闡述,包括堆
    的頭像 發表于 10-12 17:09 ?709次閱讀

    內存管理的硬件結構

    常見的內存分配函數有malloc,mmap等,但大家有沒有想過,這些函數在內核中是怎么實現的?換句話說,Linux內核的內存管理是怎么實現的?
    的頭像 發表于 09-04 14:28 ?296次閱讀
    <b class='flag-5'>內存</b><b class='flag-5'>管理</b>的硬件結構

    歡創播報 支付寶“碰一下”正式發布

    1 支付寶“碰一下”正式發布 近日,在支付寶開放日上,支付寶宣布升級條碼支付體驗,推出“支付寶碰一下”,用戶無需展示付款碼,解鎖手機碰一下商家收款設備,最快步完成支付。據介紹,“碰
    的頭像 發表于 07-11 11:32 ?880次閱讀
    歡創播報  支付寶“碰<b class='flag-5'>一下</b>”正式發布

    ESP-IDF內核中的內存管理如何驗證?

    請教一下,ESP-IDF 內核中的內存管理如何驗證
    發表于 06-19 06:30

    linux查詢進程占用的內存方法有哪些?

    linux查詢進程占用的內存方法
    發表于 04-08 06:03

    物理內存模型的演變

    內存管理概述中,主要是以Linux v2.6.11為例進行分析的,但是計算技術在不斷發展,新的存儲架構、新的指令集架構、新的SoC架構等都對物理內存模型的抽象提出了更高要求。為此,必須
    的頭像 發表于 02-25 10:35 ?470次閱讀

    Linux內核內存管理之內核非連續物理內存分配

    的主要優點是避免了外部碎片,而缺點是需要修改內核頁表。顯然,非連續內存區域的大小必須是4096的倍數。Linux使用非連續物理內存區的場景有幾種:(1)為swap區分配數據結構;(2)為模塊分配空間
    的頭像 發表于 02-23 09:44 ?947次閱讀
    <b class='flag-5'>Linux</b>內核<b class='flag-5'>內存</b><b class='flag-5'>管理</b>之內核非連續物理<b class='flag-5'>內存</b>分配

    Linux內核內存管理之ZONE內存分配器

    內核中使用ZONE分配器滿足內存分配請求。該分配器必須具有足夠的空閑頁幀,以便滿足各種內存大小請求。
    的頭像 發表于 02-21 09:29 ?890次閱讀

    如何使用linuxgdb來調試python程序

    如何使用linuxgdb來調試python程序? 在Linux,可以使用GDB(GNU調試器)來調試Python程序。GDB是個強大的
    的頭像 發表于 01-31 10:41 ?2595次閱讀

    linux內核主要由哪幾個部分組成,作用是什么

    Linux內核主要由以下幾個部分組成: 進程管理Linux內核負責管理和調度系統中的進程。它通過進程調度算法來決定哪個進程在什么時間運行以及如何分配系統資源。
    的頭像 發表于 01-22 14:34 ?2672次閱讀

    Linux內核內存管理架構解析

    內存管理子系統可能是linux內核中最為復雜的個子系統,其支持的功能需求眾多,如頁面映射、頁面分配、頁面回收、頁面交換、冷熱頁面、緊急頁面、頁面碎片
    的頭像 發表于 01-04 09:24 ?653次閱讀
    <b class='flag-5'>Linux</b>內核<b class='flag-5'>內存</b><b class='flag-5'>管理</b>架構解析
    主站蜘蛛池模板: 91原创在线| WWW国产精品内射熟女| 八妻子秋霞理在线播放| 国产精品路线1路线2路线| 久久国产欧美| 婷婷激情综合色五月久久竹菊影视| 亚洲视频在线观看网站| MD传媒MD0021在线观看| 久久re视频这里精品青| 色偷偷888欧美精品久久久| 影音先锋色av男人资源网| 国产爱豆果冻传媒在线观看| 快播苍井空| 亚洲偷偷自拍免费视频在线| 纯肉合集(高H)| 男人J进入女人P免费狂躁| 亚洲人成无码久久久AAA片 | 亚洲午夜精品A片久久不卡蜜桃| sm主人调教揉花蒂H| 沦为公交两奶头春药高潮迭起| 玩50岁四川熟女大白屁股直播| a级精品九九九大片免费看| 久久精品天天爽夜夜爽| 亚洲 欧美 国产 在线 日韩| 成人在线视频播放| 欧美嫩freexxxhddvd| 69精品国产人妻蜜桃国产毛片| 灰原哀被啪漫画禁漫| 亚洲人成无码久久久AAA片| 国产一区2区| 乌克兰10一12x video| 国产国拍亚洲精品永久软件| 日本免费一区二区三区最新vr| bt成人种子| 捏揉舔水插按摩师| a视频免费在线观看| 欧美v1deossexo高清| qvod免费电影| 日日噜噜噜夜夜爽爽狠狠图片| 成人无码国产AV免费看直播| 色99蜜臀AV无码|