精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

神秘!申請內存時底層發生了什么?

存儲 存儲軟件
內存的申請釋放對程序員來說就像空氣一樣自然,你幾乎不怎么能意識到,有時你意識不到的東西卻無比重要,申請過這么多內存,你知道申請內存時底層都發生什么了嗎?

[[376556]]

內存的申請釋放對程序員來說就像空氣一樣自然,你幾乎不怎么能意識到,有時你意識不到的東西卻無比重要,申請過這么多內存,你知道申請內存時底層都發生什么了嗎?

大家都喜歡聽故事,我們就從神話故事開始吧。

三界

中國古代的神話故事通常有“三界”之說,一般指的是天、地、人三界,天界是神仙所在的地方,凡人無法企及;人界說的是就是人間;地界說的是閻羅王所在的地方,孫悟空上天入地無所不能就是說可以在這三界自由出入。有的同學可能會問,這和計算機有什么關系呢?原來,我們的代碼也是分三六九等的,程序運行起來后也是有“三界”之說的,程序運行起來的“三界”就是這樣的:

x86 CPU提供了“四界”:0,1,2,3,這幾個數字其實就是指CPU的幾種工作狀態,數字越小表示CPU的特權越大,0號狀態下CPU特權最大,可以執行任何指令,數字越大表示CPU特權越小,3號狀態下CPU特權最小,不能執行一些特權指令。一般情況下系統只使用0和3,因此確切的說是“兩界”,這兩界可不是說天、地,這兩界指的是“用戶態(3)”以及“內核態(0)”,接下來我們看看什么是內核態、什么是用戶態。

 

內核態

什么是內核態?當CPU執行操作系統代碼時就處于內核態,在內核態下CPU可以執行任何機器指令、訪問所有地址空間、不受限制的訪問任何硬件,可以簡單的認為內核態就是“天界”,在這里的代碼(操作系統代碼)無所不能。

 

用戶態

什么是用戶態?當CPU執行我們寫的“普通”代碼(非操作系統、驅動程序員)時就處于用戶態,粗糙的劃分方法就是除了操作系統之外的代碼,就像我們寫的HelloWorld程序。用戶態就好比“人界”,在用戶態我們的代碼處處受限,不能直接訪問硬件、不能訪問特定地址空間,否則神仙(操作系統)直接將你kill掉,這就是著名的Segmentation fault、不能執行特權指令,等等。

關于這一部分的詳細講解,請參見《深入理解操作系統》系列文章。

 

跨界

孫悟空神通廣大,一個跟斗就能從人間跑到天上去罵玉帝老兒,程序員就沒有這個本領了。普通程序永遠也去不了內核態,只能以通信的方式從用戶態往內核態傳遞信息。操作系統為普通程序員留了一些特定的暗號,這些暗號就和普通函數一樣,程序員通過調用這些暗號就能向操作系統請求服務了,這些像普通函數一樣的暗號就被稱為系統調用,System Call,通過系統調用我們可以讓操作系統代替我們完成一些事情,像打開文件、網絡通信等等。

你可能有些疑惑,什么,還有系統調用這種東西,為什么我沒調用過也可以打開文件、進行網絡通信?

 

標準庫

雖然我們可以通過系統讓操作系統替我們完成一些特定任務,但這些系統調用都是和操作系統強相關的,Linux和Windows的系統調用就完全不同。如果你直接使用系統調用的話,那么Linux版本的程序就沒有辦法在Windows上運行,因此我們需要某種標準,該標準對程序員屏蔽底層差異,這樣程序員寫的程序就無需修改的在不同操作系統上運行了。在C語言中,這就是所謂的標準庫。注意,標準庫代碼也是運行在用戶態的,并不是神仙(操作系統),一般來說,我們調用標準庫去打開文件、網絡通信等等,標準庫再根據操作系統選擇對應的系統調用。從分層的角度看,我們的程序一般都是這樣的漢堡包類型:

最上層是應用程序,應用程序一般只和標準庫打交道(當然,我們也可以繞過標準庫),標準庫通過系統調用和操作系統交互,操作系統管理底層硬件。這就是為什么在C語言下同樣的open函數既能在Linux下打開文件也能在Windows下打開文件的原因。說了這么多,這和malloc又有什么關系呢?

 

