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文件查看该进程内存堆的使用情况