在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

Linux內(nèi)存管理之CPU本地頁幀緩存

jf_0tjVfeJz ? 來源:嵌入式ARM和Linux ? 2024-02-20 09:23 ? 次閱讀

0 CPU頁幀緩存概念

在前一節(jié)中,我們學(xué)習(xí)了buddy伙伴關(guān)系系統(tǒng),它適用于申請連續(xù)的大塊物理內(nèi)存;而有些時候,經(jīng)常需要申請和釋放單個頁幀。但是,如果使用伙伴關(guān)系系統(tǒng),需要查表、進(jìn)行合并等操作,效率不高。為了提高性能,每個內(nèi)存ZONE區(qū)都提供了一個per-CPU變量,CPU頁幀緩存。每個CPU頁幀緩存都包含一些預(yù)分配好的頁幀,滿足本地CPU發(fā)起的單個頁幀請求。

實際上,每個內(nèi)存ZONE區(qū)和每個CPU都有2個緩存:一個是熱緩存,它存儲頁幀,其內(nèi)容可能包含在CPU的硬件緩存中;另一個是冷緩存。

如果內(nèi)核或用戶進(jìn)程在分配后立即寫入頁幀,那么從熱緩存中獲取頁幀將有利于系統(tǒng)性能。實際上,每次訪問頁幀的某個內(nèi)存位置,都會導(dǎo)致硬件Cache中替換其它頁幀的某一行(Cache-line),當(dāng)然,除非硬件Cache已經(jīng)包含剛剛訪問的“熱”頁幀中內(nèi)存位置的一行。

相反,如果要用DMA操作填充頁幀,則從冷緩存中取頁幀是很方便的。在這種情況下,不涉及CPU,也不會修改硬件Cache的任何行。從冷緩存中取頁幀可以為其他類型的內(nèi)存分配請求保留熱頁幀。

CPU頁幀緩存的數(shù)據(jù)結(jié)構(gòu)是per_cpu_pageset類型的數(shù)組,其存儲在內(nèi)存ZONE描述符中的pageset成員中,如下面的代碼所示:

structzone{
/*...*/
structper_cpu_pagesetpageset[NR_CPUS];
/*...*/
}

數(shù)組個數(shù)與CPU個數(shù)相關(guān),其中的每個數(shù)組元素又包含2個per_cpu_pages描述符成員:一個是熱緩存;另一個是冷緩存。而per_cpu_pages數(shù)據(jù)類型的成員如下表所示:

structper_cpu_pages{
intcount;/*緩存中的頁幀數(shù)量*/
intlow;/*閾值下限,用于緩存補(bǔ)充*/
inthigh;/*閾值上限,需要清空緩存*/
intbatch;/*需從緩存中添加或減少的頁幀數(shù)*/
structlist_headlist;/*緩存中頁幀描述符列表,即內(nèi)存頁列表*/
};

內(nèi)核使用兩個閾值(low和high)監(jiān)控冷/熱緩存的大小:如果頁幀數(shù)量低于閾值,則內(nèi)核使用伙伴系統(tǒng)分配一定數(shù)量的單個頁幀(batch);否則,頁幀數(shù)量超過閾值上限,內(nèi)核將緩存中的頁幀釋放到伙伴系統(tǒng)中(batch)。batch、low和high的值,具體依賴于內(nèi)存ZONE區(qū)的頁幀數(shù)量。

1 通過CPU頁幀緩存分配頁幀

buffered_rmqueue()函數(shù)在給定的內(nèi)存ZONE區(qū)中分配頁幀。它利用CPU頁幀緩存來處理單個頁幀請求。

Linux v2.6.11內(nèi)核源碼實現(xiàn)如下所示(文件位置:/mm/page_alloc.c):

