brk/sbrk和mmap行为分析程序

简介: #include #include #include // #include // int mallopt(int param, int value);// info mallopt, 一些系统可以man ...
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

// #include <malloc.h>
// int mallopt(int param, int value);

// info mallopt, 一些系统可以man mallopt
// M_TRIM_THRESHOLD: 紧缩内存阈值,对应的环境变量为MALLOC_TRIM_THRESHOLD_
// M_MMAP_THRESHOLD: 使用mmap而非brk/sbrk分配内存阈值,即超过该值的malloc分配将使用mmap
// ,否则使用brk/sbrk分配内存,对应的环境变量为MALLOC_MMAP_THRESHOLD_
// 请注意:如今的glibc使用了动态的阈值,初始值为128*1024,
// 下限为0,上限由DEFAULT_MMAP_THRESHOLD_MAX决定,32位系统为512*1024,64位系统为4*1024*1024*sizeof(long)
// mmap分配内存必须是页对齐的:
// Allocating memory using mmap(2) has the significant advantage that the allocated memory blocks can always be independently
// released back to the system.  (By contrast, the heap can be trimmed only if memory is freed at the top end.) 
// 相关函数:
// mtrace muntrace mcheck mcheck_pedantic mcheck_check_all mprobe
// malloc_stats mallinfo malloc_trim malloc_info

// mmap分配的内存在调用munmap后会立即返回给系统,而brk/sbrk而受M_TRIM_THRESHOLD的影响
// 但brk/sbrk分配的内存是否立即归还给系统,不仅受M_TRIM_THRESHOLD的影响,还要看高地址端(栓)的内存是否已经释放:
// 假如依次malloc了str1、str2、str3,即使它们都是brk/sbrk分配的,如果没有释放str3,只释放了str1和str2,
// 就算两者加起来超过了M_TRIM_THRESHOLD,因为str3的存在,str1和str2也不能立即归还可以系统,但可以被重用
// 更多信息,请参考man手册:http://man7.org/linux/man-pages/man3/mallopt.3.html

// argv[1] 每次分配的字节数,如果没有指定,则使用32
// 请观察不同值时malloc和free的行为
// 当argv[1]为131072,即为128K时,使用的是mmap分配,每一步的malloc和free都可以从top中观察到反应
// gcc -g -o x x.c
int main(int argc, char* argv[])
{
	char* str[3];
	int BYTES = (argc > 0)? atoi(argv[1]): 32;
	// 128 * 1024 = 131072

	printf("\nPlease type \"top -p %d\" to watch VIRT, press ENTER to continue", getpid());
	getchar();

	str[0] = (char*)malloc(BYTES);
	printf("%dBYTES allocated, press ENTER to continue", BYTES);
	getchar();
	
	str[1] = (char*)malloc(BYTES);
	printf("%dBYTES allocated, press ENTER to continue", BYTES);
	getchar();

	str[2] = (char*)malloc(BYTES);
	printf("%dBYTES allocated, press ENTER to continue", BYTES);
	getchar();

	printf("FREE phase, press ENTER to continue");
	getchar();

	free(str[0]);
	printf("%dBYTES freed, press ENTER to continue", BYTES);
	getchar();

	free(str[1]);
	printf("%dBYTES freed, press ENTER to continue", BYTES);
	getchar();

	free(str[2]);
	printf("%dBYTES freed, press ENTER to continue", BYTES);
	getchar();

	printf("Press ENTER to exit\n");
	getchar();

	return 0;
}

相关文章
|
4月前
mmap实现共享内存
mmap实现共享内存
48 0
|
4月前
|
缓存 Linux
零拷贝技术(DMA、MMAP、sendfile)
零拷贝技术(DMA、MMAP、sendfile)
141 0
|
5月前
|
消息中间件 存储 缓存
Linux内存映射mmap
Linux内存映射mmap
44 0
|
6月前
|
存储 Unix Linux
关于epoll和mmap的思考
epoll 是 Linux 操作系统提供的一种 I/O 多路复用机制,用于监视多个文件描述符(通常是套接字、管道或文件),并在其中的某个文件描述符准备好读或写时通知应用程序。它是一种高效的事件通知机制,特别适用于高性能的网络应用程序,如 Web 服务器和代理服务器。
|
12月前
|
缓存 Linux 程序员
OS - MMAP初探
OS - MMAP初探
78 0
|
存储 缓存 Java
mmap内存映射原理
mmap内存映射原理
172 0
|
Linux 消息中间件 索引
Linux内存管理之mmap详解
作者:freeboy1015 来源:http://lib.csdn.net/article/linux/62126 一. mmap系统调用 mmap系统调用 mmap将一个文件或者其它对象映射进内存。
907 0
|
PHP Linux 消息中间件

热门文章

最新文章