chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解Linux的物理內(nèi)存

汽車玩家 ? 來(lái)源:Linux世界 ? 作者:Linux世界 ? 2020-01-18 17:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在內(nèi)核態(tài)申請(qǐng)內(nèi)存比在用戶態(tài)申請(qǐng)內(nèi)存要更為直接,它沒(méi)有采用用戶態(tài)那種延遲分配內(nèi)存技術(shù)。內(nèi)核認(rèn)為一旦有內(nèi)核函數(shù)申請(qǐng)內(nèi)存,那么就必須立刻滿足該申請(qǐng)內(nèi)存的請(qǐng)求,并且這個(gè)請(qǐng)求一定是正確合理的。相反,對(duì)于用戶態(tài)申請(qǐng)內(nèi)存的請(qǐng)求,內(nèi)核總是盡量延后分配物理內(nèi)存,用戶進(jìn)程總是先獲得一個(gè)虛擬內(nèi)存區(qū)的使用權(quán),最終通過(guò)缺頁(yè)異常獲得一塊真正的物理內(nèi)存。

1.物理內(nèi)存的內(nèi)核映射

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

1.高端內(nèi)存不能全部映射到內(nèi)核空間,也就是說(shuō)這些物理內(nèi)存沒(méi)有對(duì)應(yīng)的線性地址。不過(guò),內(nèi)核為每個(gè)物理頁(yè)框都分配了對(duì)應(yīng)的頁(yè)框描述符,所有的頁(yè)框描述符都保存在mem_map數(shù)組中,因此每個(gè)頁(yè)框描述符的線性地址都是固定存在的。內(nèi)核此時(shí)可以使用alloc_pages()和alloc_page()來(lái)分配高端內(nèi)存,因?yàn)檫@些函數(shù)返回頁(yè)框描述符的線性地址。

2.內(nèi)核地址空間的后128MB專門用于映射高端內(nèi)存,否則,沒(méi)有線性地址的高端內(nèi)存不能被內(nèi)核所訪問(wèn)。這些高端內(nèi)存的內(nèi)核映射顯然是暫時(shí)映射的,否則也只能映射128MB的高端內(nèi)存。當(dāng)內(nèi)核需要訪問(wèn)高端內(nèi)存時(shí)就臨時(shí)在這個(gè)區(qū)域進(jìn)行地址映射,使用完畢之后再用來(lái)進(jìn)行其他高端內(nèi)存的映射。

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

詳解Linux的物理內(nèi)存

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

2.物理內(nèi)存管理機(jī)制

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

伙伴算法

伙伴算法負(fù)責(zé)大塊連續(xù)物理內(nèi)存的分配和釋放,以頁(yè)框?yàn)榛締挝弧T摍C(jī)制可以避免外部碎片。

per-CPU頁(yè)框高速緩存

內(nèi)核經(jīng)常請(qǐng)求和釋放單個(gè)頁(yè)框,該緩存包含預(yù)先分配的頁(yè)框,用于滿足本地CPU發(fā)出的單一頁(yè)框請(qǐng)求。

slab緩存

slab緩存負(fù)責(zé)小塊物理內(nèi)存的分配,并且它也作為高速緩存,主要針對(duì)內(nèi)核中經(jīng)常分配并釋放的對(duì)象。

vmalloc機(jī)制

vmalloc機(jī)制使得內(nèi)核通過(guò)連續(xù)的線性地址來(lái)訪問(wèn)非連續(xù)的物理頁(yè)框,這樣可以最大限度的使用高端物理內(nèi)存。

3.物理內(nèi)存的分配

內(nèi)核發(fā)出內(nèi)存申請(qǐng)的請(qǐng)求時(shí),根據(jù)內(nèi)核函數(shù)調(diào)用接口將啟用不同的內(nèi)存分配器。

3.1 分區(qū)頁(yè)框分配器

分區(qū)頁(yè)框分配器 (zoned page frame allocator) ,處理對(duì)連續(xù)頁(yè)框的內(nèi)存分配請(qǐng)求。分區(qū)頁(yè)框管理器分為兩大部分:前端的管理區(qū)分配器和伙伴系統(tǒng),如下圖:

詳解Linux的物理內(nèi)存

管理區(qū)分配器負(fù)責(zé)搜索一個(gè)能滿足請(qǐng)求頁(yè)框塊大小的管理區(qū)。在每個(gè)管理區(qū)中,具體的頁(yè)框分配工作由伙伴系統(tǒng)負(fù)責(zé)。為了達(dá)到更好的系統(tǒng)性能,單個(gè)頁(yè)框的申請(qǐng)工作直接通過(guò)per-CPU頁(yè)框高速緩存完成。

該分配器通過(guò)幾個(gè)函數(shù)和宏來(lái)請(qǐng)求頁(yè)框,它們之間的封裝關(guān)系如下圖所示。

詳解Linux的物理內(nèi)存

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

3.2 slab分配器

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

詳解Linux的物理內(nèi)存

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

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

3.3 非連續(xù)內(nèi)存區(qū)內(nèi)存的分配

