精品欧美一区二区三区在线观看 _久久久久国色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香蕉亚洲精品| 久久成人亚洲精品| 在线免费视频一区| 国产黄色在线网站| 成人性生交大片免费看中文网站| 97视频在线免费观看| 四季av中文字幕| 日韩精品久久久久久久软件91| 亚洲18女电影在线观看| 日韩精品一区二区三区四区五区| 99久久精品无免国产免费| 国产一区二区三区久久| 久久精品久久久久| 五月开心播播网| 高清不卡一区| 日韩欧美在线观看| 日韩欧美猛交xxxxx无码| 久蕉在线视频| 成人99免费视频| 成人国产精品av| 午夜影院免费在线观看| 亚洲一级淫片| 在线精品视频视频中文字幕| 图片区偷拍区小说区| 69亚洲精品久久久蜜桃小说| 久久久久久久久久久妇女 | 日韩中文字幕观看| 久久国产精品99久久人人澡| 97超级碰碰碰久久久| 9999热视频| 手机亚洲手机国产手机日韩| 日韩av有码在线| 不卡的一区二区| 4438五月综合| 欧美日韩午夜精品| 免费日韩中文字幕| 欧美私密网站| 亚洲成av人在线观看| 青青草影院在线观看| porn亚洲| 日本一区二区三区在线观看| 精品一区久久久久久| 黄色一级大片在线免费看国产| 精品一区二区三区影院在线午夜| 国产精品久久久久久久久久久久久| 免费在线不卡视频| 韩国自拍一区| 精品久久久久久最新网址| 国产欧美一区二| 巨大黑人极品videos精品| 在线影视一区二区三区| 欧美黄网站在线观看| √天堂8资源中文在线| 亚洲成人高清在线| 日本五级黄色片| 国产网红女主播精品视频| 亚洲欧美日韩国产一区二区三区| 超碰免费在线公开| 国产网站在线免费观看| 综合欧美亚洲日本| 成年人三级视频| 超碰电影在线播放| 一区二区三区 在线观看视频| 日韩免费在线观看av| 香蕉久久aⅴ一区二区三区| 国产成人免费xxxxxxxx| 999视频在线观看| 不卡的日韩av| 99在线精品视频| 久久久久一区二区| 黄视频在线观看免费| 国产精品无圣光一区二区| 在线观看成人av| 午夜影院免费在线| 欧美日韩黄色大片| 中文字幕欧美人妻精品一区| 日韩欧国产精品一区综合无码| 555www色欧美视频| 欧美图片自拍偷拍| 亚洲国产欧美日韩在线观看第一区 | 国产网站一区二区| 亚洲最新在线| 日本高清在线观看| 疯狂欧美牲乱大交777| 欧美一级黄色影院| 美国十次综合久久| 日韩av综合中文字幕| 丁香激情五月少妇| 欧美成熟视频| 日本高清久久天堂| 国产日韩欧美视频在线观看| 9色porny自拍视频一区二区| 日韩欧美亚洲日产国| 超鹏97在线| 色94色欧美sute亚洲线路一ni| 亚洲欧美国产中文| 福利欧美精品在线| 中文一区二区视频| 日产亚洲一区二区三区| 美女视频第一区二区三区免费观看网站 | 国产又黄又爽免费视频| av午夜在线观看| 欧美性欧美巨大黑白大战| 性高潮久久久久久| 欧美亚洲国产激情| 午夜精品久久久99热福利| 亚洲无码久久久久| 成人av网站在线观看免费| 亚洲a∨一区二区三区| 91制片在线观看| 欧美老女人第四色| 男人天堂av电影| 国产精品九九| 成人免费福利视频| 黄色av免费在线观看| 亚洲一区二区精品久久av| 91极品尤物在线播放国产| 女同另类激情重口| 欧美精品免费播放| 伊人网站在线观看| 久久蜜桃av一区精品变态类天堂| 乱熟女高潮一区二区在线| 成人h在线观看| 亚洲精品视频久久| 日本五十路女优| 国产乱码精品一区二区三区av | 成年人看的免费视频| 在线视频日韩| 国产91视觉| а√天堂资源地址在线下载| 欧美色视频一区| 色一情一交一乱一区二区三区| 最新日韩欧美| 99porn视频在线| 午夜成年人在线免费视频| 欧美日韩国产精品成人| 中文字幕免费在线看线人动作大片| 亚洲青涩在线| 国产伦精品一区二区三区四区免费| 激情在线小视频| 在线观看91av| 美国黄色片视频| 老司机午夜精品| 亚洲精品自在在线观看| 素人啪啪色综合| 中国china体内裑精亚洲片| caoporn国产| 久久久美女毛片| 已婚少妇美妙人妻系列| 欧美欧美黄在线二区| 热99精品里视频精品| 全色精品综合影院| 日本韩国精品在线| 精品人妻少妇嫩草av无码| 亚洲欧美日本日韩| 热久久这里只有精品| 神马午夜电影一区二区三区在线观看 | 高清精品在线| 亚洲国产一区二区三区在线观看| 国产奶水涨喷在线播放| 北条麻妃国产九九精品视频| 日韩在线一级片| 国产成人精品免费视| 国产97色在线|日韩| 国产免费a∨片在线观看不卡| 欧美在线观看一二区| 99国产精品无码| 国产麻豆精品久久一二三| 国产一区二区三区小说| 免费萌白酱国产一区二区三区| 欧美综合在线第二页| 国产69久久| 91精品欧美一区二区三区综合在 | 欧洲一区在线电影| 一级黄色片日本| 国产成人精品影视| 97视频在线免费播放| 日韩中文在线电影| 91精品在线影院| freexxx性亚洲精品| 亚洲网站视频福利| 97超碰国产在线| 亚洲第一成年网| 亚洲AV无码片久久精品| 九色综合国产一区二区三区| 激情成人开心网| 亚洲黄页网站| 亚洲综合小说区| 成人做爰视频www网站小优视频| 日日骚久久av| 丰满岳乱妇国产精品一区| 91国产视频在线观看| 欧美成人免费观看视频| 久久精品一级爱片| 四虎1515hh.com| 日韩中文字幕一区二区三区| 妺妺窝人体色www看人体| 你懂的一区二区三区| 91香蕉电影院| 一呦二呦三呦精品国产| 欧美激情a在线| caoporn国产精品免费视频| 欧美成人精品高清在线播放| 欧美一级黄视频| 亚洲国产aⅴ成人精品无吗| 国产日韩精品中文字无码| av一区二区三区| www.欧美激情.com| 久久精品午夜| 日韩精品在线观看av| 成人一二三区| 蜜桃传媒一区二区| 7m精品国产导航在线| 国产日韩欧美日韩| 亚洲同志男男gay1069网站| 欧美人成在线视频| 欧美三级理伦电影| 亚洲人成网站999久久久综合| 亚洲精品97久久中文字幕无码 | 欧美一区二区三区免费视| 91精品久久| 色婷婷**av毛片一区| 欧美孕妇性xxxⅹ精品hd| 精品国产污网站| 亚洲国产成人精品一区二区三区| 欧美浪妇xxxx高跟鞋交| 最近中文字幕免费观看| 色综合久久中文综合久久97| 日韩女同强女同hd| 亚洲最大色网站| 国产大学生自拍| 亚洲图片激情小说| 黄色免费一级视频| 国产精品视频观看| 人妻精品久久久久中文| 91麻豆国产福利精品| 波多野结衣视频播放| 成人性生交大片免费看视频在线 | 国产极品粉嫩福利姬萌白酱| 亚洲视频精品| 亚洲理论电影在线观看| 国内精品久久久久久久影视蜜臀| 黄色影视在线观看| 欧美在线高清| 国产精品三级一区二区| 欧美一区高清| 日韩成人手机在线| 伊人久久久大香线蕉综合直播| 日本一本中文字幕| 在线日本成人| 精品国产免费av| 久久精品一区二区三区中文字幕 | 欧美影视资讯| 国产精品十八以下禁看| 美女久久久久久| 91在线高清视频| 亚洲图色一区二区三区| 国产精品播放| 日韩成人av在线资源| 麻豆av一区二区三区久久| 蜜桃一区二区三区| 亚洲国产精品综合| 五月开心六月丁香综合色啪 | 久久国产精品-国产精品| 首页亚洲中字| 日韩欧美视频一区二区| 亚洲成人av| 青青青免费在线| 久久一区二区三区超碰国产精品| 午夜视频你懂的| 国产伦精品一区二区三区免费| 国产人成视频在线观看| 久久免费美女视频| 成人欧美一区二区三区黑人一| 亚洲欧美另类在线| 日韩伦理在线视频| 在线免费观看日本一区| 97人妻人人澡人人爽人人精品| 欧美一区二区视频网站| 亚洲欧美激情另类| 亚洲欧美日韩中文在线| 在线观看免费黄色| 欧美激情综合色综合啪啪五月| 亚洲深夜视频| 91久久久久久久久久久久久| 噜噜噜天天躁狠狠躁夜夜精品| 欧美三级网色| 中文字幕一区二区三区在线视频 | 精品影视av免费| jjzzjjzz欧美69巨大| 国产欧美一区二区三区沐欲| 唐朝av高清盛宴| 一本色道a无线码一区v| 99热这里只有精| 亚洲码在线观看| 2024最新电影在线免费观看| 日本久久亚洲电影| 精品国产一级| 日韩国产伦理| 夜夜嗨一区二区| 午夜激情影院在线观看| 91麻豆免费观看| 青青草免费av| 欧美性猛片aaaaaaa做受| 黄色小视频免费观看| 久久精品国产免费观看| www.成人爱| 国产精品v欧美精品v日韩| 国产精品毛片久久| 国产精品第12页| 成人美女在线视频| 日韩av手机在线免费观看| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 一区二区三欧美| 神马午夜在线视频| 91亚色免费| 99精品在线| 免费看国产黄色片| 91免费精品国自产拍在线不卡| 欧美黑人精品一区二区不卡| 欧美日韩高清不卡| 精品福利视频导航大全| 91极品女神在线| 国产精品45p| 日韩精品综合在线| 狠狠色丁香久久婷婷综| 成年人免费在线播放| 福利一区二区在线| 乱h高h女3p含苞待放| 欧美日韩精品一区二区三区四区| 日韩a在线观看| 亚洲3p在线观看| 风间由美性色一区二区三区四区 | 乱码第一页成人| 好吊色视频一区二区三区| 亚洲综合网站在线观看| a视频免费在线观看| 久久九九精品99国产精品| 久久久久久久性潮| 五码日韩精品一区二区三区视频| 国产亚洲毛片在线| 91黄色免费视频| 午夜激情久久久| 午夜成人鲁丝片午夜精品| 91国产精品91| 欧美交a欧美精品喷水| 国产一区二区网| 91亚洲精华国产精华精华液| 亚洲伊人成人网| 亚洲老司机av| 韩国三级一区| 亚洲精品成人三区| 久久99久久99| 外国一级黄色片| 精品国产青草久久久久福利| 888av在线视频| 蜜桃传媒视频麻豆第一区免费观看 | 九九久久婷婷| 一区二区三区视频在线观看免费| 中文字幕的久久| 国产美女免费视频| 欧美第一黄色网| 久久成人福利| 白嫩少妇丰满一区二区| 国产精品成人网| 亚洲成人黄色片| 2019中文字幕在线免费观看| 国产欧美高清视频在线| 在线看的黄色网址| 亚洲啪啪综合av一区二区三区| 亚洲AV午夜精品| 91大神在线播放精品| 国产欧美一区二区精品久久久| 天天干天天爽天天射| 亚洲精品少妇30p| 黄色av网站免费在线观看| 国产盗摄xxxx视频xxx69| 日韩免费久久| 熟妇高潮一区二区| 在线免费观看视频一区| 污污视频在线| 蜜桃传媒视频麻豆第一区免费观看| 麻豆精品在线看| 久久精品视频国产| 在线视频一区二区| 亚洲大奶少妇| 成人3d动漫一区二区三区| 亚洲视频在线观看三级| 午夜福利一区二区三区| 国产精品一区久久| 激情久久综合| xxxxx99| 亚洲精品97久久| gogo大尺度成人免费视频| 女人天堂av手机在线| 日韩理论在线观看| 日本福利片在线| 成人免费视频网站入口| 男男成人高潮片免费网站| 久久精品美女视频|