内存控制brk和sbrk
比malloc更底层的内存控制,适合“内存空间大小不定”的场景,效率比malloc更高
函数原型
#include <unistd.h>
int brk(void *addr);
void *sbrk(intptr_t increment);
相关概念:通常将内存边界称为 program break 程序段
在program break的位置抬升后,程序可以访问新分配区域内的任何内存地址,而此时物理内存页尚未分配
内核会在进程首次试图访问这些虚拟内存地址时自动分配新的物理内存页
背景:brk和sbrk维护着同一个指针
sbrk工作过程描述:
1.先判断系统中的指针是否为NULL,为NULL,则找到一个空闲的首地址,赋予给他,并将该地址返回,若不为NULL,则直接将该地址返回
2.判断sbrk传入的参数,是否存在,如果没有,则映射一个页,在页中分配size个字节
3.同时将首地址+size,赋予给内部指针,通过内部指针来维护他
*
具体作用*:
brk:分配空间,释放空间,对参数中 addr 做绝对位置调整,调动指针左右移动,左移-释放空间,右移-分配空间
即将内存页的末尾移动到 addr 指针指向的位置
sbrk:以当前位置为开始,将内存页的位置移动increment个偏移量
返回值:
如果成功,brk返回0,sbrk返回一个指针
如果失败,brk返回-1,sbrk返回一个 (void*)-1,即也是-1
示例代码
#include<unistd.h>
#include<stdio.h>
int isprimer(int a<