精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux高性能編程-malloc原理

系統 Linux
ptmalloc內存池是一個比較復雜的軟件模塊,會涉及到malloc_state,malloc_chunk,mmap,brk等概念。

大家好,這里是物聯網心球。

談到高性能編程,我們繞不過一個問題高效內存分配,通常我們會使用malloc和free函數來申請和釋放內存。

那么我們習以為常的malloc和free函數,真的能滿足高性能編程的要求嗎?

帶著這個問題我們來深入理解malloc和free函數實現原理。

1.ptmalloc工作原理

malloc和free函數屬于glibc庫的ptmalloc模塊,我們得通過學習glibc源碼了解ptmalloc工作原理。源碼位置:glibc/malloc/malloc.c。

1.1 ptmalloc軟件架構

圖片圖片

ptmalloc內存池是一個比較復雜的軟件模塊,會涉及到malloc_state,malloc_chunk,mmap,brk等概念。

ptmalloc通過brk(堆內存)或者mmap(內存映射)系統調用從內核申請一大塊連續的內存,申請的內存由top chunk管理,用戶程序調用malloc函數從內存池申請內存(chunk),如果內存池有空閑的chunk,則從空閑的chunk返回給用戶程序,如果沒有空閑的chunk,則從top chunk裁剪出可用的chunk返回給用戶程序。

用戶程序調用free函數將會釋放chunk至空閑鏈表或top chunk。

我們將圍繞兩個比較重要的概念來進行講解:malloc_state和malloc_trunk。

1) malloc_state

    ptmalloc由struct malloc_state統一管理,定義如下:

struct malloc_state
{
  __libc_lock_define (, mutex);    //互斥鎖
  int flags;                                 //標志 
  mfastbinptr fastbinsY[NFASTBINS];  //fastbins
  mchunkptr top;                               //top chunk 
  mchunkptr bins[NBINS * 2 - 2];        //unsortedbins,smallbins,largebins
  unsigned int binmap[BINMAPSIZE]; //bin位圖
  struct malloc_state *next;                //鏈表指針
  ......
};

malloc_state有幾個重要成員:fastbinsY,top,bins,binmaps,next。

  • fastbinsY數組:fastbins,用于存儲16-160字節chunk的空閑鏈表。
  • bins數組:bins分為三個部分:unsortedbins,smallbins,largebins:

unsortedbins:chunk緩存區,用于存儲從fastbins合并的空閑chunk。

smallbins:空閑鏈表,用于存儲32-1024字節的chunk。

largebins:空閑鏈表,用于存儲大于1024字節的chunk。

  • top chunk:超級chunk,ptmalloc內存池。
  • binmap:可用bins位圖,用于快速查找可用bin。
  • next:單向鏈表指針,用于連接不同的malloc_state。

進程通常會有多個malloc_state,進程啟動時,由主線程創建第一個malloc_state稱為主分配區(main_state),主分配區的內存通過brk(堆)或者malloc(內存映射)從內核申請而來,這也解釋了為什么malloc可以從堆區分配內存。

如果程序所有的線程都使用主分配區分配內存,那么多線程會存在競爭關系,為了解決這個問題,進程會根據實際情況動態創建非主分配區(thread_state),thread_state分配區內存池內存只能通過mmap從內核申請,當主分配區被使用或者沒有可用的分配區時,系統會創建一個新的分配區,這樣可以減少多線程競爭,提高內存分配效率。

當然malloc_state數量并不是沒有限制,通常malloc_state數量最多為CPU核心數的數倍,超過該閾值后將不能再創建新的分配區。如果一個程序線程數量太多,會加劇對分配區的競爭。

圖片圖片

2)malloc_chunk

    ptmalloc以malloc_chunk為單位申請和釋放內存,struct malloc_chunk定義如下:

struct malloc_chunk {
  INTERNAL_SIZE_T mchunk_prev_size; //前一個chunk大小
  INTERNAL_SIZE_T mchunk_size;   //當前chunk大小,后三位為A,M,P
  struct malloc_chunk* fd;      //鏈表后驅指針
  struct malloc_chunk* bk;      //鏈表前驅指針
  struct malloc_chunk* fd_nextsize; //largebins后驅指針
  struct malloc_chunk* bk_nextsize; //largebins前驅指針
};

    chunk是ptmalloc最難理解的一個概念,只有理解了chunk才能真正理解ptmalloc。

