欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

內(nèi)存池的簡單實(shí)現(xiàn)c語言-創(chuàng)新互聯(lián)

內(nèi)存池

內(nèi)存池是為了解決大量malloc,free,導(dǎo)致的某些內(nèi)存碎片。統(tǒng)一管理起來,比較方便。
基本思想是,根據(jù)要分配的內(nèi)存,分為大塊內(nèi)存和小塊內(nèi)存。

創(chuàng)新互聯(lián)是一家專業(yè)提供深州企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、HTML5、小程序制作等業(yè)務(wù)。10年已為深州眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
  1. 大塊內(nèi)存直接用鏈表管理。
  2. 小塊內(nèi)存,我這里設(shè)置為4k大小,內(nèi)部再用一個(gè)一個(gè)小節(jié)點(diǎn)鏈表。
    大概的數(shù)據(jù)結(jié)構(gòu)如下:
    在這里插入圖片描述
1.核心的數(shù)據(jù)結(jié)構(gòu)
  1. 小片內(nèi)存(4k以內(nèi))節(jié)點(diǎn),第一個(gè)成員last, 是當(dāng)前節(jié)點(diǎn)的首地址,end是指該4k內(nèi)存的最后一段地址。

    struct  mp_node_s{unsigned char *last; //當(dāng)前節(jié)點(diǎn)的位置
        unsigned char *end; //當(dāng)前分配的內(nèi)存(小于等于4k)最后一位
        struct mp_node_s *next;//指向下一個(gè)節(jié)點(diǎn)
        size_t failed=0;//失敗次數(shù)
    };
  2. 大片內(nèi)存:

    struct mp_large_s{struct mp_large_s *next;//下個(gè)節(jié)點(diǎn)
        void *alloc;//分配的內(nèi)存
    
    };
  3. 池節(jié)點(diǎn):其其核心思想就是將分配的內(nèi)存組織起來

    struct mp_pool_s {struct mp_large_s *large;
        struct mp_node_s *head;
        struct mp_node_s *current; //指向當(dāng)前的節(jié)點(diǎn)
    
        int max;
    };
2. 流程
  1. 創(chuàng)建池,先創(chuàng)建出一個(gè)32位對齊的內(nèi)存塊,這個(gè)內(nèi)存塊是size大小,再加上mp_pool_s這個(gè)結(jié)構(gòu)體的本身大小.
    在這里插入圖片描述

    #define MP_ALIGNMENT       		32
    #define MP_PAGE_SIZE			4096
    #define MP_MAX_ALLOC_FROM_POOL	(MP_PAGE_SIZE-1)
    
    struct mp_pool_s *mp_create_pool(size_t size) {struct mp_pool_s *p;
    	int ret = posix_memalign((void **)&p, MP_ALIGNMENT, size + sizeof(struct mp_pool_s) + sizeof(struct mp_node_s));
    	if (ret) {return NULL;
    	}
    	
    	p->max = (size< MP_MAX_ALLOC_FROM_POOL) ? size : MP_MAX_ALLOC_FROM_POOL;//小與4k,就用原本的大小,大于4k,那么限制為4k-1
    	p->current = p->head; //將當(dāng)前結(jié)點(diǎn)指向池的頭部
    	p->large = NULL;
    
    	p->head->last = (unsigned char *)p + sizeof(struct mp_pool_s) + sizeof(struct mp_node_s); //當(dāng)前頭部
    	p->head->end = p->head->last + size;
    
    	p->head->failed = 0;
    
    	return p;
    
    }
  2. 分配內(nèi)存函數(shù),分為,①分配大塊內(nèi)存; ②分配小內(nèi)存節(jié)點(diǎn)時(shí),考慮兩種情況,小內(nèi)存塊還夠用,小內(nèi)存塊不夠用了,得分配新的小內(nèi)存塊。

    void *mp_alloc(struct mp_pool_s *pool, size_t size) {unsigned char *m;
    	struct mp_node_s *p;
    //小于等于小內(nèi)存塊大小的
    	if (size<= pool->max) {//就在當(dāng)前節(jié)點(diǎn)后分配內(nèi)存
    		p = pool->current;
    //遍歷當(dāng)前節(jié)點(diǎn)后的節(jié)點(diǎn),查找有沒有適合大小的內(nèi)存塊
    		do {	
    			m = mp_align_ptr(p->last, MP_ALIGNMENT);
    	//分配范圍,依然還在內(nèi)存塊范圍的,就不新分配新塊了,就地分配
    			if ((size_t)(p->end - m) >= size) {		p->last = m + size;
    				return m;
    			}
    			p = p->next;
    		} while (p);
    //沒有合適大小的內(nèi)存塊,直接創(chuàng)建一塊新小內(nèi)存塊
    		return mp_alloc_block(pool, size);
    	}
    //分配大塊內(nèi)存
    	return mp_alloc_large(pool, size);
    	
    }
  3. 新建一個(gè)≤4k的小內(nèi)存塊

