linux 内存管理

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 内存管理相关的知识,希望对你有一定的参考价值。

c语言内存接口

#include <stdlib.h>
void *malloc(size_t size);

数组和calloc

使用calloc 来申请固定大小内存的数据结构

    void *r;
    r = calloc(2,sizeof(struct tmap));
    if(!r)
    {
        perror("error of calloc");
        exit(EXIT_FAILURE);
    }

2 代表申请2 个tmap 空间,这里空间是连续的,否则就不是数组了,可以使用r[0] ,和r[1] 来使用空间。

调整内存数组大小

#include <stdlib.h>
void *realloc(void *ptr, size_t size);

使用calloc 来申请固定大小内存的数据结构,然后用realloc 重新分配:

 void *p;
 p = calloc(1,sizeof(struct map));
 if(!p)
 {
     perror("error of xmalloc");
     exit(EXIT_FAILURE);
 }
 p = realloc(p,sizeof(struct tmap));

以下是样例和封装函数


#include <stdlib.h>

typedef struct tmap
{
    int num;
    int a;
    char con[128];
    char x[2048];
}tmap;

void xmalloc(size_t size)
{
    void *p;
    p = malloc(size);
    if(!p)
    {
        perror("error of xmalloc");
        exit(EXIT_FAILURE);
    }
    return p;
}
void * xcalloc(size_t size)
{
    void *p;
    p = calloc(1,size);
    if(!p)
    {
        perror("error of xmalloc");
        exit(EXIT_FAILURE);
    }
    return p;
}

int main()
{
    printf("start...");
    char *p;
    p= malloc(2048);
    if(!p)
        perror("malloc error");
    free(p);
    tmap * map = malloc(sizeof(tmap));
    if(!map)
        perror("malloc map error");
    free(map);
    
    
    void *r;
    r = calloc(2,sizeof(struct tmap));
    if(!r)
    {
        perror("error of calloc");
        exit(EXIT_FAILURE);
    }
    r = realloc(r,sizeof(struct tmap));
    if(!r)
    {
        perror("error of realloc");
        exit(EXIT_FAILURE);
    }
    free(r);
    printf("over\\n");
    
}

在vscode 下面执行得到结构

start 和over 之间没有推出,表示成功

问题

1 重新分配大小

realloc 重新分配大小后,数据是否存在?标准c 的告诉我们,数据依然存在,不用手动进行拷贝工作,重新分配内存大小的意义在于两点:

1 缩减内存减少不必要的内存空间使用
2 加大内存以适应需要更多内存

那么问题依然存在,加大内存用量时,以前的数据还存在吗?答案是依然存在的,系统如果不能在以前的空间申请更大的内存,那么会查询连续内存,并且存在潜在的拷贝动作,这是要进行cpu消耗的,所以,如果使用内存池这种方式,尽量在开始时申请足够的内存,

#include <stdlib.h>
#include <stdio.h>
typedef struct tmap
{
	int num;
	int a;
	char con[128];
	char x[2048];
}tmap;


int main()
{


	tmap *r, *s;
	r = calloc(2, sizeof(struct tmap));
	if (!r)
	{
		perror("error of calloc");
		exit(EXIT_FAILURE);
	}
	printf("r0 num is: %d\\n", r[0].num);
	printf("r0 a is: %d\\n", r[0].a);

	r[0].num = 100;
	r[0].a = 1000;
	s = realloc(r, sizeof(struct tmap));
	if (!s)
	{
		perror("error of realloc");
		free(r);
		exit(EXIT_FAILURE);
	}

	printf("s0 num is: %d\\n", s[0].num);
	printf("s0 a is: %d\\n", s[0].a);
	free(s);
	printf("over\\n");

}

输出:

可见,
1 初始化时 ,calloc函数帮我们将内存清零
2 在重新分配内存后,数据并没有变化.
3 无论是没有复制内存还是已经复制了内存,对我们来说都是透明的。

2 内存对齐

32位系统时8字节对齐
64位系统16字节对齐
如果事先没有进行对齐,最好事先将字节对齐,以免自己在后面手动计算的情况下搞错地址。
大多数情况下,编译器和c库会自动处理对齐问题,三个函数,malloc 和 calloc 以及realloc 返回的内存空间都是对齐的。

3 大内存申请

请使用mmap 函数来进行磁盘和内存的映射

关于磁盘映射的文章

以上是关于linux 内存管理的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核 内存管理内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 )

Linux 内核 内存管理内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 )

一文掌握 Linux 内存管理

linux 内存管理

linux内存管理

Linux内存管理1