圖片圖片

chunk是從內存池裁剪下來的內存塊,這個內存塊由malloc_chunk管理。

 malloc_chunk對象mchunk_prev_size和mchunk_size成員為chunk頭部,chunk頭部將會伴隨chunk整個生命周期,用于記錄和識別chunk。

內存塊除了chunk頭部外就是內存區域,當chunk分配給用戶程序后,內存區域用于存儲用戶數據,如果chunk處于空閑狀態,將會借用內存區域前16個字節作為鏈表指針,將chunk插入空閑鏈表。

3)fastbins數組

圖片圖片

fastbins數組長度為10,每個數組元素都是一個chunk鏈表頭,10個鏈表分別存儲16-160字節的chunk,步長為16字節,malloc函數申請小于160字節的內存時,從fastbins空閑鏈表查找匹配的chunk進行分配。

4)bins數組

圖片圖片

bins數組長度為128,可以分為三部分:unsortedbins,smallbins,largebins。

unsortedbins:bins數組0號元素,unsortedbins是一個特殊的鏈表,該鏈表是一個chunk緩存區,用于存儲從fastbins合并的空閑chunk,目的是為了回收小塊內存,解決內存碎片問題。

smallbins:bins數組1-63號元素,和fastbins功能一樣,smallbins用于存儲32-1008字節的空閑chunk。

largebins:bins數組64-127號元素,用于存儲超過1024字節大小的空閑chunk。

5)top chunk

top chunk可以理解為超級chunk,當bins空閑鏈表中沒有匹配的chunk分配給用戶程序時,top chunk將會被裁剪,裁剪成用戶chunk和剩余chunk,用戶chunk分配給用戶程序,剩余chunk繼續由top chunk管理。

如果top chunk內存不足,調用brk或者mmap從內核申請內存對top chunk擴容,并將擴容后的內存塊裁剪分配給用戶程序。

1.2 malloc函數流程分析

圖片圖片

用戶程序調用malloc函數申請內存時,首先會去查詢空閑鏈表,如果空閑鏈表沒有足夠的chunk,則去查詢top chunk進行內存分配。

如果top chunk沒有足夠的內存,說明內存池內存不足,需要通過brk或者mmap擴容。

注意:內存池內存不夠,并不一定表示內存都被用完,也有可能是存在內存碎片。

1.3 free函數流程分析

圖片圖片

用戶程序調用free函數釋放內存,優先將內存釋放至空閑鏈表,如果釋放至空閑鏈表失敗,則釋放至top chunk,如果釋放的內存比較大,可能通過munmap或者brk回收至內核。

2.ptmalloc高并發測試

前一小節,我們花了比較多的精力去學習ptmalloc實現原理,對于很多項目來說,我們不需要花過多時間去研究ptmalloc實現原理,直接使用malloc和free函數即可,然而對于高并發項目,我們得深入理解ptmalloc實現原理,從而清楚地知道ptmalloc存在的問題,為后續優化打好基礎。

2.1 ptmalloc常見問題

    通過學習ptmalloc實現原理,我們會發現ptmalloc存在兩個問題:鎖競爭問題和內存碎片問題。

  • 鎖競爭問題
    struct malloc_state結構定義了一個mutex成員,多線程想要通過分配區進行內存分配時需要加鎖,頻繁分配內存會導致頻繁加鎖。
  • 內存碎片問題

圖片圖片

ptmalloc通過mmap或brk從內核申請一大塊連續的內存,調用malloc函數會將這塊大的內存裁剪成一塊塊小的內存,如果其中某些小的內存塊一直不釋放至內存池,將導致小的內存塊無法合并成大的內存塊,造成內存碎片,嚴重的情況會導致內存泄露,程序退出。

2.2 ptmalloc高并發測試

1)測試代碼

采用多個線程循環申請和釋放內存,每次隨機申請SIZE_THREHOLD范圍大小內存,如果申請的內存小于LEAK_THREHOLD大小,則申請的內存不釋放,人為制造內存泄露,并實時統計泄露內存總量。

 測試項:頻繁加鎖測試,內存碎片測試。

  • 頻繁加鎖測試方法:

