malloc and free

本文介绍了一种利用通用链表进行内存块管理的方法,通过定义特定的结构体来跟踪内存块的状态(使用中或空闲)。该方案采用两条链表分别管理所有内存节点和空闲节点,旨在提高内存分配和回收的效率。

/* 以下为定义的结构体 */

 

/*
 *   利用通用链表将block进行管理,其中一条链表管理所有的节点,另一条管理空闲节点。
 */

#include<stdio.h>
#include<stdlib.h>

#define offsetof(block,member)/
 (uint_32)&(((block *)0)->member)      /* 偏移量*/
typedef unsigned long uint_32;
typedef struct block block;
typedef struct node node;

 

struct node                  /* 管理整个数据的结构体*/
{
 node *pre;                   
 node *next;
};

 

struct block
{
 int flag;               /* 1: used;0:free */
 uint_32 adm_size;       /* manage space */
 node all;               /*用于管理未使用地址*/ 
 node free;              /* 用于管理已使用地址*/
};

 

block malloc_header;        /* the header of link;*/
void *memery = NULL;
uint_32 save_size;

5.15.74内核中musl库在执行以下程序时发生内核崩溃,glibc库没有发生#include <malloc.h> #include <time.h> #include <sched.h> #include <errno.h> #include <string.h> #include <pthread.h> #include "test.h" #define THREAD_MAX_N 8 #define SIZE_ALIGN (4 * sizeof(size_t)) #define MMAP_THRESHOLD 131052 #define FREE_CYCLE 16 #define THRESHOLD (MMAP_THRESHOLD / 16) #define ITER_TIME 80 #define NANOSEC_PER_SEC 1e9 #define MALLOC_TIME (ITER_TIME * (THRESHOLD / (SIZE_ALIGN + 1))) void free_all(void **ptr) { for (int j = 0; j < FREE_CYCLE; j++) { free(ptr[j]); } } void *func(void *arg) { int *val = (int *)arg; cpu_set_t mask; struct timespec ts[2]; int num = 0; void *ptr[FREE_CYCLE]; CPU_ZERO(&mask); CPU_SET(0, &mask); if (sched_setaffinity(0, sizeof(mask), &mask) < 0) { t_error("Set CPU affinity of thread %d failure, ERROR:%s\n", *val, strerror(errno)); return NULL; } for (int i = 0; i < ITER_TIME; ++i) { for (size_t size = 0; size < THRESHOLD; size += SIZE_ALIGN + 1) { if (num == FREE_CYCLE) { free_all(ptr); num = 0; } ptr[num] = malloc(size); if (!ptr[num]) { t_error("Thread %d malloc failed for size %u\n", *val, size); *val = errno; return NULL; } num++; } } *val = 0; return NULL; } int main(int argc, char *argv[]) { struct timespec ts[2]; pthread_attr_t attr; pthread_t tids[THREAD_MAX_N]; int t_result[THREAD_MAX_N] = {0}; int flag = 0; int ret; int i; ret = pthread_attr_init(&attr); if (ret < 0) { t_error("Init pthread attribute failed: %s\n", strerror(errno)); return -1; } clock_gettime(CLOCK_REALTIME, ts); for (i = 0; i < THREAD_MAX_N; ++i) { t_result[i] = i; ret = pthread_create(&tids[i], &attr, func, &t_result[i]); if (ret < 0) { t_error("Create pthread %u failed: %s\n", i, strerror(errno)); flag = -1; break; } } for (i = 0; i < THREAD_MAX_N; ++i) { ret = pthread_join(tids[i], NULL); if (ret < 0) { t_error("Join thread %u failed: %s\n", i, strerror(errno)); } } clock_gettime(CLOCK_REALTIME, ts + 1); (void)pthread_attr_destroy(&attr); double cost = (ts[1].tv_sec - ts[0].tv_sec) * NANOSEC_PER_SEC + (ts[1].tv_nsec - ts[0].tv_nsec); if (!flag) { t_printf("Malloc and free %d threads %d times cost %lf s\n", THREAD_MAX_N, MALLOC_TIME, cost / NANOSEC_PER_SEC); t_status = 0; } return t_status; }
07-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值