主角登場

原來,我們分配內存時使用的malloc函數其實不是實現在操作系統里的,而是在標準庫中實現的。

現在我們知道了,malloc是標準庫的一部分,當我們調用malloc時實際上是標準庫在為我們申請內存。這里值得注意的是,我們平時在C語言中使用malloc只是內存分配器的一種,實際上有很多內存分配器,像tcmalloc,jemalloc等等,它們都有各自適用的場景,對于高性能程序來說使用滿足特定要求的內存分配器是至關重要的。那么接下來的問題就是malloc又是怎么工作的呢?

 

malloc是如何工作的

實際上你可以把malloc的工作理解為去停車場找停車位,停車場就是一片malloc持有的內存,可用的停車位就是可供malloc支配的空閑內存,停在停車場占用的車位就是已經分配出去的內存,特殊點在于停在該停車場的車寬度大小不一,malloc需要回答這樣一個問題:當有一輛車來到停車場后該停到哪里?通過上面的類比你應該能大體理解工作原理了,具體分析詳見《自己動手實現一個malloc內存分配器》。但是,請注意,上面這篇文章并不是故事的全部,在這篇文章中有一個問題我們故意忽略了,這個問題就是如果內存分配器中的空閑內存塊不夠用了該怎么辦呢?在上面這篇文章中我們總是假定自己實現的malloc總能找到一塊空閑內存,但實際上并不是這樣的。

內存不夠該怎么辦?

讓我們再來看一下程序在內存中是什么樣的:

我們已經知道了,malloc管理的是堆區,注意,在堆區和棧區之間有一片空白區域,這片空白區域的目的是什么呢?原來,棧區其實是可以增長的,隨著調用深度的增加,相應的棧區占用的內存也會增加,關于棧區這一主題,你可以參考《函數運行時在內存中是什么樣子》這篇文章。棧區的增長就需要占用原來的空白區域。相應的,堆區也可以增長:

堆區增長后占用的內存就會變多,這就解決了內存分配器空閑內存不足的問題,那么很自然的,malloc該怎樣讓堆區增長呢?原來malloc內存不足時要向操作系統申請內存,操作系統才是真大佬,malloc不過是小弟,對每個進程,操作系統(類Unix系統)都維護了一個叫做brk的變量,brk發音break,這個brk指向了堆區的頂部。

將brk上移后堆區增大,那么我們該怎么樣讓堆區增大呢?這就涉及到我們剛提到的系統調用了。

 

向操作系統申請內存

操作系統專門提供了一個叫做brk的系統調用,還記得剛提到堆的頂部吧,這個brk()系統調用就是用來增加或者減小堆區的。

實際上不只brk系統調用,sbr、mmap系統調用也可以實現同樣的目的,mmap也更為靈活,但該函數并不是本文重點,就不在這里詳細討論了。現在我們知道了,如果malloc自己維護的內存空間不足將通過brk系統調用向操作系統申請內存。這樣malloc就可以把這些從操作系統申請到的內存當做新的空閑內存塊分配出去。

 

看起來已經講完的故事

現在我就可以簡單總結一下了,當我們申請內存時,經歷這樣幾個步驟:

程序調用malloc申請內存,注意malloc實現在標準庫中

malloc開始搜索空閑內存塊,如果能找到一塊大小合適的就分配出去,前兩個步驟都是發生在用戶態

如果malloc沒有找到空閑內存塊那么就像操作系統發出請求來增大堆區,這是通過系統調用brk(sbrk、mmap也可以)實現的,注意,brk是操作系統的一部分,因此當brk開始執行時,此時就進入內核態了。brk增大進程的堆區后返回,malloc的空閑內存塊增加,此時malloc又一次能找到合適的空閑內存塊然后分配出去。

故事就到這里了嗎?

 

冰山之下

實際上到目前為止,我們接觸到的僅僅是冰山一角。

