吴忠躺衫网络科技有限公司

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

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

3天內不再提示

Linux總是以Lazy的方式給應用程序分配內存

Linux閱碼場 ? 來源:未知 ? 作者:李倩 ? 2018-04-27 15:10 ? 次閱讀

Linux總是以Lazy的方式給應用程序分配內存,包括堆、棧(函數調用越深,用的棧越多,最終發生page fault才得到棧)、代碼段、數據段。那么,這些已經獲得到內存的段會一直占用著內存嗎?

1.page cache

Linux下讀寫文件,主要有兩種方式:

read/write

調用read讀文件,Linux內核會申請一個page cache,然后把文件讀到page cache中,再將內核空間的page cache拷貝到用戶空間的buf。

調用write寫文件,則將用戶空間buf拷貝到內核空間page cache。

mmap

mmap可以避免buf從用戶空間到內核空間的拷貝過程。

直接把文件映射成一個虛擬地址指針,這個指針指向內核申請的page cache。內核知道page cache與硬盤中文件的對應關系。

使用mmap讀寫文件

注:讀寫權限需要對應,否則觸發page fault。

編譯執行:

mmap看起來是由一個虛擬地址對應一個文件(可以直接用指針訪問文件),本質上是把進程的虛擬地址空間映射到DRAM(內核從這片區域申請內存做page cache),而這個page cache對應磁盤中的某個文件,且Linux內核會維護page cache和磁盤中文件的交換關系。詳見下圖:

page cache可以看作內存針對磁盤的一個緩存,應用程序在寫文件時,其實只是將內容寫入了page cache,使用sync才能真的寫入文件。

ELF可執行程序頭部會記錄代碼段的位置,代碼段的本質就將ELF文件中的代碼段直接mmap映射到一個虛擬地址,且權限為R+X。

page cache可以極大的提高系統整體性能。如,進程A讀一個文件,內核空間會申請page cache與此文件對應,并記錄對應關系,進程B再次讀同樣的文件就會直接命中上一次的page cache,讀寫速度顯著提升。但注意,page cache會根據LRU算法(最近最少使用)進行替換。

演示:page cache對程序執行時間的影響

第一次多出很多硬盤io操作;第二次python的很多環境都在內存中命中了,速度提升顯著。用\time -v命令再次對比:

附注:

i.swap:

動詞:swapping,內存與磁盤的顛簸行為

名字:swap分區

ii.cache可以通過/proc/sys/vm/drop_caches強行釋放,寫1釋放page cache,2釋放dentries和inode,3釋放兩者。

2.free命令的詳細解釋

上圖中,buffers與cached都是文件系統的緩存,沒有本質區別,唯一區別是背景不同:

i.當以文件系統(ext4,xfs等)的形式去訪問文件系統中的文件,如mount /dev/sda1 /mnt后,/mnt目錄下會有很多文件,訪問這類文件所產生的cache就對應free命令顯示的cached列。

ii.直接訪問/dev/sda1時,如用戶程序直接打開open(“dev/sda1…)或執行dd命令,以及文件系統本身去訪問裸分區,所產生的cache對應free命令顯示的buffers列。

參考下圖所示:

演示:讀硬盤裸分區導致free命令顯示內容變化

linux kernel 3.14版本以后,已經采用新的free命令,如下圖:

老版本free中-/+buffers/cache的含義如下圖:

新版本free中多出available,即是評估出現在還有多少內存可供應用程序使用。

3.file-backed的頁面和匿名頁

page cache和CPU內部cache一樣,是可以被替換出去的。有文件背景的頁面可以swap到磁盤。EG. 啟動firefox,跑一個oom的程序,前后對比firefox的smaps文件。可以看出firefox在內存緊張的情況下,代碼段、mmap的字體文件等都被替換出去而不駐留內存了。

那么,沒有文件背景的匿名頁是如何交換回收的呢?是否常住內存?詳見下圖:

有文件背景的頁面和匿名頁都需要swap,有文件背景的頁面向自己的文件背景中交換,匿名頁向swap分區和swapfile中交換。即使編譯內核時將CONFIG_SWAP關閉(只是關閉了匿名頁的交換),linux內核中kswapd的線程還是會swap有文件背景的頁面。

