malloc實現原理【Liunx】

malloc實現原理

  • malloc是什么?
  • malloc,calloc, realloc的區別
  • malloc的實現原理
    • malloc的兩種實現方式
      • 為什么使用brk?
      • 為什么使用mmap?
    • malloc怎么定界的
    • malloc分配的是虛擬內存上的空間嗎?

malloc是什么?

??通過malloc,我們可以開辟一個自定義大小的內存空間。
在這里插入圖片描述
??通過上圖我們可以知道,malloc是一個C的庫函數,參數是分配一個size大小(正整數)的空間,分配成功后返回一個void*指針,說明可以通過強轉,返回一個任意類型的指針。分配空間失敗后返回null

malloc,calloc, realloc的區別

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
??根據上圖來說明:

  • malloc: 分配size字節大小的空間,分配空間成功后返回一個void*指針;分配空間失敗后返回null
  • calloc: 分配numsize字節大小的空間,分配空間成功后返回一個void*指針;分配空間失敗后返回null
  • realloc:ptr指針指向的空間,將其大小改變為size字節大小。成功后返回一個void*指針;失敗后返回null。具體可以參考博客:realloc的用法。

malloc的實現原理

?? malloc是C庫函數,所以底層肯定使用系統調用來實現。
?? malloc分配內存的時候,會預分配一個更大的空間作為內存池,然后在內存池上面劃分所申請大小的空間并返回,free時也不會將空間直接釋放,而是將空間歸還給內存池。但通過后面我們可以知道,只有當底層使用brk時才是這樣的,使用mmap時直接分配內存,free后就還給OS,不會和內存池產生交互。

malloc的兩種實現方式

malloc通過以下兩個系統調用來實現:

  1. brk: 當分配的空間大小 小于 128KB時, 在堆上分配空間。
  2. mmap: 當分配的空間大小 大于 128KB時, 在文件映射區上分配空間。

為什么使用brk?

?? 當分配的空間大小 小于 128KB時, 在堆上分配空間。為什么這樣設計呢?
?? 因為mmap使用完內存free會直接釋放歸還給操作系統,頻繁的調用mmap會使得用戶態和內核態來回切換,會降低效率,于是利用了內存池來解決這個問題,每次調用brk函數都會預分配更大的空間來放入內存池,下一次在調用brk的時候,就可以不用切換為內核態,直接將內存池的空間分配即可,提高了效率。

為什么使用mmap?

?? 為什么使用mmap呢?
??因為brk在內存池中的釋放空間和申請空間都會造成許多內存碎片,如果我們頻繁申請很多大空間的內存,如果都使用brk,就會造成內存池中出現許多空間大的內存碎片,造成了空間浪費。
??所以,當我們申請小空間的內存時,使用brk,將其放入內存池,就算形成內存碎片也不會造成很大的空間浪費, 而且減少了內核態和用戶態的切換,提高了效率。當我們申請大空間的內存時,使用mmap,就能避免內存池中沒有合適大小的空間,并且free后直接釋放給了操作系統,避免了造成更大的空間浪費。

malloc怎么定界的

?? malloc分配空間時,會返回一個指向所申請空間開頭地址的指針,那么只靠這一個指針,是怎么分辨分配空間的界限的呢?怎么知道空間有多大呢?
??原因是因為malloc在分配內存時,多分配了一段內存空間,其中存儲了用戶所需空間的大小,有了這個我們就能確定界限。這段多分配的空間就在malloc返回的指針指向地址的前面的空間處。如圖:
在這里插入圖片描述

malloc分配的是虛擬內存上的空間嗎?

??malloc分配的是虛擬內存上的空間,一開始并不會在物理內存上面分配內存,當我們使用這個空間的時候,拿到這個虛擬地址,去頁表查詢,會發現沒有對應的頁表項,就會觸發缺頁中斷,然后操作系統在物理內存分配相應大小的空間,更新頁表,再重新查詢,這時候,才會真正的在物理內存上分配內存。
??所以,如果一直使用mmap,每次都釋放空間給操作系統,頁表中的頁表項也會被刪除,再進行申請空間的, 使用空間的時候,就會造成缺頁中斷,造成效率低下。而使用brk不會將內存空間返還給操作系統,頁表中這個已經free的空間和物理內存頁面的映射關系可能還在,下次申請空間時就不會造成缺頁中斷。