我們看到的冰山是這樣的:我們向malloc申請內存,malloc內存不夠時向操作系統申請內存,之后malloc找到一塊空閑內存返回給調用者。但是,你知道嗎,上述過程根本就沒有涉及到哪怕一丁點物理內存!!!我們確實向malloc申請到內存了,malloc不夠也確實從操作系統申請到內存了,但這些內存都不是真的物理內存,NOT REAL。實際上,進程看到的內存都是假的,是操作系統給進程的一個幻象,這個幻象就是由著名的虛擬內存系統來維護的,我們經常說的這張圖就是進程的虛擬內存。

所謂虛擬內存就是假的、不是真正的物理內存,虛擬內存是給進程用的,操作系統維護了虛擬內存到物理內存的映射,當malloc返回后,程序員申請到的內存就是虛擬內存。

注意,此時操作系統根本就沒有真正的分配物理內存,程序員從malloc拿到的內存目前還只是一張空頭支票。

那么這張空頭支票什么時候才能兌現呢?也就是什么時候操作系統才會真正的分配物理內存呢?

答案是當我們真正使用這段內存時,當我們真正使用這段內存時,這時會產生一個缺頁錯誤,操作系統捕捉到該錯誤后開始真正的分配物理內存,操作系統處理完該錯誤后我們的程序才能真正的讀寫這塊內存。

這里只是簡略的提到了虛擬內存,實際上虛擬內存是當前操作系統內部極其重要的一部分,關于虛擬內存的工作原理將在《深入理解操作系統》系列文章中詳細討論。

 

完整的故事

現在,這個故事就可以完整講出來了,當我們調用malloc申請內存時:

  1. malloc開始搜索空閑內存塊,如果能找到一塊大小合適的就分配出去
  2. 如果malloc找不到一塊合適的空閑內存,那么調用brk等系統調用擴大堆區從而獲得更多的空閑內存
  3. malloc調用brk后開始轉入內核態,此時操作系統中的虛擬內存系統開始工作,擴大進程的堆區,注意額外擴大的這一部分內存僅僅是虛擬內存,操作系統并沒有為此分配真正的物理內存
  4. brk執行結束后返回到malloc,從內核態切換到用戶態,malloc找到一塊合適的空閑內存后返回
  5. 程序員拿到新申請的內存,程序繼續
  6. 當有代碼讀寫新申請的內存時系統內部出現缺頁中斷,此時再次由用戶態切換到內核態,操作系統此時真正的分配物理內存,之后再次由內核態切換回用戶態,程序繼續。

以上就是一次內存申請的完整過程,可以看到一次內存申請過程是非常復雜的。

 

總結

 

怎么樣,程序員申請內存使用的malloc雖然表面看上去非常簡單,簡單到就一行代碼,但這行代碼背后是非常復雜的。有的同學可能會問,為什么我們要理解這背后的原理呢?理解了原理后我才能知道內存申請的復雜性,對于高性能程序來講頻繁的調用malloc對系統性能是有影響的,那么很自然的一個問題就是我們能否避免malloc?這個問題我們將在接下來的文章中講解。希望本篇對大家理解內存分配的底層原理有所幫助。

 

責任編輯:武曉燕 來源: 碼農的荒島求生
相關推薦

2019-11-12 14:41:41

Redis程序員Linux

2020-08-20 11:50:31

語言類型轉換代碼

2021-11-23 23:31:43

C語言數據類型系統

2023-03-31 08:12:30

操作系統nanosleep信號

2021-06-30 06:02:38

MySQL SQL 語句數據庫

2025-07-28 06:32:12

Gogo func()

2020-08-17 12:47:07

Mozilla裁員瀏覽器

2022-12-13 10:59:47

devtoolMemory

2019-08-26 09:35:25

命令ping抓包

2010-02-07 09:00:29

AndroidLinux Kerne

2021-04-11 10:40:16

Git軟件開發

2023-08-29 16:26:20

Linux命令行

2015-07-03 09:27:43

網絡閏秒

2022-06-03 08:12:52

InnoDB插入MySQL

2019-09-16 17:16:29

Hadoop數據湖數據結構

2021-12-16 15:58:48

Linux內存微軟

2020-09-01 11:40:01

HTTPJavaTCP

2017-09-06 16:20:51

2022-05-31 13:58:09

MySQL查詢語句

2023-11-02 08:00:00

ClickHouse數據庫
點贊
收藏

51CTO技術棧公眾號