Linux有三個水位:min,low,high。一旦內存達到低水位時,后臺自動回收直到回收到高水位。當內存到達min水位時,直接堵住進程進行回收。

匿名頁和有文件背景的頁面都有可能被回收,/proc/sys/vm/swappiness值比較大時,傾向回收匿名頁;swappiness值比較小時傾向回收有文件背景的頁面。回收算法皆為LRU。

附注:

數據段比較特殊,在沒有寫的情況是有文件背景的,但被寫后就變為匿名頁。

Windows中的虛擬內存就相當于Linux的swapfile。

4.頁面回收和LRU

如上圖,運行到第4列時,第1頁最不活躍。運行到第5列時又把第1頁踏了一次,此時第2頁變為最不活躍的。運行到第6列時又把第2頁踏了一次,此時第3頁變為最不活躍的,所以在第7列時,由于要訪問一個新的第5頁,3就被替換出去。

5.swap以及zRAM

嵌入式系統受flash限制,很少使用swap分區,一般都swapoff。所以嵌入式系統引入zRAM技術。

zRAM直接把一塊內存模擬成一個硬盤分區,當作swap分區使用,此分區自帶透明壓縮功能,當匿名頁向zRAM分區寫時,Linux內核使CPU自動對匿名頁進行壓縮。接下來,當應用程序又執行到剛才的匿名頁時,由于此頁已經被swap到zRAM中,內存中沒有命中,頁表也沒有命中,所以此時再去訪問這塊內存時再次發生page fault,Linux就從zRAM分區中將匿名頁透明的解壓出來還到內存中。

zRAM的特點是用內存來做swap分區,透明壓(兩頁匿名頁有可能被壓縮成一頁),透明解(一頁解壓成兩頁),這樣其實相當于擴大了內存,但會多損耗一些CPU。

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

    關注

    87

    文章

    11345

    瀏覽量

    210409
  • 內存管理
    +關注

    關注

    0

    文章

    168

    瀏覽量

    14191