???????新人創作不易,你的點贊和關注都是對我莫大的鼓勵,再次感謝您的觀看。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42990.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42990.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42990.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LinK3D: Linear Keypoints Representation for 3D LiDAR Point Cloud【翻譯與解讀】

LinK3D: Linear Keypoints Representation for 3D LiDAR Point Cloud 摘要 特征提取和匹配是許多機器人視覺任務的基本組成部分,如 2D 或 3D 目標檢測、識別和配準。2D 特征提取和匹配已取得巨大成功。然而,在 3D 領域,當前方法由于描述性差…

MySQL零散拾遺

mysql中大小寫敏感嗎? MySQL數據庫默認情況下是不區分大小寫的,這意味著在查詢時,字段名和值的大小寫不會影響結果。然而,這種默認行為可能會根據操作系統和配置的不同而有所變化。 在某些操作系統上,比如Linux&…

在android13的系統中出現INSTALL_FAILED_BAD_PERMISSION_GROUP安裝失敗的問題解決

在android13的系統中,編譯能過,但是在真機運行出現無法安裝的問題的問題,AS中提示出現INSTALL_FAILED_BAD_PERMISSION_GROUP的問題,找了好多資料都沒有找到具體的解決方案,記錄一下 解決方法: 在manifest中…

初識神經網絡之我的理解

初識神經網絡之我的理解 個人理解分析一個神經網絡相關python代碼參考文檔個人理解 個人認為神經網絡是一個分類問題,即通過多維的參數通過合適的計算來得到一個確定的輸出。 在數學層面看來是從高維度的參數降維為低維度的分類的過程。至于輸出的結果如何達成我們想要的或者…

Linux操作系統安全分析與防護

Linux操作系統安全機制 Linux操作系統由于其開放源代碼和廣泛應用,在服務器和嵌入式系統中占有重要地位。為了確保Linux系統的安全,必須了解并實施一系列有效的安全機制。這些機制包括用戶身份驗證、訪問控制、數據加密、日志和審計、安全更新等。 一、…

2024前端面試題之Vue3

2024前端面試題之Vue3 在面試具有五年經驗的前端工程師時,對于 Vue 3 的掌握程度是一個重要的考核點。本文將提供一系列針對這一級別工程師的 Vue 3 面試題,并附上詳細的解析,幫助面試官全面評估候選人的技術實力和項目經驗。 一、Vue 3 基礎…

vscode-server安裝和部分配置

文章目錄 前言code-server安裝rpm包安裝tar.gz安裝 vscode部分配置vscode配置函數跳轉安裝插件 vscode的structurevscode的hierarchy更改顏色主題 前言 vscode確實彳亍,雖然我覺得Clion(c/c語言版的IDEA)更方便,但是畢竟我沒錢買license 這里記錄一下網…

11410-00SF 同軸連接器

型號簡介 11410-00SF是Southwest Microwave的連接器。該連接器的外殼采用優質不銹鋼,材質為 CRES ALLOY UNS-S303500,符合 ASTM-A582 標準。首先,不銹鋼材料經過鍛造加工,形成轉接器的基本形狀。然后,外殼進行精密的 C…

認字之 刬

chǎn 釋義 1.同“鏟”,鏟子。用以撮取東西的工具。 chn 釋義 1.[一刬]一概;一律。 刬襪 [ chǎn w ] 只穿襪子,不穿鞋子走路。 菩薩蠻花明月暗籠輕霧 李煜 刬襪步香階, 手提金縷鞋。 點絳唇蹴罷秋…

前端調用有道翻譯

