日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

內存是怎樣一步步被分配出來的?

來源: 責編: 時間:2024-06-27 08:35:07 157觀看
導讀大家好,我是小風哥,今天簡單聊聊內存分配。我們申請一塊內存時計算機內部發生了什么?看下這句代碼:圖片這里有兩部分,一個是malloc,再一個是你寫的代碼。圖片malloc實際上屬于標準庫,標準庫里有什么呢?數學相關的函數,sin、cos

大家好,我是小風哥,今天簡單聊聊內存分配。kGM28資訊網——每日最新資訊28at.com

我們申請一塊內存時計算機內部發生了什么?看下這句代碼:kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

kGM28資訊網——每日最新資訊28at.com

這里有兩部分,一個是malloc,再一個是你寫的代碼。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

kGM28資訊網——每日最新資訊28at.com

malloc實際上屬于標準庫,標準庫里有什么呢?kGM28資訊網——每日最新資訊28at.com

數學相關的函數,sin、cos、絕對值、數冪函數等;字符相關函數,判斷大小寫等;字符串操作函數、字符串拷貝、拼接比較等;當然還有內存管理函數,就是這里提到的malloc/free,當然還有很多其它函數,這就是標準庫。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

再來看你寫的代碼,什么是你寫的代碼呢?以c語言為例,.c文件就是你寫的代碼,這包括你寫的hello world程序、充滿bug的練習程序,當然還有各種項目。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

kGM28資訊網——每日最新資訊28at.com

這就是你寫的代碼。kGM28資訊網——每日最新資訊28at.com

這些代碼怎么變成最終的可執行程序呢?當然是借助編譯器。kGM28資訊網——每日最新資訊28at.com

編譯器會把你的代碼編譯成目標文件。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

接著鏈接器出場,連接器會把目標文件和標準庫打包成可執行程序。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

這就是代碼部分,接下來我們看內存分配。kGM28資訊網——每日最新資訊28at.com

到底什么是內存呢?kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

kGM28資訊網——每日最新資訊28at.com

內存實際上和儲物柜非常相似,儲物柜會劃分成了一個一個大小相同的隔間,每個隔間可以存儲東西,內存的道理也一樣,內存也被劃分成了一個一個大小相同的隔間,我們來仔細看一下。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

kGM28資訊網——每日最新資訊28at.com

內存中的每個隔間存儲的是一個字節,8比特位一字節。kGM28資訊網——每日最新資訊28at.com

比如這里申請的一塊int大小的內存,一個int占據4個字節。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

kGM28資訊網——每日最新資訊28at.com

和儲物柜一樣,內存中的每個隔間也有一個編號,這個編號叫做內存地址。kGM28資訊網——每日最新資訊28at.com

在我們的實例中,申請的這塊內存位于內存地址2這個位置,這意味著什么嗯?這意味著變量p等于數字2,或者說等于內存地址2,這里的p就是所謂的指針。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

kGM28資訊網——每日最新資訊28at.com

接著我們看內存分配過程。kGM28資訊網——每日最新資訊28at.com

這段代碼當然屬于編譯后生成的可執行程序,可執行程序是在內存中運行的,當然我們需要為整個程序分配一塊內存。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

程序的運行依賴棧區,這里存放著局部變量等信息;依賴堆區,這里存放著程序員自己管理的動態申請的內存,關于堆區和棧區之前的視頻也有講解;除此之外還依賴代碼區,這里保存的就是編譯后的之類;還有數據區,這里保存著全局變量等信息。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

這些區域在內存中的布局是這樣的:kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

kGM28資訊網——每日最新資訊28at.com

再次強調下,編譯后的代碼位于代碼區,malloc動態申請的內存位于堆區,接下來我們只關注堆區。kGM28資訊網——每日最新資訊28at.com

在程序開始運行時堆區當然是空的,那么所謂的內存分配到底是什么呢?如果讓你實現內存分配器該怎么做到呢?很簡單,其實內存分配就是劃分地盤。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

此時要分配第一塊大小為A的內存,那么你應該把A放在哪里呢?kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

因為此時堆區是空的,顯然你可以把開始這個位置劃分給A,作為A的地盤,找到A的地盤后malloc這個函數返回,內存分配過程結束,是不是很簡單。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

接著程序員又開始申請大小為B的內存,道理和A一樣,把A之后的地盤給B即可。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

程序員又開始申請大小為C的內存,同理。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

kGM28資訊網——每日最新資訊28at.com

接著程序員說A占用的這塊內存使用完畢,調用free釋放,所謂釋放就是把A占據的地盤重新標記為空閑,這時堆區里還有兩塊空閑內存。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

接著程序員開始申請大小為D,這時問題來了,你該從哪里給D劃分地盤呢?kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

