中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

石家莊電子商城網(wǎng)站建設(shè)鄭州網(wǎng)站關(guān)鍵詞排名

石家莊電子商城網(wǎng)站建設(shè),鄭州網(wǎng)站關(guān)鍵詞排名,安徽網(wǎng)站線上開發(fā)公司,無錫公共工程建設(shè)中心網(wǎng)站2021年末面試蔚來汽車,面試官考察了malloc/free的實現(xiàn)機制。當時看過相關(guān)的文章,有一點印象,稍微說了一點東西,不過自己感到不滿意。今天嘗試研究malloc的實現(xiàn)細節(jié),看了幾篇博文,發(fā)現(xiàn)眾說紛紜,且…

? ? ? ?2021年末面試蔚來汽車,面試官考察了malloc/free的實現(xiàn)機制。當時看過相關(guān)的文章,有一點印象,稍微說了一點東西,不過自己感到不滿意。今天嘗試研究malloc的實現(xiàn)細節(jié),看了幾篇博文,發(fā)現(xiàn)眾說紛紜,且實現(xiàn)比較復雜。在此,對malloc的實現(xiàn)機制進行研究,了解其大概的工作機制,沒有深究細節(jié)。

先說結(jié)論:

內(nèi)存的分配:

可以把內(nèi)存空間的分配分為兩個過程:

1)從操作系統(tǒng)獲取到內(nèi)存,實際獲取到的內(nèi)存一般比進程申請的空間大一些。

2)從申請到的空間中拿出來一部分給到進程。

所以,一般會有部分備用的內(nèi)存空間。所以,就有了下面的結(jié)論。

1.如果進程申請的空間小于備用的空間,則直接把內(nèi)存分配給進程。

2.如果進程申請的空間大于備用的空間,

1)申請的空間<128KB,通過系統(tǒng)調(diào)用brk在現(xiàn)有地址的基礎(chǔ)上擴張,即新分配的空間和之前的空間是連續(xù)的。

2)申請的空間>128KB,通過mmap在物理內(nèi)存映射一段空間。

內(nèi)存的釋放:

試驗環(huán)境:ubuntu虛擬機,gcc:Ubuntu 9.4.0-1ubuntu1~20.04.1

測試代碼:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>typedef unsigned char uint8;int main()
{//step1getchar();uint8* p1 = (uint8*)malloc(127 * 1024 * sizeof(uint8));printf("p1:%p,size:%ld\n", p1, malloc_usable_size(p1));//step2getchar();free(p1);//step3getchar();uint8* p2 = (uint8*)malloc(127 * 1024 * sizeof(uint8));printf("p2:%p,size:%ld\n", p2, malloc_usable_size(p2));//step4getchar();uint8* p3 = (uint8*)malloc(127 * 1024 * sizeof(uint8));printf("p3:%p,size:%ld\n", p3, malloc_usable_size(p2));//step5getchar();uint8* p4 = (uint8*)malloc(500 * 1024 * sizeof(uint8));printf("p4:%p,size:%ld\n", p4, malloc_usable_size(p4));//step6getchar();uint8* p5 = (uint8*)malloc(1024 * sizeof(uint8));printf("p5:%p,size:%ld\n", p5, malloc_usable_size(p5));//step7getchar();free(p5);//step8getchar();free(p4);getchar();return 0;
}

測試方法:

1.通過strace跟蹤進程執(zhí)行的過程。

2.通過cat /proc/PID/maps觀察堆區(qū)的分配情況。

測試過程和分析:

strace ./a.out

brk(NULL) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 0x55c726c6e000
brk(0x55c726c8f000) ? ? ? ? ? ? ?= 0x55c726c8f000
//進程啟動之后,系統(tǒng)自動分配了0x55c726c8f000-0x55c726c6e000,約為400K的內(nèi)存,這部分內(nèi)存,是備用的。

//step1:55c726c6e000-55c726c8f000 [heap]
//進程請求分配127K內(nèi)存,由于系統(tǒng)已有400K空余的內(nèi)存,夠用,所以,直接給進程返回一塊內(nèi)存。起始地址為p1=0x55c726c6e6b0,和預留的起始地址相比,有一定的偏移量
read(0,?
"\n", 1024) ? ? ? ? ? ? ? ? ? ? = 1
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
write(1, "p1:0x55c726c6e6b0,size:130056\n", 30p1:0x55c726c6e6b0,size:130056
) = 30

//step2:55c726c6e000-55c726c8f000 [heap]
//free(p1),系統(tǒng)只是把這塊空間標記為可用的,并沒有真正的釋放其內(nèi)存空間。
read(0,?
"\n", 1024) ? ? ? ? ? ? ? ? ? ? = 1

//step3:55c726c6e000-55c726c8f000 [heap]
//再次請求分配127K的內(nèi)存,備用的內(nèi)存空間夠用,同step1,直接分配給進程。
read(0,?
"\n", 1024) ? ? ? ? ? ? ? ? ? ? = 1
write(1, "p2:0x55c726c6e6b0,size:130056\n", 30p2:0x55c726c6e6b0,size:130056
) = 30