原文標題:郝健: Linux內存管理學習筆記-第4節課

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux內存系統: Linux 內存分配算法

    、伙伴系統算法——組織結構1) 概念· 為內核提供了一種用于分配一組連續的頁而建立的一種高效的分配策略,并有效的解決了外碎片問題· 分配內存是以
    發表于 08-24 07:44

    內核的內存是如何進行分配

    嵌入式LINUX驅動學習之12內核內存分配一、頭文件、函數及說明:一、頭文件、函數及說明://頭文件位置 : include/linux/slab.h/*申請
    發表于 12-17 06:44

    如何通過TZASC分配安全內存并通過OP-TEE中的可信應用程序訪問它?

    了 optee,然后運行了 optee_hello_world 示例,它似乎工作正常。 我現在想為安全區域分配一些內存并使用受信任的應用程序訪問它。我檢查了 SRM,但我需要更清楚地了解我在
    發表于 05-04 08:46

    Linux內存管理中的Slab分配機制

    早期Linux內存分配機制采用伙伴算法, 當請求分配內存大小為幾十個字節或幾百個字節時會產生內存
    發表于 04-24 10:49 ?11次下載

    嵌入式Linux NFS方式應用程序的實現

    嵌入式Linux NFS方式應用程序的實現:本文在以ARM9 內核芯片,處理器為S3C2410 構造的開發板系統上,詳細討論了如何配置嵌入式Linux NFS 開發環境,并通過一個具
    發表于 08-02 14:48 ?39次下載

    一種用于交互型CAD的內存管理系統設計

    交互型CAD系統得頻繁的分配與釋放內存。頻繁的內存分配與釋放是降低應用程序性能的重要原因。應用程序
    發表于 02-22 13:54 ?20次下載

    Android應用程序內存泄漏的原因及規避方法

    引言 Android應用程序內存使用的問題經常容易被忽視,在傳統的編程語言中(例如C語言),回收內存的任務是由程序本身來完成的,程序可以顯
    發表于 10-19 14:52 ?0次下載
    Android<b class='flag-5'>應用程序</b><b class='flag-5'>內存</b>泄漏的原因及規避方法

    淺談內存分配方式 避免內存浪費問題

    說到內存分配方式,就不得不提連續分配方式。這種方式是指為一個用戶程序分配一個連續的
    發表于 03-03 11:22 ?1463次閱讀

    單片機的程序內存和FLASH中應該如何進行空間分配

    一句話:基于速度問題,電腦使用硬盤存儲程序,運行時,在內存分配空間變量,加載程序內存中,在
    發表于 09-18 17:20 ?3次下載
    單片機的<b class='flag-5'>程序</b>在<b class='flag-5'>內存</b>和FLASH中應該如何進行空間<b class='flag-5'>分配</b>

    Linux操作系統知識講解:走進Linux 內存分配算法

    Linux操作系統知識講解:走進Linux 內存分配算法
    的頭像 發表于 08-28 10:57 ?5507次閱讀
    <b class='flag-5'>Linux</b>操作系統知識講解:走進<b class='flag-5'>Linux</b> <b class='flag-5'>內存</b><b class='flag-5'>分配</b>算法

    嵌入式Linux應用程序例程

    嵌入式Linux應用程序例程(arm嵌入式開發步驟)-嵌入式Linux應用程序例程,有需要的可以參考!
    發表于 07-30 13:23 ?16次下載
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>應用程序</b>例程

    C語言堆棧程序內存分配

    ? ? 程序內存分配 ? ????一個由C/C++編譯的程序占用的內存分為以下幾個部分: 棧區(stack)— 由編譯器自動
    的頭像 發表于 10-21 14:51 ?2364次閱讀

    C語言程序編譯后內存地址的分配

    )C程序內存分配1.內存分配圖解2.內存分配介紹(二
    發表于 01-13 14:23 ?1次下載
    C語言<b class='flag-5'>程序</b>編譯后<b class='flag-5'>內存</b>地址的<b class='flag-5'>分配</b>

    Linux內核引導內存分配器的原理

    Linux內核引導內存分配器使用的是伙伴系統算法。這種算法是一種用于動態內存分配的高效算法,它將內存
    發表于 04-03 14:52 ?429次閱讀

    OneCommand Manager應用程序Linux

    電子發燒友網站提供《OneCommand Manager應用程序Linux版.pdf》資料免費下載
    發表于 08-15 14:44 ?0次下載
    OneCommand Manager<b class='flag-5'>應用程序</b><b class='flag-5'>Linux</b>版
    澳门百家乐娱乐场| 金都百家乐官网的玩法技巧和规则| 大发888网页游戏平台| 百家乐珠盘路| 单双和百家乐游戏机厂家| 百家乐官网操作技巧| 博彩网百家乐官网的玩法技巧和规则| 百家乐官网群html| 百家乐官网娱乐城注册| 百家乐官网赢的秘诀| 油尖旺区| 嘉祥县| 涿鹿县| 百家乐官网大赢家小说| 百家乐官网娱乐城信息| 百家乐官网里面的奥妙| 百家乐官网网址讯博网| 凯旋门百家乐官网娱乐城| 投真钱百家乐官网必输吗| 百家乐官网平台开户哪里优惠多| 百家乐官网tie| 百家乐官网规律和方法| 钱隆百家乐官网的玩法技巧和规则 | 百家乐官网百家乐官网伴侣| 太阳城百家乐官网的分数| 百家乐官网中B是什么| 博彩百家乐官网龙虎| 百家乐官网筹码方形| 百家乐官网赌场走势图| 同乐城百家乐官网现金网| 百家乐官网投注心得和技巧| 赌博粉| CEO百家乐官网现金网| 百家乐官网赌博导航| 杨公24山择日| 百家乐在线赌场| 大集汇百家乐的玩法技巧和规则 | 百家乐变牌桌| 水果老虎机的程序| 太阳城网络博彩| 金沙百家乐官网娱乐城场|