有道API ,注冊用戶信息并拿到有道翻譯的應用ID和應用密鑰 安裝 crypto-js npm install crypto-js 調用翻譯API import CryptoJS from crypto-js;export const yandex (query: any) > {let appKey ;//應用IDvar salt new Date().getTime();var curtime Mat…

CentOS7忘記root密碼無法登陸解決方法

重啟服務器,等到如圖下所示界面的時候,快速按下鍵盤的↑或者↓按鍵,等固定住畫面,然后按下e按鍵 然后按鍵盤上的↓按鍵,找到圖下所示的linux16開頭的那段,然后把光標挪到ro這里 按照圖下所示,把…

提供跨平臺的視覺安防解決方案,滿足不同場景的需求的智慧交通開源了。

智慧交通視覺監控平臺是一款功能強大且簡單易用的實時算法視頻監控系統。它的愿景是最底層打通各大芯片廠商相互間的壁壘,省去繁瑣重復的適配流程,實現芯片、算法、應用的全流程組合,從而大大減少企業級應用約95%的開發成本。用戶只需在界面上…

.net6 當連接用戶的shell斷掉后,dotnet會自動關閉,達不到長期運行的效果。.NET 進程守護

1、/etc/systemd/system/ 目錄下創建service文件 如:/etc/systemd/system/testDemoSer.service 2、文件內容示例: [Unit] DescriptiontestDemoSer running on CentOS [Service] WorkingDirectory/usr/project/iis Typesimple Userroot Grouproot Exec…

大氣熱力學(6)——位溫和假相當位溫

本篇文章源自我在 2021 年暑假自學大氣物理相關知識時手寫的筆記,現轉化為電子版本以作存檔。相較于手寫筆記,電子版的部分內容有補充和修改。筆記內容大部分為公式的推導過程。 文章目錄 6.1 位溫6.2 斜 T-lnP 圖(Skew T-lnP)6.2…

JAVA獲取重定向地址URL的兩種方法

1、使用HttpURLConnection HttpURLConnection conn = (HttpURLConnection) new URL("http://192.168.1.200/6178dc0f47ec4fb8b0f01d87e13ea92d").openConnection();conn.setInstanceFollowRedirects(false

第二課使用域名dns ping通www.baidu.com

需要一臺dns服務器,實現域名解析,把對應的網址變為Ip地址。 首先按照之前博客的配置,自動分配給PC1和PC2的IP地址等相關配置。 然后增加一臺server交換機連接到交換機上,配置好ip地址,192.168.1.100。在dnsServer中。…

CAD應用程序開發工具CST CAD Navigator 1.4.0.1 正式發布—— 帶來了 G 代碼生成功能

CST CAD Navigator是一款兼容Windows和Linux的CAD應用程序。在其簡單的界面下,有一個可以快速查看2D圖紙和3D模型的強大核心。軟件可以輕松地導入和導出文件,獲取尺寸,并創建截面視圖。 下載最新版CST CAD Navigatorhttps://www.evget.com/p…

react小白面試不得不會的20個問題——第二篇

當然,以下是后十個問題的簡要回答: React中的受控組件和非受控組件有什么區別? 受控組件是指其值由React組件的state控制的輸入表單元素。每當表單元素的值發生變化時,都會觸發一個事件處理器,該處理器會更新組件的sta…

AUTOSAR:汽車軟件架構的未來

AUTOSAR:汽車軟件架構的未來 引言 隨著汽車行業向智能化、電動化轉型,汽車軟件系統變得日益復雜。AUTOSAR(Automotive Open System ARchitecture)作為一個開放的標準化汽車軟件架構,為汽車電子系統的開發提供了統一的…

寫時拷貝 --全篇來自chatgpt

fork是Unix和類Unix操作系統中用于創建進程的系統調用。fork會創建一個子進程,該子進程幾乎是父進程的完全拷貝,包括代碼段、數據段、堆和棧。然而,為了提高效率,fork使用了一種叫做寫時拷貝(Copy-On-Write, COW&#…