内存控制brk和sbrk

内存控制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){
    	int i=0;
    	for(i=2;i<a;i++){
    		if(a%i==0){//如果能够整除
    			return 1;//素数
    		}
    	}
    	return 0;
    }
    int main()
    {
        //存放数据
        int i = 2;
        int* phead; // 指向首位置
        int* pnow; // 指向当前指针位置
        pnow = sbrk(0); // 先分配空闲区域
        phead = pnow; // 记录首地址位置
        for(i=2; i<10000; i++)
        {
            if(isprimer(i)) // 该函数用于判断是否是素数
            {
               brk(pnow+1);// 将内存的边界扩展到下一个字节
                *pnow = i; // 存入数据
                pnow = sbrk(0); // 指向系统指针上次移动到的那个位置
            }
        }
    
        //打印数据
        pnow = phead; // 从头打印
        while(pnow!=sbrk(0))//如果不等于末尾的地址
        {
            printf("%d\n",*pnow);
            pnow++;
        }
        brk(phead); // 将内存页的边界移到首位置,释放空间
    }

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页