0
点赞
收藏
分享

微信扫一扫

五、内存结构

凶猛的小白兔 2022-02-18 阅读 69

1.虚拟内存、物理内存、半导体内存和换页文件

  1. 进程映射(Process Maps)

3.内存的分配与释放

#include <stdio.h>
#include <unistd.h> 
int main(void) {
	setbuf(stdout, NULL);//为了避免堆内申请干扰,取消标准IO的缓存区,因为printf的缓冲区也是从堆里申请的
    int* p1 = (int*)sbrk(sizeof(int));
    if (p1 == (int*)-1) { 
        perror("sbrk");
        return -1;
    }
    *p1 = 0;
    printf("%d\n", *p1);

    double* p2 = (double*)sbrk(sizeof(double));
    if (p2 == (double*)-1) {
        perror("sbrk");
        return -1;
    }
    *p2 = 1.2;
    printf("%g\n", *p2);

    char* p3 = (char*)sbrk(256 * sizeof(char));
    if (p3 == (char*)-1) {
        perror("sbrk");
        return -1;
    }
    sprintf(p3, "Hello, World!");
    printf("%s\n", p3);

    //释放内存,通过传入所有申请内存大小之和的相反数
    if (sbrk(-(256 * sizeof(char) +
                     sizeof(double) +
                     sizeof(int))) == (void*)-1) {
        perror("sbrk");
        return -1;
    }
    
    
    return 0; 
   } 
#include <stdio.h>
#include <unistd.h> 
 int main(void) {
    setbuf(stdout, NULL);//为了避免堆内申请干扰,取消标准IO的缓存区,因为printf的缓冲区也是从堆里申请的
    int* p1 = (int*)sbrk(0);//先拿到堆顶的地址
    if (p1 == (int*)-1) {
        perror("sbrk");
        return -1;
    }
    double* p2 = (double*)(p1 + 1);
    if (brk(p2) == -1) {
        perror("brk");
        return -1;
    }
    *p1 = 0;
    printf("%d\n", *p1);
    char* p3 = (char*)(p2 + 1);
    if (brk(p3) == -1) {
        perror("brk");
        return -1;
    }
    *p2 = 1.2;
    printf("%g\n", *p2);
    void* p4 = p3 + 256;
    if (brk(p4) == -1) {
        perror("brk");
        return -1;
    }
    sprintf(p3, "Hello, World!");
    printf("%s\n", p3);
    if (brk(p1) == -1) {
        perror("brk");
        return -1;
    }
    return 0; } 
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
int main(void) {
    char* psz = mmap(NULL, 8192,
        PROT_READ | PROT_WRITE,
        MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
    if (psz == MAP_FAILED) {
        perror("mmap");
        return -1;
    }
    sprintf(psz, "第一页");
    sprintf(psz + 4096, "第二页");
    printf("%s\n", psz);
    printf("%s\n", psz + 4096);
    if (munmap(psz, 4096) == -1) {
        perror("munmap");
        return -1;
    }
    //这里会出现段错误,因为前面把psz的第一页解除了
    //printf("%s\n", psz);

    //这里不会出现段错误,因为前面只把psz的第一页解除了,第二页没有,还能访问到
    printf("%s\n", psz + 4096);

    //这里映射就全部解除了
    if (munmap(psz + 4096, 4096) == -1) {
        perror("munmap");
        return -1;
    }
    return 0;
}

可cd /proc/(pid号)目录下的maps文件查看该进程内存堆的使用情况

举报

相关推荐

JVM 内存结构

JVM内存结构

jvm内存结构

JVM之内存结构

jvm的内存结构

结构体内存对齐

JVM----内存结构

0 条评论