午夜视频在线观看网站| 波多野结衣一区二区三区四区| 亚洲精品午夜| 亚洲国产一区二区在线播放| 蜜桃久久精品乱码一区二区| 亚洲图片欧美在线| 亚洲黄色成人| 亚洲最新中文字幕| 成人欧美精品一区二区| 欧美精品日日操| 最新国产成人在线观看| 精品中文字幕人| 91中文字幕在线播放| 亚洲作爱视频| 欧美成年人视频网站欧美| 性欧美13一14内谢| 国产调教精品| 欧美精品高清视频| 日日碰狠狠丁香久燥| 欧美人与动牲性行为| 国产精品少妇自拍| 日本不卡一区| 殴美一级特黄aaaaaa| 精品一区二区国语对白| 日本在线观看天堂男亚洲| 免看一级a毛片一片成人不卡| 免费看成人哺乳视频网站| 日韩三级精品电影久久久| 五月婷婷狠狠操| 182在线视频观看| 亚洲日本欧美天堂| 亚洲mv在线看| 国产视频网站在线| 91香蕉视频mp4| 国产成人精品免费视频大全最热| 一本色道久久综合亚洲| 老司机亚洲精品| 欧美尤物巨大精品爽| 国产一级一片免费播放放a| 五月天久久久| 色狠狠久久aa北条麻妃| 亚洲色成人网站www永久四虎| 婷婷亚洲成人| 亚洲第一av网站| 久久久久99人妻一区二区三区| 久久久加勒比| 欧美日韩免费不卡视频一区二区三区| 久久久精品三级| 欧美成人免费电影| 日韩欧美国产视频| 国产午夜伦鲁鲁| 免费v片在线观看| 亚洲高清在线精品| 青青草精品视频在线| 99爱在线视频| 精品日本美女福利在线观看| 国产极品尤物在线| 玖玖在线播放| 色偷偷成人一区二区三区91| 国产成人无码一二三区视频| 日韩av中字| 欧美系列在线观看| 日本中文字幕二区| 9999在线精品视频| 精品欧美一区二区在线观看| 久久久久久久久久影视| 国产丝袜一区| 国产一区二区三区丝袜| 69xxx免费| 亚洲啊v在线观看| 久久91精品国产91久久久| 久久黄色小视频| a91a精品视频在线观看| 欧美中文在线字幕| 亚洲天堂网视频| 国产一区不卡精品| 精品国产一区二区三区免费| 青草久久伊人| 亚洲欧洲精品天堂一级| 欧美黑人在线观看| 咪咪网在线视频| 色偷偷88欧美精品久久久| 亚洲精品性视频| 伊人精品综合| 亚洲老头同性xxxxx| 国产精品美女高潮无套| 亚洲天堂免费| 2019中文字幕在线免费观看| 国产精品尤物视频| 国产乱码精品一区二区三| 国产在线一区二区三区播放| 国产色在线 com| 亚洲乱码精品一二三四区日韩在线| 福利在线一区二区| 三级成人在线| 日韩免费性生活视频播放| 91精品人妻一区二区| 久久亚洲在线| 久久久亚洲欧洲日产国码aⅴ| 免费黄色小视频在线观看| 国产成人精品午夜视频免费| 久久婷婷开心| 国产欧美黑人| 在线亚洲高清视频| 岛国大片在线免费观看| 国产欧美日韩在线一区二区 | 黄色av免费在线观看| 亚洲免费观看高清在线观看| 国产熟女高潮视频| 成人福利一区| 色综久久综合桃花网| 日产欧产va高清| 精品午夜久久福利影院| 久热这里只精品99re8久| 成人区精品一区二区不卡| 色婷婷久久久久swag精品| 色婷婷狠狠18禁久久| 色999日韩| 欧洲成人性视频| 国产91免费在线观看| 亚洲欧洲精品成人久久奇米网| 久久成人免费观看| 亚洲一区电影| 久久成人人人人精品欧| 成人黄色激情视频| 91麻豆文化传媒在线观看| 日本熟妇人妻xxxx| 亚洲精品福利| 欧美另类极品videosbestfree| 中文字幕 亚洲视频| 久久久综合九色合综国产精品| 国产一二三区在线播放| 警花av一区二区三区| 最新日韩中文字幕| 中文字幕在线日亚洲9| 久久久99久久精品欧美| 成人免费在线小视频| 日本国产精品| 欧美野外猛男的大粗鳮| 少妇荡乳情欲办公室456视频| 亚洲影视资源网| 人妻av一区二区三区| 影视一区二区| 91精品免费看| 九色porny丨首页在线| 欧美绝品在线观看成人午夜影视| 69xxx免费| 激情图区综合网| 偷拍盗摄高潮叫床对白清晰| 国产精品一站二站| 久久激情视频久久| 精品国产无码一区二区三区| 亚洲乱码精品一二三四区日韩在线| 精品国产乱码久久久久久1区二区| 图片小说视频色综合| 亚洲a成v人在线观看| 成人在线免费看片| 精品成人在线观看| 国产精品6666| 久久影院午夜片一区| 激情综合网俺也去| 小小影院久久| 鬼打鬼之黄金道士1992林正英| 俺来也官网欧美久久精品| 亚洲精品理论电影| 精品久久久久久久久久久久久久久久久久| 国产日产欧美一区二区三区| 在线能看的av网站| 一区久久精品| 日本一区不卡| 亚洲一区二区av| 国产69精品久久久| 欧日韩在线视频| 91久久免费观看| 手机av在线看| av亚洲产国偷v产偷v自拍| 99re在线视频免费观看| 99精品在线观看| 成人欧美视频在线| 成人免费网站www网站高清| 日韩亚洲成人av在线| 亚洲精品一区二区三区区别 | 在线观看中文字幕码| 一区二区三区免费网站| 色婷婷av777| 狠狠色狠狠色综合系列| 免费看又黄又无码的网站| 国产亚洲一区二区三区不卡| 91影视免费在线观看| 成人欧美大片| 免费91麻豆精品国产自产在线观看 | 欧美福利第一页| 国产精品77777竹菊影视小说| 免费在线a视频| 一区二区三区在线观看免费| 麻豆91蜜桃| 无人区乱码一区二区三区| 日韩美女在线看| 欧美性video| 中文字幕亚洲欧美日韩2019| 亚洲精品久久久久久无码色欲四季 | 在线播放国产一区中文字幕剧情欧美 | 午夜精品福利在线视频| 久久综合色一综合色88| 黄页网站在线看| 久久国产精品色| 女性隐私黄www网站视频| 国产精品v日韩精品v欧美精品网站 | 天堂91在线| 精品欧美一区二区三区精品久久| 一级全黄裸体免费视频| 日本韩国一区二区| 色婷婷av国产精品| 亚洲在线成人精品| 三级在线观看免费大全| 亚洲国产精品av| 草草地址线路①屁屁影院成人| 国产一区二区电影| 中文字幕免费高清在线| 日韩av不卡在线观看| 一本大道熟女人妻中文字幕在线| 极品尤物久久久av免费看| 视频一区二区视频| 欧美成人激情| 先锋影音亚洲资源| 红桃成人av在线播放| 欧美欧美一区二区| 日韩欧美美女在线观看| 国产精品一区二区三区四区五区| 91成人在线精品视频| 91精品国产高清久久久久久91裸体| 欧美天堂一区| 国产精品爽黄69| 欧洲亚洲精品久久久久| 国产精品久久久久一区二区| 国产精欧美一区二区三区蓝颜男同| 久久久亚洲成人| 91超碰在线免费| 欧美精品福利在线| 国产探花在线观看| 久久久久女教师免费一区| 爱情岛亚洲播放路线| 久久久久久有精品国产| 91丝袜在线| 欧美中文在线免费| 经典三级一区二区| 国产精品久久久久久网站| 黄色精品视频| 91精品久久久久久| 精品99re| 国产精品国产三级欧美二区| 在线综合色站| 国产成人精品免费视频大全最热 | 韩国欧美国产一区| 成人免费黄色av| 风间由美性色一区二区三区| 亚洲精品激情视频| 97se亚洲国产综合在线| 国产综合精品在线| 国产精品伦理在线| 校园春色 亚洲| 亚洲二区视频在线| 日本黄色一级视频| 欧美日韩小视频| 国内精品久久久久久久久久久| 日韩精品影音先锋| 天天干,夜夜操| 中国china体内裑精亚洲片| 九七电影韩国女主播在线观看| 欧美男插女视频| 美女高潮在线观看| 国产在线久久久| youjizz亚洲| 日本欧美色综合网站免费| 五月激情久久久| 91丨porny丨探花| 日日摸夜夜添夜夜添精品视频| 成人亚洲免费视频| 成人av网站在线| 青青草自拍偷拍| 亚洲国产精品天堂| 看黄色一级大片| 精品精品欲导航| 国产黄在线看| 欧美精品激情在线观看| 色8久久影院午夜场| 99高清视频有精品视频| 亚洲国产精品嫩草影院久久av| 中文字幕欧美人与畜| 精久久久久久| 中文字幕永久有效| 久久―日本道色综合久久| 182在线观看视频| 一本色道久久综合亚洲91| 国产农村老头老太视频| 亚洲毛片在线免费观看| 性欧美高清come| 国产精品电影在线观看| 国产图片一区| 美女黄色片网站| 校园激情久久| 国产大尺度视频| 亚洲图片你懂的| 69av视频在线观看| 亚洲第一区在线| 国产激情在线观看| 国产精品久久一区主播| 欧美wwwwww| 300部国产真实乱| 免费一级欧美片在线观看| 毛茸茸free性熟hd| 亚洲精品老司机| 国产一区二区视频免费观看| 亚洲免费中文字幕| missav|免费高清av在线看| 成人做爽爽免费视频| 精品一区不卡| 97在线免费公开视频| 成av人片一区二区| 欧美人与禽zozzo禽性配| 这里只有精品电影| 888av在线| 国产精品极品尤物在线观看| 美女久久99| 99爱视频在线| 成人av网站免费| 懂色av.com| 亚洲精品久久在线| 岛国在线视频网站| 国产一级特黄a大片99| 亚洲精品看片| 精品国产乱码久久久久夜深人妻| 亚洲精品水蜜桃| 国产成年妇视频| 美女视频黄免费的亚洲男人天堂| 日本黄色成人| 樱空桃在线播放| 国内精品免费**视频| 看免费黄色录像| 91精品国产综合久久精品app | 国产综合视频在线| 欧美黑人性猛交| 成人中文字幕视频| 六月婷婷在线视频| 91视频www| 精品一区二区无码| 最近中文字幕mv在线一区二区三区四区| 亚洲伦理影院| 杨幂一区欧美专区| 狠狠网亚洲精品| 麻豆changesxxx国产| 精品福利视频一区二区三区| 爱啪啪综合导航| 欧美尤物一区| 久久精品国产精品亚洲综合| 免费成人美女女在线观看| 3751色影院一区二区三区| 五月花成人网| 国内精品视频在线播放| 日韩精品亚洲一区二区三区免费| 国产又黄又粗视频| 欧美一级专区免费大片| 国产激情在线播放| 日韩高清国产一区在线观看| 美女一区二区视频| 青娱乐av在线| 亚洲欧美日韩精品久久亚洲区| 97精品国产综合久久久动漫日韩 | 青青草原av在线| 久久99精品久久久久久水蜜桃| 天堂精品中文字幕在线| 久久国产波多野结衣| 亚洲成人黄色在线| 三级成人在线| 欧美一级中文字幕| 久久久久久影视| 国产精品视频一区二区三区,| 国内精品一区二区三区四区| 欧美精品第一区| 久久综合桃花网| 色综合中文字幕国产| 八戒八戒神马在线电影| 鲁鲁狠狠狠7777一区二区| 精品无人区卡一卡二卡三乱码免费卡| 久久亚洲AV无码| 在线不卡国产精品| 97精品久久| 中文字幕第88页| 午夜精品久久久久久久| 91精品大全| 国模精品一区二区三区| 久久99精品久久只有精品| 999这里只有精品| 久久亚洲私人国产精品va| 天堂俺去俺来也www久久婷婷| 日韩欧美理论片| 91久久精品一区二区| 国产第一页在线| 伊人狠狠色丁香综合尤物| 99久久久精品|