staticstructpage*
buffered_rmqueue(structzone*zone,intorder,intgfp_flags)
{
unsignedlongflags;
structpage*page=NULL;
intcold=!!(gfp_flags&__GFP_COLD);

if(order==0){
structper_cpu_pages*pcp;

pcp=&zone->pageset[get_cpu()].pcp[cold];
local_irq_save(flags);
if(pcp->count<=?pcp->low)
pcp->count+=rmqueue_bulk(zone,0,
pcp->batch,&pcp->list);
if(pcp->count){
page=list_entry(pcp->list.next,structpage,lru);
list_del(&page->lru);
pcp->count--;
}
local_irq_restore(flags);
put_cpu();
}

if(page==NULL){
spin_lock_irqsave(&zone->lock,flags);
page=__rmqueue(zone,order);
spin_unlock_irqrestore(&zone->lock,flags);
}

if(page!=NULL){
BUG_ON(bad_range(zone,page));
mod_page_state_zone(zone,pgalloc,1<

輸入?yún)?shù)分別是內(nèi)存ZONE區(qū)的描述符的地址(zone)、內(nèi)存分配請求大小(2^order)和分配標(biāo)志gfp_flags。如果在gfp_flags中設(shè)置了__GFP_COLD標(biāo)志,則應(yīng)從冷緩存中獲取頁幀,否則應(yīng)從熱緩存中獲取頁幀(此標(biāo)志僅對單個頁幀請求有意義)。該函數(shù)基本上執(zhí)行以下操作:

如果order不等于0,則頁幀緩存不能使用,函數(shù)直接跳轉(zhuǎn)到第4步。

檢查由__GFP_COLD標(biāo)志標(biāo)識的內(nèi)存ZONE區(qū)域的CPU緩存是否必須被補(bǔ)充(per_cpu_pages的count ≤ low)。在本例中,它執(zhí)行以下子步驟:

重復(fù)調(diào)用__rmqueue()函數(shù),從伙伴系統(tǒng)中分配batch個頁幀。

將分配的頁幀描述符插入到緩存的列表中。

更新count變量(將新分配的頁幀數(shù)量加上)。

如果count > 0,從緩存列表中取一個頁幀,然后跳轉(zhuǎn)到第5步。(CPU頁幀緩存可能是空的,在第2步的__rmqueue()沒有申請到頁幀時就會發(fā)生)

到這兒,如果內(nèi)存請求沒有被滿足,調(diào)用__rmqueue()申請從伙伴系統(tǒng)中分配所請求頁幀。

如果內(nèi)存請求被滿足,初始化該頁幀(第1個)的頁描述符:清除某些標(biāo)志、設(shè)置private為0,設(shè)置頁幀引用計數(shù)器為1。另外,如果設(shè)置了__GPF_ZERO,將申請的內(nèi)存清零。

返回頁幀(第1個)的描述符,失敗返回NULL。

2 通過CPU頁幀緩存釋放頁幀

從CPU頁幀緩存中釋放頁幀,使用free_hot_page()和free_cold_page()函數(shù)。它們都是free_hot_cold_page()的封裝函數(shù),如下所示(文件位置:/mm/page_alloc.c):

staticvoidfastcallfree_hot_cold_page(structpage*page,intcold)
{
structzone*zone=page_zone(page);
structper_cpu_pages*pcp;
unsignedlongflags;

arch_free_page(page,0);

kernel_map_pages(page,1,0);
inc_page_state(pgfree);
if(PageAnon(page))
page->mapping=NULL;
free_pages_check(__FUNCTION__,page);
pcp=&zone->pageset[get_cpu()].pcp[cold];
local_irq_save(flags);
if(pcp->count>=pcp->high)
pcp->count-=free_pages_bulk(zone,pcp->batch,&pcp->list,0);
list_add(&page->lru,&pcp->list);
pcp->count++;
local_irq_restore(flags);
put_cpu();
}

free_hot_cold_page()接受的參數(shù)是待釋放頁幀的描述符地址page,表示熱緩存還是冷緩存的標(biāo)志cold。

執(zhí)行的步驟如下:

根據(jù)頁幀,獲取page->flags標(biāo)志。

根據(jù)cold標(biāo)志獲取對應(yīng)頁幀緩存的描述符per_cpu_pages地址。

檢查緩存是否不足:如果count ≥ high,調(diào)用free_pages_bulk()函數(shù)。該函數(shù)會重復(fù)調(diào)用__free_pages_bulk()函數(shù)釋放指定的頁幀到伙伴系統(tǒng)中。

將該頁幀添加到緩存列表中,增加count計數(shù)。

應(yīng)該注意的是,在Linux v2.6內(nèi)核中,沒有任何頁幀被釋放到冷緩存中:內(nèi)核總是假設(shè)釋放的頁幀相對于硬件緩存來說是熱的。當(dāng)然,這并不意味著冷緩存是空的:當(dāng)達(dá)到低閾值時,緩存由buffered_rmqueue()補(bǔ)充。

3 移除__GFP_COLD

雖然我們前邊分析了基于冷熱緩存的CPU頁幀緩存,但是,從v4.14版本以后的內(nèi)核中已經(jīng)移除,參考patch。Patches 1-4是與移除冷緩存最相關(guān)的部分;Patches 5-8是可選的,因為它們都是刪除無用但也不影響性能的代碼。

free_hot_cold_page的大多數(shù)調(diào)用者用戶都聲稱被釋放的頁是熱緩存的。唯一的例外是頁回收代碼,因為在不久的將來可能會釋放足夠多的頁,因此CPU的本地頁幀緩存列表將被回收,熱緩存信息將丟失。由于沒有人真正關(guān)心被釋放到分配器的頁的熱信息,所以省略該參數(shù)即可。




審核編輯:劉清

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

    關(guān)注

    32

    文章

    2281

    瀏覽量

    95790
  • Cache
    +關(guān)注

    關(guān)注

    0

    文章

    129

    瀏覽量

    28789
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    317

    瀏覽量

    22076

原文標(biāo)題:Linux內(nèi)核8.5-內(nèi)存管理之CPU本地頁幀緩存

文章出處:【微信號:嵌入式ARM和Linux,微信公眾號:嵌入式ARM和Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Linux內(nèi)存管理是什么,Linux內(nèi)存管理詳解

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

    Linux內(nèi)存管理頁面回收

    請求調(diào)機(jī)制,只要用戶態(tài)進(jìn)程繼續(xù)執(zhí)行,他們就能獲得框,然而,請求調(diào)沒有辦法強(qiáng)制進(jìn)程釋放不再使用的框。因此,遲早所有空閑內(nèi)存將被分配給進(jìn)
    發(fā)表于 05-19 14:09 ?1186次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b><b class='flag-5'>之</b>頁面回收

    關(guān)于Linux內(nèi)存管理的詳細(xì)介紹

    Linux內(nèi)存管理是指對系統(tǒng)內(nèi)存的分配、釋放、映射、管理、交換、壓縮等一系列操作的管理。在
    發(fā)表于 03-06 09:28 ?1144次閱讀

    Linux內(nèi)核內(nèi)存管理ZONE內(nèi)存分配器

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

    Linux內(nèi)核內(nèi)存管理之內(nèi)核非連續(xù)物理內(nèi)存分配

    我們已經(jīng)知道,最好將虛擬地址映射到連續(xù),從而更好地利用緩存并實現(xiàn)更低的平均內(nèi)存訪問時間。然而,如果對內(nèi)存區(qū)域的請求并不頻繁,那么考慮基于
    的頭像 發(fā)表于 02-23 09:44 ?1230次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>之內(nèi)核非連續(xù)物理<b class='flag-5'>內(nèi)存</b>分配

    HVM的緩存控制與內(nèi)存管理

    控制的虛擬指令 下圖列出了HVM緩存控制的虛擬指令: 內(nèi)存管理概述 HVM映射虛擬地址0x0000_0000至0xfeff_ffff置于一個32位的邏輯地址空間,既可以使用一系列的轉(zhuǎn)換或者1或2級別
    發(fā)表于 09-20 10:19

    Linux內(nèi)存管理導(dǎo)讀

    Linux 內(nèi)存管理導(dǎo)讀 :1. 存儲層次結(jié)構(gòu)和 x86存儲管理硬件(MMU) 1.1 存儲層次 高速緩存(cache) 主存(main m
    發(fā)表于 11-03 22:32 ?39次下載

    渲染中的緩存和深度緩存

    渲染涉及大量的緩存,這里緩存只是一個簡單的存有像素數(shù)據(jù)的矩形內(nèi)存塊,最重要緩存緩存和深度
    的頭像 發(fā)表于 05-14 11:44 ?6814次閱讀
    渲染中的<b class='flag-5'>幀</b><b class='flag-5'>緩存</b>和深度<b class='flag-5'>緩存</b>

    Linux性能及調(diào)優(yōu)指南:內(nèi)存架構(gòu)

    Linux管理swap空間也非常有效率。swap空間被使用時并不意味著出現(xiàn)內(nèi)存的瓶頸,它恰恰證明了Linux管理系統(tǒng)資源如何的有效。詳見“
    發(fā)表于 04-02 14:32 ?439次閱讀

    CPU緩存的作用及原理有哪些

    CPU緩存是位于CPU內(nèi)存之間的臨時存儲器,它的容量比內(nèi)存小很多,但交換速度比內(nèi)存要快很多。
    的頭像 發(fā)表于 08-27 15:58 ?1.1w次閱讀

    關(guān)于CPU緩存的作用

    CPU沒有存儲功能,那么緩存到底是干什么的?CPU緩存是用于減少處理器訪問內(nèi)存所需平均時間的部件,作用類似于
    的頭像 發(fā)表于 03-30 10:58 ?4737次閱讀
    關(guān)于<b class='flag-5'>CPU</b><b class='flag-5'>緩存</b>的作用

    如何在 Linux 上查看本地 DNS 緩存

    ? 刷新本地 DNS 緩存可以解決 HTTP 錯誤并保護(hù)您免受 DNS 欺騙。以下是在 Linux 上執(zhí)行此操作的方法。 當(dāng)您使用域名訪問網(wǎng)站時,您的系統(tǒng)會向 DNS 服務(wù)器發(fā)送請求以獲取該域
    的頭像 發(fā)表于 06-26 10:52 ?3613次閱讀
    如何在 <b class='flag-5'>Linux</b> 上查看<b class='flag-5'>本地</b> DNS <b class='flag-5'>緩存</b>

    Linux 內(nèi)存管理總結(jié)

    緩存、交換分區(qū)等。Linux內(nèi)存管理的目標(biāo)是最大限度地利用可用內(nèi)存,同時保證系統(tǒng)的穩(wěn)定和可靠性。 1.1 什么是
    的頭像 發(fā)表于 11-10 14:58 ?676次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>總結(jié)

    什么是CPU緩存?它有哪些作用?

    CPU緩存(Cache Memory)是計算機(jī)系統(tǒng)中一個至關(guān)重要的組成部分,它位于CPU內(nèi)存之間,作為兩者之間的臨時存儲器。CPU
    的頭像 發(fā)表于 08-22 14:54 ?5145次閱讀

    緩存美——如何選擇合適的本地緩存

    Guava cache是Google開發(fā)的Guava工具包中一套完善的JVM本地緩存框架,底層實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)類似于ConcurrentHashMap,但是進(jìn)行了更多的能力拓展,包括緩存過期時間設(shè)置、
    的頭像 發(fā)表于 11-17 14:24 ?642次閱讀
    <b class='flag-5'>緩存</b><b class='flag-5'>之</b>美——如何選擇合適的<b class='flag-5'>本地</b><b class='flag-5'>緩存</b>?
    主站蜘蛛池模板: 国产精品亚洲一区二区三区在线播放 | 三级精品视频在线播放 | www.色播.com| 4455ee日本高清免费观看 | 九九热视频免费在线观看 | 亚欧美综合 | bt天堂电影 | 天天草b| 在线观看三级网站 | 丁香四月婷婷 | 国产98色在线 | 不卡精品国产_亚洲人成在线 | 成人看的午夜免费毛片 | 国产精品1区2区3区在线播放 | 丁香六月纪婷婷激情综合 | 看全色黄大色大片免费久久怂 | bt种子搜索在线 | 亚洲人色大成年网站在线观看 | 日本xxxxxxx69xx| 日本特黄特色大片免费播放视频 | 天天操天天射天天舔 | 亚洲一区二区免费看 | 都市激情亚洲综合 | 日本www在线观看 | 中国一级生活片 | 四虎影院www | 欧洲精品码一区二区三区免费看 | 伊人成综合 | 国产精品夜夜春夜夜爽 | 国产区精品高清在线观看 | 亚洲人免费视频 | 国产欧美日韩综合精品一区二区 | 久久久久国产精品 | 国外免费一级 | 午夜影视在线免费观看 | 玖玖国产在线观看 | 国久久| 中国china体内裑精亚洲毛片 | xxx性xxx乱 | 手机福利片 | 免费人成激情视频在线观看冫 |