通過:strace -tt -f -e trace=futex ./a.out命令執行測試程序,觀察是否調用futex系統調用加鎖。

  • 內存碎片測試

通過:strace -tt -f -e trace=mprotect,brk ./a.out命令執行測試程序,觀察是否調用mprotect或者brk進行擴容。

統計程序已使用內存總量,內存泄露總量,計算內存碎片總量:

內存碎片總量=已使用內存總量-內存泄露總量。

測試代碼如下:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <pthread.h>
#include <stdatomic.h>

#define THREAD_NUM (8) //測試線程數量
#define SIZE_THREHOLD (1024) //申請內存閾值,每次申請的內存大小小于該閾值
#define LEAK_THREHOLD (64) //泄露內存閾值, 0:關閉內存泄露,大于0:每次泄露內存的不超過該閾值

atomic_int leak_size; //內存泄露統計值

int get_size() {
    srand(time(0));
    return rand() % SIZE_THREHOLD;
}

void *do_malloc(void *arg) {
    while(1) {
        int size = get_size();
        //printf("size:%d\n", size);
        char *p = malloc(size);
        if (size >= LEAK_THREHOLD) {
            free(p);
        } else {
            atomic_fetch_add(&leak_size, size); //統計泄露內存大小
            printf("leak size:%d KB\n", leak_size / 1024);
        }
    }
    return NULL;
}

int main(int argc, char *argv[]) {
    atomic_init(&leak_size, 0);

    pthread_t th[THREAD_NUM];
    for (int i = 0; i < THREAD_NUM; i++) {
        pthread_create(&th[i], NULL, do_malloc, NULL);
    }

    do_malloc(NULL);

    for (int i = 0; i < THREAD_NUM; i++) {
        pthread_join(th[i], NULL);
    }

    return 0;
}

2)測試結果

  • 頻繁加鎖測試

通過strace -tt -f -e trace=futex ./a.out命令觀察到測試程序頻繁的調用futex系統調用,為了保證線程安全,malloc和free函數需要頻繁加鎖,頻繁加鎖會影響內存分配的效率。

圖片


  • 內存碎片測試

1.程序剛啟動時,內存泄露總量為1.8MB,此時系統可用內存總量為2724MB。

圖片圖片

圖片圖片

2. 程序泄露內存總量至162MB時,此時系統可用內存總量為2474MB。

圖片圖片

圖片圖片

用戶程序使用內存總量為:2724 - 2474 = 250MB。泄露內存總量為162MB,內存碎片總量為88MB。

通過strace -tt -f -e trace=mprotect,brk ./a.out命令觀察到,ptmalloc頻繁的通過mprotect或者brk進行擴容。

圖片圖片

3.總結

  • malloc和free函數不適用于多線程申請和釋放內存使用場景,存在頻繁加鎖的問題。
  • malloc和free函數不適用于長期占用內存的使用場景,長期占用內存會導致內存碎片問題。
  • 對并發要求不高的場景可以使用malloc和free函數,高并發場景需要使用更高效的內存池。
責任編輯:武曉燕 來源: 物聯網心球
相關推薦

2024-10-06 14:37:52

2024-08-06 08:22:18

2024-10-16 11:03:30

Linux高性能編程

2024-03-18 13:43:20

Linux架構

2023-11-01 11:59:13

2022-03-21 14:13:22

Go語言編程

2023-11-01 11:27:10

Linux協程

2023-11-01 10:38:46

Linux高性能網絡編程

2023-11-01 11:40:46

Linux高性能網絡編程工具

2023-11-01 10:58:31

系統調用高性能網絡編程Linux

2023-11-01 11:51:08

Linux性能優化

2020-11-06 18:51:17

LinuxTCP服務器

2023-11-01 11:07:05

Linux高性能網絡編程線程

2009-03-01 22:23:39

LinuxKernelLinuxDNA

2023-11-01 11:13:58

Linux信號處理定時器

2023-11-01 11:20:57

2025-10-17 09:18:16

2025-01-27 11:49:55

2024-12-24 10:50:05

GinWeb開發

2023-11-01 10:43:31