內(nèi)核通過(guò)vmalloc()來(lái)申請(qǐng)非連續(xù)的物理內(nèi)存,若申請(qǐng)成功,該函數(shù)返回連續(xù)內(nèi)存區(qū)的起始地址,否則,返回NULL。vmalloc()和kmalloc()申請(qǐng)的內(nèi)存有所不同,kmalloc()所申請(qǐng)內(nèi)存的線性地址與物理地址都是連續(xù)的,而vmalloc()所申請(qǐng)的內(nèi)存線性地址連續(xù)而物理地址則是離散的,兩個(gè)地址之間通過(guò)內(nèi)核頁(yè)表進(jìn)行映射。

vmalloc()的工作方式理解起來(lái)很簡(jiǎn)單:

1.尋找一個(gè)新的連續(xù)線性地址空間;

2.依次分配一組非連續(xù)的頁(yè)框;

3.為線性地址空間和非連續(xù)頁(yè)框建立映射關(guān)系,即修改內(nèi)核頁(yè)表;

vmalloc()的內(nèi)存分配原理與用戶態(tài)的內(nèi)存分配相似,都是通過(guò)連續(xù)的虛擬內(nèi)存來(lái)訪問(wèn)離散的物理內(nèi)存,并且虛擬地址和物理地址之間是通過(guò)頁(yè)表進(jìn)行連接的,通過(guò)這種方式可以有效的使用物理內(nèi)存。但是應(yīng)該注意的是,vmalloc()申請(qǐng)物理內(nèi)存時(shí)是立即分配的,因?yàn)閮?nèi)核認(rèn)為這種內(nèi)存分配請(qǐng)求是正當(dāng)而且緊急的;相反,用戶態(tài)有內(nèi)存請(qǐng)求時(shí),內(nèi)核總是盡可能的延后,畢竟用戶態(tài)跟內(nèi)核態(tài)不在一個(gè)特權(quán)級(jí)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213837
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3125

    瀏覽量

    75274
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux系統(tǒng)中通過(guò)預(yù)留物理內(nèi)存實(shí)現(xiàn)ARM與FPGA高效通信的方法

    管理子系統(tǒng)管理。因此,需要預(yù)留一部分物理內(nèi)存,使其不被內(nèi)核管理。接下來(lái)將為大家詳細(xì)介紹在 Linux 系統(tǒng)中通過(guò)預(yù)留物理內(nèi)存實(shí)現(xiàn) ARM 與
    的頭像 發(fā)表于 04-16 13:42 ?683次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)中通過(guò)預(yù)留<b class='flag-5'>物理</b><b class='flag-5'>內(nèi)存</b>實(shí)現(xiàn)ARM與FPGA高效通信的方法

    Linux服務(wù)器卡頓救星之一招釋放Cache內(nèi)存

    在程序運(yùn)行結(jié)束后不會(huì)自動(dòng)釋放。這可能會(huì)導(dǎo)致程序頻繁讀寫文件后可用物理內(nèi)存變得很少,必要時(shí)(比如內(nèi)存確實(shí)不夠用),需要主動(dòng)釋放緩存內(nèi)存。 注意:一般情況下,是不推薦主動(dòng)釋放緩存
    的頭像 發(fā)表于 01-16 10:04 ?1497次閱讀

    虛擬內(nèi)存和云計(jì)算的關(guān)系

    在現(xiàn)代計(jì)算機(jī)科學(xué)中,虛擬內(nèi)存和云計(jì)算是兩個(gè)關(guān)鍵的技術(shù)概念。虛擬內(nèi)存是一種內(nèi)存管理技術(shù),它允許計(jì)算機(jī)使用比物理內(nèi)存更多的
    的頭像 發(fā)表于 12-04 09:50 ?518次閱讀

    虛擬內(nèi)存溢出該怎么處理 虛擬內(nèi)存在服務(wù)器中的應(yīng)用

    在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,虛擬內(nèi)存是一種重要的資源管理技術(shù),它允許系統(tǒng)使用硬盤空間來(lái)擴(kuò)展物理內(nèi)存的容量。然而,當(dāng)系統(tǒng)運(yùn)行的程序和進(jìn)程超出了物理內(nèi)存
    的頭像 發(fā)表于 12-04 09:49 ?826次閱讀

    Linux下如何管理虛擬內(nèi)存 使用虛擬內(nèi)存時(shí)的常見(jiàn)問(wèn)題

    Linux系統(tǒng)中,虛擬內(nèi)存管理是操作系統(tǒng)內(nèi)核的一個(gè)重要功能,負(fù)責(zé)管理物理內(nèi)存和磁盤上的交換空間。以下是對(duì)Linux下如何管理虛擬
    的頭像 發(fā)表于 12-04 09:19 ?1341次閱讀

    虛擬內(nèi)存對(duì)計(jì)算機(jī)性能的影響

    ,它允許計(jì)算機(jī)使用硬盤空間來(lái)模擬物理內(nèi)存。當(dāng)物理內(nèi)存(RAM)不足以容納當(dāng)前所有活動(dòng)的程序和數(shù)據(jù)時(shí),操作系統(tǒng)會(huì)將部分?jǐn)?shù)據(jù)從RAM移動(dòng)到硬盤上的一個(gè)特殊區(qū)域,稱為交換空間(swap sp
    的頭像 發(fā)表于 12-04 09:17 ?3488次閱讀

    什么是虛擬內(nèi)存分頁(yè) Windows系統(tǒng)虛擬內(nèi)存優(yōu)化方法

    虛擬內(nèi)存分頁(yè)概述 在Windows操作系統(tǒng)中,虛擬內(nèi)存是通過(guò)分頁(yè)機(jī)制實(shí)現(xiàn)的。分頁(yè)允許系統(tǒng)將內(nèi)存中的數(shù)據(jù)移動(dòng)到硬盤上,以便為當(dāng)前運(yùn)行的程序騰出空間。這個(gè)過(guò)程對(duì)于保持系統(tǒng)的流暢運(yùn)行至關(guān)重要,尤其是在
    的頭像 發(fā)表于 12-04 09:16 ?1465次閱讀

    虛擬內(nèi)存不足如何解決 虛擬內(nèi)存物理內(nèi)存的區(qū)別

    虛擬內(nèi)存不足的解決方案 虛擬內(nèi)存不足是計(jì)算機(jī)用戶經(jīng)常遇到的問(wèn)題,尤其是在運(yùn)行大型軟件或多任務(wù)處理時(shí)。以下是一些解決虛擬內(nèi)存不足問(wèn)題的方法: 增加物理
    的頭像 發(fā)表于 12-04 09:14 ?1485次閱讀

    虛擬內(nèi)存的作用和原理 如何調(diào)整虛擬內(nèi)存設(shè)置

    虛擬內(nèi)存,也稱為虛擬內(nèi)存管理或頁(yè)面文件,是計(jì)算機(jī)操作系統(tǒng)中的一種內(nèi)存管理技術(shù)。它允許系統(tǒng)使用硬盤空間作為額外的RAM(隨機(jī)存取存儲(chǔ)器),以彌補(bǔ)物理內(nèi)
    的頭像 發(fā)表于 12-04 09:13 ?2536次閱讀

    DDR5內(nèi)存的工作原理詳解 DDR5和DDR4的主要區(qū)別

    DDR5內(nèi)存的工作原理詳解 1. DDR5內(nèi)存簡(jiǎn)介 DDR5(Double Data Rate 5)是第五代雙倍數(shù)據(jù)速率同步動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(SDRAM)。它是DDR4的后續(xù)產(chǎn)品,提供更高
    的頭像 發(fā)表于 11-22 15:38 ?4742次閱讀

    Linux用戶管理詳解

    用戶分為普通用戶和超級(jí)用戶,超級(jí)用戶在Windows系統(tǒng)中為Administrator在Linux系統(tǒng)中為root。登陸Linux系統(tǒng)需要提供用戶名與密碼,登陸后通過(guò)一定的方法管理該系統(tǒng)。
    的頭像 發(fā)表于 11-01 09:48 ?548次閱讀

    Linux內(nèi)存泄露案例分析和內(nèi)存管理分享

    作者:京東科技 李遵舉 一、問(wèn)題 近期我們運(yùn)維同事接到線上LB(負(fù)載均衡)服務(wù)內(nèi)存報(bào)警,運(yùn)維同事反饋說(shuō)LB集群有部分機(jī)器的內(nèi)存使用率超過(guò)80%,有的甚至超過(guò)90%,而且內(nèi)存使用率還再不停的增長(zhǎng)。接到
    的頭像 發(fā)表于 10-24 16:14 ?1077次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)存</b>泄露案例分析和<b class='flag-5'>內(nèi)存</b>管理分享

    邏輯內(nèi)存物理內(nèi)存的區(qū)別

    邏輯內(nèi)存物理內(nèi)存是計(jì)算機(jī)系統(tǒng)中兩個(gè)重要的概念,它們?cè)谟?jì)算機(jī)的運(yùn)行和數(shù)據(jù)處理中起著至關(guān)重要的作用。 1. 物理內(nèi)存(Physical Mem
    的頭像 發(fā)表于 09-27 15:38 ?1789次閱讀

    內(nèi)存管理的硬件結(jié)構(gòu)

    常見(jiàn)的內(nèi)存分配函數(shù)有malloc,mmap等,但大家有沒(méi)有想過(guò),這些函數(shù)在內(nèi)核中是怎么實(shí)現(xiàn)的?換句話說(shuō),Linux內(nèi)核的內(nèi)存管理是怎么實(shí)現(xiàn)的?
    的頭像 發(fā)表于 09-04 14:28 ?661次閱讀
    <b class='flag-5'>內(nèi)存</b>管理的硬件結(jié)構(gòu)

    buffers內(nèi)存與cached內(nèi)存的區(qū)別

    free 命令是Linux系統(tǒng)上查看內(nèi)存使用狀況最常用的工具,然而很少有人能說(shuō)清楚 “buffers” 與 “cached” 之間的區(qū)別。
    的頭像 發(fā)表于 07-29 14:17 ?799次閱讀
    buffers<b class='flag-5'>內(nèi)存</b>與cached<b class='flag-5'>內(nèi)存</b>的區(qū)別