Skip to content

Commit bdbd362

Browse files
committed
重新格式化API&多线程启用方式
1 parent 5455587 commit bdbd362

6 files changed

Lines changed: 158 additions & 128 deletions

File tree

Makefile

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,17 @@ MAIN_SOURCES = test.cpp
66
MAIN_OUTPUT = test
77
EXAMPLE_SOURCES = example.c
88
EXAMPLE_OUTPUT = example
9+
THREAD_SAFE = -D _Z_MEMORYPOOL_THREAD_
910

10-
run_test:
11+
run_single_test:
1112
$(CPP) $(GCCFLAG) $(MAIN_SOURCES) $(SOURCES) -o $(MAIN_OUTPUT).out
1213
./$(MAIN_OUTPUT).out
1314

15+
# 多线程
16+
run_multi_test:
17+
$(CPP) $(GCCFLAG) $(MAIN_SOURCES) $(SOURCES) $(THREAD_SAFE) -o $(MAIN_OUTPUT).out
18+
./$(MAIN_OUTPUT).out
19+
1420
run_example:
1521
$(CC) $(GCCFLAG) $(EXAMPLE_SOURCES) $(SOURCES) -o $(EXAMPLE_OUTPUT).out
1622
./$(EXAMPLE_OUTPUT).out

README.md

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,17 @@
1010
- 18-5-27 1.10 改进输出信息 增强测试程序(详见main.cpp)
1111
- 19-3-18 11.05 改进格式, 修复潜在bug
1212
- 19-4-1 20:46 增加线程安全选项, 修改了自动扩展逻辑.
13+
- 19-10-14 21:44 reformat 修改多线程启用模式, 移除Calloc
1314

1415
## Next
1516

1617
- 伙伴内存管理
18+
- 读写锁
19+
20+
## Makefile
21+
- run_single_test 运行单线程测试
22+
- run_multi_test 运行多线程测试
23+
- run_example 运行example.c
1724

1825
## Example
1926

@@ -31,15 +38,13 @@ mem_size_t mem_pool_size = 1*GB + 500*MB + 500*KB;
3138

3239
int main()
3340
{
34-
MemoryPool *mp = MemoryPool_Init(max_mem, mem_pool_size, 0);
35-
struct TAT *tat = (struct TAT *)MemoryPool_Alloc(mp, sizeof(struct TAT));
41+
MemoryPool *mp = MemoryPoolInit(max_mem, mem_pool_size);
42+
struct TAT *tat = (struct TAT *)MemoryPoolAlloc(mp, sizeof(struct TAT));
3643
tat->T_T = 2333;
3744
printf("%d\n", tat->T_T);
38-
int *a = (int *)MemoryPool_Calloc(mp, sizeof(int));
39-
printf("%d\n", *a);
40-
MemoryPool_Free(mp, tat);
41-
MemoryPool_Clear(mp);
42-
MemoryPool_Destroy(mp);
45+
MemoryPoolFree(mp, tat);
46+
MemoryPoolClear(mp);
47+
MemoryPoolDestroy(mp);
4348
return 0;
4449
}
4550
~~~
@@ -54,48 +59,47 @@ int main()
5459

5560
`mem_size_t` => `unsigned long long`
5661

57-
`MemoryPool_Init` 参数(`mem_size_t maxmempoolsize`, `mem_size_t mempoolsize`, `int thread_safe`)
62+
`MemoryPoolInit` 参数(`mem_size_t maxmempoolsize`, `mem_size_t mempoolsize`)
5863

5964
> `maxmempoolsize`: 内存池字节数上限
6065
>
6166
> `mempoolsize`: 内存池字节数 (maxmempoolsize与mempoolsize不相等时会自动扩展, 直到上限)
6267
>
63-
> `thread_safe`: 是否线程安全 (1->线程安全)
6468
65-
`MemoryPool_Alloc` 行为与系统malloc一致(参数多了一个)
69+
`MemoryPoolAlloc` 行为与系统malloc一致(参数多了一个)
6670

67-
`MemoryPool_Free` 行为与系统free一致(返回值0为正常)
71+
`MemoryPoolFree` 行为与系统free一致(返回值0为正常)
6872