//step4:55c726c6e000-55c726ccf000 [heap]
//再次請求分配129K的內(nèi)存空間,之前剩余的備用空間約為400K-127K-127K=146K,不夠用了。而且,請求分配的內(nèi)存<128K,在原來地址的基礎(chǔ)上,通過brk擴充內(nèi)存空間,即和原來的內(nèi)存是連續(xù)的
read(0,?
"\n", 1024) ? ? ? ? ? ? ? ? ? ? = 1
brk(0x55c726ccf000) ? ? ? ? ? ? ? ? ? ? = 0x55c726ccf000
write(1, "p3:0x55c726c8e6d0,size:130056\n", 30p3:0x55c726c8e6d0,size:130056
) = 30

//step5
//55c726c6e000-55c726ccf000 [heap]
//f2b3313f000-7f2b331bd000?
//再次請求分配500K的內(nèi)存空間,之前剩余的備用空間不夠用了,而且,請求分配的內(nèi)存>128K,通過mmap在物理內(nèi)存映射一塊空間,且和原來的空間是不連續(xù)的
read(0,?
"\n", 1024) ? ? ? ? ? ? ? ? ? ? = 1
mmap(NULL, 516096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2b3313f000
write(1, "p4:0x7f2b3313f010,size:516080\n", 30p4:0x7f2b3313f010,size:516080
) = 28

//step6
//55c726c6e000-55c726ccf000 [heap]
//f2b3313f000-7f2b331bd000?
//同step1
read(0,?
"\n", 1024) ? ? ? ? ? ? ? ? ? ? = 1
<pre>write(1, &quot;p5:0x55c726cae2e0,size:1032\n&quot;, 28p5:0x55c726cae2e0,size:1032</pre>

//step7
//55c726c6e000-55c726ccf000 [heap]
//f2b3313f000-7f2b331bd000?
//同step2
read(0,?
"\n", 1024) ? ? ? ? ? ? ? ? ? ? = 1

//step8:55c726c6e000-55c726ccf000 [heap]
//通過munmap釋放內(nèi)存
read(0,?
"\n", 1024) ? ? ? ? ? ? ? ? ? ? = 1
munmap(0x7f2b3313f000, 516096)

http://www.risenshineclean.com/news/4923.html

相關(guān)文章:

  • 重慶營銷型網(wǎng)站建設(shè)多少錢如何制作簡單的網(wǎng)頁鏈接
  • 張家港做網(wǎng)站優(yōu)化排名seo的優(yōu)化方案
  • 有沒有專業(yè)幫忙做ppt的網(wǎng)站近期發(fā)生的重大新聞
  • wordpress清理修訂seo百度首頁排名業(yè)務(wù)
  • 網(wǎng)站建設(shè)合集網(wǎng)絡(luò)營銷的主要手段和策略
  • 網(wǎng)站建設(shè)課的感想百度惠生活怎么做推廣
  • 長安鎮(zhèn)網(wǎng)站建設(shè)公司自媒體視頻剪輯培訓班
  • 網(wǎng)站手機端和電腦端seo零基礎(chǔ)入門到精通200講
  • 數(shù)字營銷公司淘寶關(guān)鍵詞怎么優(yōu)化
  • 模板網(wǎng)站建設(shè)咨詢百度網(wǎng)頁版首頁
  • 寧波營銷型網(wǎng)站建設(shè)百度站長工具數(shù)據(jù)提交
  • 貴陽手機網(wǎng)站制作全國免費發(fā)布廣告信息平臺
  • wp網(wǎng)站建設(shè)教程公司域名注冊查詢
  • 高端網(wǎng)站建設(shè)服務(wù)商seo外包費用
  • 建店前期網(wǎng)站開通怎么做分錄百度推廣官方投訴電話
  • poedit wordpress無錫seo優(yōu)化
  • 院系網(wǎng)站建設(shè)網(wǎng)絡(luò)產(chǎn)品運營與推廣
  • 一級a做爰片就在線手機看韓國網(wǎng)站軟件制作平臺
  • 中小型網(wǎng)站建設(shè)新聞全國各城市感染高峰進度查詢
  • 東莞貿(mào)易公司寮步網(wǎng)站建設(shè)價格百度關(guān)鍵詞點擊排名
  • 比較公司網(wǎng)站與營銷網(wǎng)站的不同武威網(wǎng)站seo
  • 西安十強網(wǎng)絡(luò)公司搜索引擎優(yōu)化大致包含哪些內(nèi)容或環(huán)節(jié)
  • 外掛網(wǎng)站模板長沙seo網(wǎng)站管理
  • 做公司網(wǎng)站搜索引擎優(yōu)化seo專員
  • ps和dw 做網(wǎng)站百度賬號怎么改名字
  • 好的做彩平圖的網(wǎng)站百度手機助手下載安裝
  • 自建免費網(wǎng)站朋友圈廣告代理商官網(wǎng)
  • 如何用域名建網(wǎng)站策劃公司排行榜
  • 網(wǎng)站建設(shè)高清圖片百度在線客服系統(tǒng)
  • 織夢移動端網(wǎng)站模板下載如何在百度搜索到自己的網(wǎng)站