在這里插入圖片描述

#define mp_align(n, alignment) (((n)+(alignment-1)) & ~(alignment-1))
#define mp_align_ptr(p, alignment) (void *)((((size_t)p)+(alignment-1)) & ~(alignment-1))

static void *mp_alloc_block(struct mp_pool_s *pool, size_t size) {

	unsigned char *m;//
	struct mp_node_s *h = pool->head; //頭部的小內(nèi)存節(jié)點(diǎn)
	size_t psize = (size_t)(h->end - (unsigned char *)h); //獲取小內(nèi)存塊大小
	//為m分配出一個(gè)內(nèi)存
	int ret = posix_memalign((void **)&m, MP_ALIGNMENT, psize); //先分配出一個(gè)“頁”(<=4k)
	if (ret) return NULL;

	struct mp_node_s *p, *new_node, *current; 
	new_node = (struct mp_node_s*)m; //

	new_node->end = m + psize;
	new_node->next = NULL;
	new_node->failed = 0;
//在分配好的小內(nèi)存塊中,分配一塊節(jié)點(diǎn)內(nèi)存size
	m += sizeof(struct mp_node_s);
	m = mp_align_ptr(m, MP_ALIGNMENT);
	new_node->last = m + size; //last指向節(jié)點(diǎn)內(nèi)存的末尾

	current = pool->current;
//遍歷當(dāng)前節(jié)點(diǎn)后的節(jié)點(diǎn),如果有失敗大于4次的節(jié)點(diǎn),就把池的當(dāng)前節(jié)點(diǎn)指向失敗大于4次的節(jié)點(diǎn)
//4是一個(gè)經(jīng)驗(yàn)值
	for (p = current; p->next; p = p->next) {
		if (p->failed++ >4) {
			current = p->next;
		}
	}
	p->next = new_node; //將最后一個(gè)結(jié)點(diǎn)的next指向新分配的內(nèi)存塊

	pool->current = current ? current : new_node; 

	return m;

}
```
  1. 創(chuàng)建大塊內(nèi)存,非常好理解,一個(gè)單鏈表,沒什么好說的

    static void *mp_alloc_large(struct mp_pool_s *pool, size_t size) {void *p = malloc(size); //直接分配內(nèi)存
    	if (p == NULL) return NULL;
    
    	size_t n = 0;
    	struct mp_large_s *large;
    	for (large = pool->large; large; large = large->next) {if (large->alloc == NULL) {	large->alloc = p;
    			return p;
    		}
    		if (n ++ >3) break;
    	}
    //large結(jié)構(gòu)體本身也是存在小內(nèi)存塊里的
    	large = mp_alloc(pool, sizeof(struct mp_large_s));
    	if (large == NULL) {free(p);
    		return NULL;
    	}
    
    	large->alloc = p;
    	large->next = pool->large;
    	pool->large = large;
    
    	return p;
    }

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站標(biāo)題:內(nèi)存池的簡單實(shí)現(xiàn)c語言-創(chuàng)新互聯(lián)
瀏覽地址:http://aaarwkj.com/article22/ccgjcc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、網(wǎng)站建設(shè)網(wǎng)站排名、定制網(wǎng)站建站公司、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司
亚洲日本韩国三级一区| 国产午夜男人天堂手机| 高潮的毛片激情久久精品| 18禁免费无遮挡免费视频| 少妇高潮试看二十分钟| 五月婷婷六月丁香伊人网| 亚洲综合香蕉在线视频| 亚洲成人高清av在线| 国产一区 亚洲精品| 久久精品视频就在久久| 免费国产成人在线视频| 久久精品国产精油按摩| 日韩不卡在线观看免费| 小明久久国内精品自线| 蜜桃网站视频免费观看| 人妻丝袜中文字幕在线| 日本一区不卡二区高清| 密臀精品国产一区二区| 妞妞婷婷基地五月天| 日韩欧美午夜福利在线视频| 亚洲国产精品有码专区| 欧美精品欧美激情免费区| 成人国产在线欧美精品| 亚洲大乳大丰满中文字幕| 人妇乱系列中文字幕人妻| 九九九热免费在线观看| 国产传媒网站在线观看| 天堂在线手机av观看| 亚洲老司机深夜福利| 成人色视频免费在线观看| 最新中文字幕成人在线观看| 免费国产污在线观看网站| 国产日韩精品在线视频| 亚洲精品永久在线观看| 一区二区亚洲免费的视频| 国产三级精品三线在线观看| 午夜91激情福利视频| 91欧美一区二区在线视频| 99久久精品人妻一区| 高清国产在线播放91| 十八禁真人无摭挡观看|