6973
~~~c
70-
MemoryPool* MemoryPool_Init (mem_size_t maxmempoolsize, mem_size_t mempoolsize, int thread_safe);
71-
void* MemoryPool_Alloc (MemoryPool *mp, mem_size_t wantsize);
72-
void* MemoryPool_Calloc (MemoryPool *mp, mem_size_t wantsize);
73-
int MemoryPool_Free (MemoryPool *mp, void *p);
74-
MemoryPool* MemoryPool_Clear (MemoryPool *mp);
75-
int MemoryPool_Destroy(MemoryPool *mp);
76-
int MemoryPool_SetThreadSafe(MemoryPool *mp, int thread_safe);
74+
MemoryPool* MemoryPoolInit (mem_size_t maxmempoolsize, mem_size_t mempoolsize);
75+
void* MemoryPoolAlloc (MemoryPool *mp, mem_size_t wantsize);
76+
int MemoryPoolFree (MemoryPool *mp, void *p);
77+
MemoryPool* MemoryPoolClear (MemoryPool *mp);
78+
int MemoryPoolDestroy(MemoryPool *mp);
7779
~~~
7880
7981
- 获取内存池信息
8082
81-
`get_mempool_usage` 获取当前内存池已使用内存比例
83+
`MemoryPoolGetUsage` 获取当前内存池已使用内存比例
8284
83-
`get_mempool_prog_usage` 获取内存池中真实分配内存比例(除去了内存池管理结构占用的内存)
85+
`MemoryPoolGetProgUsage` 获取内存池中真实分配内存比例(除去了内存池管理结构占用的内存)
8486
8587
~~~c
88+
// 总空间
89+
mem_size_t GetTotalMemory(MemoryPool* mp);
8690
// 实际分配空间
87-
mem_size_t get_used_memory (MemoryPool *mp);
88-
float get_mempool_usage(MemoryPool *mp);
91+
mem_size_t GetUsedMemory (MemoryPool *mp);
92+
float MemoryPoolGetUsage(MemoryPool *mp);
8993
// 数据占用空间
90-
mem_size_t get_prog_memory (MemoryPool *mp);
91-
float get_mempool_prog_usage(MemoryPool *mp);
94+
mem_size_t GetProgMemory (MemoryPool *mp);
95+
float MemoryPoolGetProgUsage(MemoryPool *mp);
9296
~~~
9397

9498
## Tips
9599

96100
- 可通过注释`test.c`里的`#include "memorypool.h"`来切换对比系统`malloc` `free`和内存池
97-
- 线程安全(如无必要, 关闭线程安全以改进性能)
98-
- 多食用`MemoryPool_Clear` (多线程情况下慎用)
99-
-**2GB** 数据量 **顺序分配释放** 的情况下比系统`malloc` `free`平均快 **30%-50%** (食用`MemoryPool_Clear`效果更明显)
101+
- 线程安全(需通过提供编译选项`-D _Z_MEMORYPOOL_THREAD_`或者`memorypool.h`文件增加`#define _Z_MEMORYPOOL_THREAD_`)
102+
- 多食用`MemoryPoolClear` (多线程情况下慎用)
103+
-**2GB** 数据量 **顺序分配释放** 的情况下比系统`malloc` `free`平均快 **30%-50%** (食用`MemoryPoolClear`效果更明显)
100104
- `mem_size_t`使用`unsigned long long`以支持4GB以上内存管理
101105
- 大量小块内存分配会有 **20%-30%** 内存空间损失(用于存储管理结构体)

example.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,12 @@ mem_size_t max_mem = 2 * GB + 1000 * MB + 1000 * KB;
99
mem_size_t mem_pool_size = 1 * GB + 500 * MB + 500 * KB;
1010

1111
int main() {
12-
MemoryPool* mp = MemoryPool_Init(max_mem, mem_pool_size, 0);
13-
struct TAT* tat = (struct TAT*) MemoryPool_Alloc(mp, sizeof(struct TAT));
12+
MemoryPool* mp = MemoryPoolInit(max_mem, mem_pool_size);
13+
struct TAT* tat = (struct TAT*) MemoryPoolAlloc(mp, sizeof(struct TAT));
1414
tat->T_T = 2333;
1515
printf("%d\n", tat->T_T);
16-
int* a = (int*) MemoryPool_Calloc(mp, sizeof(int));
17-
printf("%d\n", *a);
18-
MemoryPool_Free(mp, tat);
19-
MemoryPool_Clear(mp);
20-
MemoryPool_Destroy(mp);
16+
MemoryPoolFree(mp, tat);
17+
MemoryPoolClear(mp);
18+
MemoryPoolDestroy(mp);
2119
return 0;
2220
}

0 commit comments

Comments
 (0)