kGM28資訊網——每日最新資訊28at.com

放到第一個空閑塊嗎?顯然第一個空閑塊大小不夠。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

第二個呢,第二個也不夠。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

但是你發現了一個問題,仔細看著兩個空閑塊,這兩個空閑塊的總大小實際上是超過D的。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

我們把這種空閑的但是不能用來分配出去的內存稱之為內存碎片。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

你可以想象一下經過不斷的內存申請和釋放,堆區中會存在無數這樣空閑內存碎片。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

碎片化的內存顯然不利于內存的充分利用,計算機科學歷史上有無數論文試圖來解決這個問題。kGM28資訊網——每日最新資訊28at.com

現在堆區已經不足以為D申請出內存,該怎么辦呢?kGM28資訊網——每日最新資訊28at.com

讓我們回到最初的布局,注意看堆區和棧區中間實際上還有一段空閑內存區域,這塊區域就是為堆區或棧區來擴大地盤用的,那么該怎么擴大堆區呢?kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

這就要借助操作系統的幫助了。kGM28資訊網——每日最新資訊28at.com

在linux等系統中可以借助brk等系統調用向操作系統申請來擴大堆區。kGM28資訊網——每日最新資訊28at.com

圖片圖片kGM28資訊網——每日最新資訊28at.com

kGM28資訊網——每日最新資訊28at.com

現在堆區擴容完畢,此時就可以在堆區中找出一塊合適的空閑內存分配給D,到這時malloc這個過程才真正結束,這實際上是一個相當復雜的過程。kGM28資訊網——每日最新資訊28at.com

圖片 圖片 kGM28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-96829-0.html內存是怎樣一步步被分配出來的?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 高通中國區董事長孟樸:攜手生態伙伴,共創數智時代下的新增長機遇

下一篇: 最高優惠 300 元,小米 Civi 4 Pro 手機開啟“暑期特惠”:驍龍 8s Gen3,2799 元起

標簽:
  • 熱門焦點
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • Java NIO內存映射文件:提高文件讀寫效率的優秀實踐!

    Java的NIO庫提供了內存映射文件的支持,它可以將文件映射到內存中,從而可以更快地讀取和寫入文件數據。本文將對Java內存映射文件進行詳細的介紹和演示。內存映射文件概述內存
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標系統提供非預期的輸入并監視異常結果來發現軟件漏洞的方法。可以用來發現應用程序、操作系統和網絡協議等中的漏洞或
  • 一個注解實現接口冪等,這樣才優雅!

    場景碼猿慢病云管理系統中其實高并發的場景不是很多,沒有必要每個接口都去考慮并發高的場景,比如添加住院患者的這個接口,具體的業務代碼就不貼了,業務偽代碼如下:圖片上述代碼有
  • Python異步IO編程的進程/線程通信實現

    這篇文章再講3種方式,同時講4中進程間通信的方式一、 Python 中線程間通信的實現方式共享變量共享變量是多個線程可以共同訪問的變量。在Python中,可以使用threading模塊中的L
  • 東方甄選單飛:有些鳥注定是關不住的

    文/彭寬鴻編輯/羅卿東方甄選創始人俞敏洪帶隊的“7天甘肅行”直播活動已在近日順利收官。成立后一年多時間里,東方甄選要脫離抖音自立門戶的傳聞不絕于耳,“7
  • 華為Mate60標準版細節曝光:經典星環相機模組回歸

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • OPPO K11采用全方位護眼屏:三大護眼能力減輕視覺疲勞

    日前OPPO官方宣布,全新的OPPO K11將于7月25日正式發布,將主打旗艦影像,和同檔位競品相比,其最大的賣點就是將配備索尼IMX890主攝,堪稱是2000檔位影像表
  • “買真退假” 這種“羊毛”不能薅

    □ 法治日報 記者 王春   □ 本報通訊員 胡佳麗  2020年初,還在上大學的小東加入了一個大學生兼職QQ群。群主“七王”在群里介紹一些刷單賺
Top 主站蜘蛛池模板: 吉木乃县| 亚东县| 武平县| 克什克腾旗| 游戏| 罗江县| 莫力| 子洲县| 吉水县| 宝应县| 稻城县| 孝昌县| 施甸县| 阿拉善盟| 台山市| 丰原市| 丰台区| 富阳市| 淄博市| 贵州省| 项城市| 茂名市| 西峡县| 肥西县| 高要市| 漠河县| 玉龙| 岚皋县| 玉林市| 治县。| 张家界市| 乐安县| 枞阳县| 汉中市| 孟州市| 抚顺市| 宾川县| 灵寿县| 金乡县| 西吉县| 陈巴尔虎旗|