在线亚洲黄色-在线亚洲观看-在线亚洲电影-在线亚洲成人-岛国大片在线观看免费版-岛国大片在线播放高清

mallocfree的實現

導讀Chunk;C標準庫在管理分配出去的heap時的基本單位是chunk,chunk只是一個邏輯概念,它的數據結構如下:structmalloc_chunk{。size_tprev_size。size_tsize。structmalloc_chunk*fd。structmalloc_chunk*bk。structmalloc_chunk*fd_nextsize。structmalloc_chunk*bk_nextsize。}。

系統大全為您提供ChunkC標準庫在管理分配出去的heap時的基本單位是chunk,chunk只是一個邏輯概念,它的數據結構如下:structmalloc_chunk{size_tprev_size;size_tsize;structmalloc_chunk*fd;structmalloc_chunk*bk;structmalloc_chunk*fd_nextsize;structmalloc_chunk*bk_nextsize;};如果一個chunk是free的狀態,那么它的fd和bk就構成一個雙鏈表,記錄著那些已經被用戶free了內存,這樣以后就可以從這里直接分配或者合并成為大的空閑塊以后再分配。如果一個chunk已經被alloc了,那么此時從size之后就是用戶的數據,也就是說fd、bk等沒有意義,這個從注釋中不難看出。當一個chunk被分配出去時,size記錄了這個chunk中實際分配給用戶程序的內存大小,也就是我們調用malloc時的那個參數值,而prev_size記錄的是與當前chunk相鄰的上一個chunk的大小。這樣設計的原因是可以快速地定位/合并相鄰的chunk.例如,如果當前chunk地址為char*p,那么上/下一個chunk的地址分別就是p-p->prev_size和p+p->size.簡單分析下下面這兩個宏就一目了然了:(1)從chunk得到用戶指針(這里SIZE_SZ即sizeof(size_t))#definechunk2mem(p)((void_t*)((char*)(p)+2*SIZE_SZ))(2)從用戶指針得到chunk地址#definemem2chunk(mem)((mchunkptr)((char*)(mem)-2*SIZE_SZ))在分配內存時,chunk的對其單位是8Byte,這樣size的低3位就都是0,那么就可以作為其他用途。在glibc中有兩個定義:#definePREV_INUSE0x1#defineIS_MMAPPED0x2這里PREV_INUSE記錄了上一個chunk是否被使用(如果被分配則為1),而IS_MMAPPED標識當前chunk是否是通過mmap分配得到。下面這些宏可以加深我們對chunk的理解://獲取當前chunk(p)的下一個chunk#definenext_chunk(p)((mchunkptr)(((char*)(p))+((p)->size&~PREV_INUSE)))//獲取當前chunk(p)的上一個chunk#defineprev_chunk(p)((mchunkptr)(((char*)(p))-((p)->prev_size)))//判斷當前chunk(p)是否被使用,注意:p的inuse位信息保存在下一個相鄰chunk的size中#defineinuse(p)((((mchunkptr)(((char*)(p))+((p)->size&~PREV_INUSE)))->size)&PREV_INUSE)//將當前chunk(p)設置為被使用,也即設置下一個相鄰chunk中size的最低位為1#defineset_inuse(p)((mchunkptr)(((char*)(p))+((p)->size&~PREV_INUSE)))->size|=PREV_INUSEmalloc數據結構這個數據結構記錄了系統當前分配內存的狀態,默認情況下,當分配內存小于64B時通過fastbin分配,它是一個cachingallocator,也就是說一種memorypool.當分配內存大于512B時,系統按照best-fit算法分配,也就是可以滿足需求的最小size的chunk.介于二者之間的情況比較復雜。structmalloc_state{mutex_tmutex;intflags;mchunkptrfastbins[NFASTBINS];mchunkptrtop;mchunkptrlast_remainder;mchunkptrbins[NBINS*2-2];unsignedintbinmap[BINMAPSIZE];structmalloc_state*next;INTERNAL_SIZE_Tsystem_mem;INTERNAL_SIZE_Tmax_system_mem;};malloc實現(void*malloc(size_tsize))該調用在內部實現為_int_malloc(mstateav,size_tbytes)。主要步驟如下:1、確定內部分配內存大小,它是用宏request2size計算得到。:#definerequest2size(req)(((req)+SIZE_SZ+MALLOC_ALIGN_MASKfastbins[idx]);if((victim=*fb)!=0){if(__builtin_expect(fastbin_index(chunksize(victim))!=idx,0))malloc_printerr(check_action,"malloc():memorycorruption(fast)",chunk2mem(victim));*fb=victim->fd;check_remalloced_chunk(av,victim,nb);void*p=chunk2mem(victim);if(__builtin_expect(perturb_byte,0))alloc_perturb(p,bytes);returnp;}}fastbin_index(nb):?這是一個宏,定義為#definefastbin_index(sz)((((unsignedint)(sz))》3)-2)。觀察malloc_state數據結構,它有一個fastbin的指針數組,每個數組成員分配是一個單鏈表的表頭,可見fastbin[i]專門用于分配大小為16+8i的內存塊。*fb=victim->fd:當執行到這一行時,fastbin[idx]肯定不為空,也就是說當前內存分配可以直接從fastbin中滿足,那么下面自然是從單鏈表中取下victim這個chunk,而這行賦值語句正是完成這個任務。這里相當于fastbin[idx]這個指針指向了victim這個chunk的后繼(victim->fd),也就是說將victim從鏈表中移除。void*p=chunk2mem(victim)前文中已經分析過這個宏了,它返回的是chunk內用戶內存的首地址。3、如果分配內存大于64B,但是小于512B,那么仍屬于小塊內存請求,從smallbin中分配if(in_smallbin_range(nb)){idx=smallbin_index(nb);bin=bin_at(av,idx);if((victim=last(bin))!=bin){if(victim==0)malloc_consolidate(av);else{bck=victim->bk;set_inuse_bit_at_offset(victim,nb);bin->bk=bck;bck->fd=bin;if(av!=&main_arena)victim->size|=NON_MAIN_ARENA;check_malloced_chunk(av,victim,nb);void*p=chunk2mem(victim);if(__builtin_expect(perturb_byte,0))alloc_perturb(p,bytes);returnp;}}}smallbin_index(nb):它也是一個宏,它定義等價于#definesmallbin_index(sz)(((unsigned)(sz))》3))。這里因為系統將512B大小以下的閑置內存塊都組織為雙鏈表???以上就是系統大全給大家介紹的如何使的方法都有一定的了解了吧,好了,如果大家還想了解更多的資訊,那就趕緊點擊系統大全官網吧。??本文來自系統大全http:///如需轉載請注明!推薦:win7純凈版