Linux高性能網絡編程
點贊
收藏

51CTO技術棧公眾號

亚洲午夜精品一区 二区 三区| a级毛片免费观看在线| 久久精品久久久| 8v天堂国产在线一区二区| 亚洲精品日韩在线观看| 亚洲无码精品在线观看| 亚洲老妇激情| 亚洲第一精品福利| 国产偷人视频免费| 老司机在线看片网av| 国产成人午夜精品影院观看视频 | 制服丝袜av在线| jizz内谢中国亚洲jizz| 国产日产欧美一区二区视频| 国产ts一区二区| 天堂在线中文视频| 一区二区网站| 欧美日韩中国免费专区在线看| 秋霞毛片久久久久久久久| 亚洲一区中文字幕永久在线| 欧美激情综合色综合啪啪| 欧美一级xxx| 成人免费在线小视频| 无遮挡的视频在线观看| 高清视频一区二区| 欧美一区二区视频97| 影音先锋男人在线| 99精品国产一区二区三区2021| 一本大道久久精品懂色aⅴ| 亚洲精品高清视频| 高清乱码毛片入口| 毛片一区二区三区| 欧美精品在线观看91| 九色porny自拍视频| 香港久久久电影| 欧美性大战xxxxx久久久| 成年人黄色在线观看| 外国精品视频在线观看| 免费的国产精品| 91国产中文字幕| 色婷婷在线视频观看| 免费看日本一区二区| 日韩一区二区三区在线视频| 女性隐私黄www网站视频| 主播国产精品| 国产精品久久久久婷婷二区次| 精品视频免费观看| 精品人妻伦一区二区三区久久 | 久久综合国产精品| 91在线短视频| 国产精品久久久久久无人区| 久久精品欧洲| 97精品国产97久久久久久| 久草视频手机在线| 色综合蜜月久久综合网| 日韩国产高清污视频在线观看| 日本高清久久久| 777午夜精品电影免费看| 亚洲r级在线视频| 久久www视频| 成人影院在线观看| 中文字幕一区二区在线播放| 日韩欧美电影一区二区| 亚洲三区在线播放| 97se狠狠狠综合亚洲狠狠| 国产在线视频91| 国产天堂第一区| 香蕉国产精品偷在线观看不卡| 欧美极品欧美精品欧美视频 | 一区二区三区四区在线观看视频| 成人无码www在线看免费| 澳门成人av| 精品电影一区二区| 韩国三级视频在线观看| 99re8这里有精品热视频免费| 欧美成人一区二区三区片免费| 黄色三级视频在线播放| 国产精久久一区二区| 在线不卡中文字幕播放| 制服丝袜中文字幕第一页| 精品成人av| 欧美系列日韩一区| 国产日韩欧美久久| 欧美一级免费| 91精品国产综合久久蜜臀| 污网站在线免费| 视频亚洲一区二区| 亚洲第一精品福利| 我和岳m愉情xxxⅹ视频| 精品久久成人| 久久久久北条麻妃免费看| 欧美精品久久久久久久久46p| 欧美伊人影院| 97成人在线视频| 成人免费毛片视频| 看电视剧不卡顿的网站| 国产精品男人的天堂| 一级黄色a视频| 国产福利一区二区三区在线视频| 99精品99久久久久久宅男| 亚洲第一精品网站| 97久久精品人人澡人人爽| 欧美二区在线看| 日本在线免费| 亚洲一区av在线| 欧美激情成人网| 日韩久久99| 亚洲第一页在线| 一区二区精品免费| 亚洲国产不卡| 2019日本中文字幕| 美女黄页在线观看| 国产成人h网站| 欧美男人的天堂| 高清全集视频免费在线| 午夜不卡av在线| 精品免费国产一区二区| 欧美久久亚洲| 亚洲一区999| 日本中文字幕免费在线观看| 亚洲一区二区网站| 91久久精品美女高潮| 精品女同一区二区三区| 久久久久久久久久看片| 正在播放一区二区三区| av最新在线| 欧美精品一卡两卡| 中文幕无线码中文字蜜桃| 夜间精品视频| 国产精品一区专区欧美日韩| 亚洲第一第二区| 中文字幕在线不卡一区二区三区| 五月丁香综合缴情六月小说| 原纱央莉成人av片| 日韩精品一区二区三区老鸭窝| 西西444www无码大胆| 欧美色123| 91免费国产视频| 国产在线资源| 香蕉久久一区二区不卡无毒影院| 亚洲精品成人在线播放| 国产午夜一区| 7m第一福利500精品视频| 国产婷婷一区二区三区久久| 国产视频一区二区在线| 国产一级爱c视频| 日本精品国产| 精品国产区一区二区三区在线观看| 性无码专区无码| 成人少妇影院yyyy| 粉嫩av一区二区三区天美传媒| 台湾佬中文娱乐久久久| 亚洲国产精品高清久久久| 久久久久久久久久久久久女过产乱| 日本va欧美va瓶| 国产精品污www一区二区三区| av在线播放观看| 欧美精品国产精品| 日本女人性生活视频| 国产视频一区欧美| 国语精品中文字幕| 成人ssswww在线播放| 精品成人一区二区| 成人免费视频网站入口::| 久久超级碰视频| 国产精品99久久久久久大便| 国产拍在线视频| 精品国产一区久久| 久久机热这里只有精品| 国产激情精品久久久第一区二区 | 成人在线视频中文字幕| 久久色免费在线视频| 97人妻精品一区二区三区动漫| 中文字幕国产一区| 成人日韩在线视频| 国产国产精品| 国产精品露脸av在线| 久久经典视频| 日本乱人伦一区| 黄色av免费播放| 久久国产福利国产秒拍| 在线视频不卡一区二区| 96sao精品免费视频观看| 久久视频在线播放| 亚洲精品一区二区口爆| 亚洲第一成年网| avtt香蕉久久| 天堂成人国产精品一区| 日韩精品成人一区二区在线观看| 国产亚洲人成a在线v网站| 日韩综合中文字幕| www天堂在线| 欧美日韩一区免费| 天天躁日日躁狠狠躁免费麻豆| 国产精品久久久一区二区| 亚洲欧美日韩国产成人综合一二三区| 久久丁香四色| 国产成人久久久精品一区| 91在线中文| 国产亚洲欧美视频| 日韩一级在线播放| 欧美精品在线观看一区二区| 欧美一二三区视频| 亚洲欧美乱综合| 成都免费高清电影| 成人午夜视频在线观看| 无限资源日本好片| 国产精品久久777777毛茸茸| 日韩不卡一二区| 欧美丝袜激情| 国内精品国语自产拍在线观看| 日韩欧美三区| 国产精品大片wwwwww| 91九色porn在线资源| 久久精品国产亚洲精品| 国模吧精品人体gogo| 亚洲成年人在线播放| 国产剧情精品在线| 欧美亚洲国产一区二区三区va| 亚洲激情视频一区| 亚洲欧美另类综合偷拍| jizz18女人高潮| 久久久国产午夜精品| 日本50路肥熟bbw| 国产精品一区二区久久精品爱涩| wwwwww.色| 先锋亚洲精品| 欧美精品久久久久久久免费| 欧美女激情福利| 久久天天东北熟女毛茸茸| 成人在线国产| 色吧亚洲视频| 国产一区二区三区探花| 久久久国产精品一区二区三区| caoporn成人| 国产福利久久| 成人台湾亚洲精品一区二区| 成人女人免费毛片| 天堂久久av| 国产99视频精品免费视频36| 精品视频一二| 7777精品伊久久久大香线蕉语言| 国产一区二区三区亚洲综合| 成人两性免费视频| 色综合一区二区日本韩国亚洲| 国产欧美一区二区白浆黑人| jizzyou欧美16| 国产精品自拍网| 伊人国产精品| 91网站免费看| 视频一区国产| 精品国产一区二区三区四区vr| 欧美重口另类| 日本视频精品一区| 欧美一区二区三区高清视频| 日本一区免费看| 久久精品国产www456c0m| 亚洲精品日韩精品| 影音先锋日韩精品| 欧美大片免费播放| 国自产拍偷拍福利精品免费一| 日韩一级性生活片| 美女网站久久| 一区二区在线播放视频| 久久国产精品免费| 亚洲av无码成人精品区| eeuss影院一区二区三区| 日本黄色网址大全| 国产精品视频一二三| 亚洲精品久久久久久国| 亚洲黄色尤物视频| 亚洲另类欧美日韩| 欧美日韩成人在线| 亚洲第九十九页| 亚洲欧洲第一视频| 欧美尤物美女在线| 欧美精品激情在线观看| 第84页国产精品| 成人妇女淫片aaaa视频| 成人福利免费在线观看| 日本一区视频在线观看免费| 99精品视频在线观看免费播放| 福利在线一区二区| 日韩电影免费在线观看网站| 日本成人xxx| 久久这里只有精品视频网| 毛片视频免费播放| 香蕉成人伊视频在线观看| 国产精品高清无码| 精品处破学生在线二十三| 韩国中文字幕2020精品| 欧美裸体男粗大视频在线观看| 亚洲精品动漫| 亚洲综合国产精品| 国产一区二区三区91| a级片一区二区| 免费视频最近日韩| 精品人妻伦一二三区久| 国产精品久久777777| 国产午夜小视频| 7777精品伊人久久久大香线蕉完整版 | 波多野结衣亚洲一区二区| 欧美性少妇18aaaa视频| 国产99视频在线| 亚洲香蕉在线观看| 91福利区在线观看| 成人黄色片网站| 米奇777超碰欧美日韩亚洲| av中文字幕av| 久久精品国产精品亚洲综合| 国产熟妇搡bbbb搡bbbb| 夜夜嗨av一区二区三区| 中文字幕人妻丝袜乱一区三区| 亚洲加勒比久久88色综合| 国产网站在线免费观看| 国产精品扒开腿做爽爽爽的视频| 国产精品1luya在线播放| 久久久一二三四| 奇米四色…亚洲| 尤物视频最新网址| 午夜影视日本亚洲欧洲精品| 国产www免费观看| 精品国产一区二区在线| 日本精品不卡| 久久久久无码国产精品一区| 亚洲东热激情| 色悠悠在线视频| 一区二区三区鲁丝不卡| 国产精品嫩草影院桃色| 日韩在线观看av| 亚洲男男av| 一区二区视频在线免费| 蜜桃av一区二区| 山东少妇露脸刺激对白在线| 色噜噜狠狠成人中文综合| 午夜国产在线观看| 91福利视频在线观看| 全国精品免费看| 少妇人妻无码专区视频| 成人av电影在线网| 国产精品 欧美 日韩| 日韩欧美资源站| 青草在线视频在线观看| av一区二区三区免费| 国产中文一区| 性折磨bdsm欧美激情另类| 一区二区三区视频在线观看| 国产成人精品白浆久久69| 欧美国产激情18| 麻豆国产欧美一区二区三区r| 欧美在线一区视频| av午夜一区麻豆| 二区视频在线观看| 亚洲欧洲国产一区| 日韩不卡视频在线观看| 亚洲欧洲日本国产| 精品在线观看视频| 少妇久久久久久被弄高潮| 日韩精品在线一区| 91超碰在线| 青青草原成人| 久久精品理论片| 免费麻豆国产一区二区三区四区| 欧美成人vr18sexvr| 桃色av一区二区| 五码日韩精品一区二区三区视频| 麻豆精品一二三| 强乱中文字幕av一区乱码| 亚洲护士老师的毛茸茸最新章节 | 91久久亚洲| 免费看污片网站| 欧美久久免费观看| 久操av在线| 欧美另类一区| 国产一区二区三区综合| 欧美日韩中文视频| 亚洲欧洲在线看| 久久在线观看| 日韩少妇内射免费播放| 国产日韩精品一区二区三区 | 草草草视频在线观看| 91农村精品一区二区在线| 欧美日韩 一区二区三区| 欧美成人午夜激情视频| 色综合综合色| 性生交大片免费看l| 日本韩国一区二区三区| 成年视频在线观看| 欧美最大成人综合网| 国产精品自产自拍| 日本黄色一级视频| 美女精品视频一区| 九九久久婷婷| 国产吃瓜黑料一区二区| 欧美亚洲图片小说| jizz一区二区三区| 少妇熟女一区二区| 久久久久久久久久久久久夜| 午夜精品一区二区三| 国产欧美久久久久久|