為你推薦
資訊專欄
熱門視頻
相關推薦
永遠不要在Linux執行的10個最危險的命令1 linux安裝php與memcache過程記錄1 linux查看目錄大小及硬盤大小 除去文件中的重復數據 Linux備份與還原tar命令 Win81刪掉桌面SecureBoot未正確配置水印的辦法 Linux系統管理技術手冊第6章添加新用戶 win8系統英文輸入法找不到了如何解決如何解決 我們只需要去相機的權限設置那邊開啟攝像頭和 Linux硬件信息查詢命令2 深度win864位系統安裝mssql2005時啟動服務失敗怎么 Win8電腦利用路由器限制網速的方法 win8和win81關閉快速啟動的辦法介紹 win8系統更改共享設置的方法 巧用網絡配置快速解決windows7統無法上網的問題 linux系統怎么用SecureCRT上傳和下載文件 KB2770917補丁windows8系統中無法更新的辦法處理 91助手備份文件在哪91助手備份文件的保存位置 Windows8無法設置靜態IP地址方法 Linuxarping命令測試IP地址沖突 linux忘記root密碼的解決方法 Win81安裝密鑰怎么查ProduKey幫你查 Win8怎么設置五筆為默認輸入法 9個使用前必須再三小心的Linux命令 有道云筆記如何截圖有道云筆記的截圖功能怎 win8四種關機方法 RedHat配置鏡像media為yum源 Win8資源管理器無響應出現假死現象 Windows7系統下隱藏SSID的無線網絡安全快速上網 Windows7下始終以管理員身份運行程序 視頻轉換專家如何截取視頻片段 如何設置WPS雙面打印頁邊距WPS雙面打印設置頁邊 如何查看Win8的隱藏文件 Linux搜集的一些故障診斷時常用命令2 去除win8系統桌面圖標小鎖的辦法 chm文件突然亂碼了 win8如何打特殊字符win8特殊符號怎么輸入 win8系統縮小系統搜索范圍的方法 Linux如何快速查找文件 windows7系統怎么更改硬盤圖標
Top 主站蜘蛛池模板: 欧美日韩亚洲综合另类ac | 国产一级一片免费播放视频 | 日本一区二区视频在线观看 | 在线观看日韩视频 | 一区二区在线播放视频 | 日韩不卡一区 | 日韩在线无 | 国产精品第二页 | 香蕉久久夜色精品国产小说 | 欧美国产日韩在线 | 亚洲 欧美 综合 | 国产一区二区不卡 | 国产精品欧美一区二区三区不卡 | 国内精品视频免费观看 | 成人欧美一区二区三区黑人 | 国产成人精品日本亚洲11 | 偷自在线| 国产日韩一区二区三区 | 欧美成人久久电影香蕉 | 欧美中出| 日韩在线欧美高清一区 | 国产一区二区免费视频 | 精品精品国产高清a毛片牛牛 | 又粗又硬又大又深又爽动态图 | 国产亚洲欧美一区二区三区 | 四虎福利视频 | 日本成人a | 国产精品日本 | 香蕉视频日本 | 欧美阿v | 我被公睡做舒服爽中文字幕 | 亚洲欧美另类在线 | 国产精品视频一区二区三区不卡 | 国产a国产片 | 亚洲欧美日本另类激情 | 国产精品久久亚洲一区二区 | 日韩视频在线免费观看 | 日韩在线无 | 日本不卡一区二区三区 最新 | 精品久久久久久久 | 国产一区二区免费 |