• sbrk与brk的使用小例子


    sbrk() 和 brk() - Unix的系统函数


      sbrk()和brk() 系统的底层会维护一个位置,通过位置的移动完成内存的分配和回收。映射内存时 以一个内存页作为基本单位。
      void* sbrk(int increment)
      参数是增量
        增量为正数时,分配内存
        增量为负数时,回收内存
        增量为0时,取当前的位置
      返回 移动之前的位置(可用内存的首地址),这个返回值对于增量为负数的情况没有意义。

    sbrk() 在分配内存时很方便,但在回收内存时比较麻烦;brk()则相反。 ->
    开发中,一般用sbrk()分配内存,用brk()回收内存。
    brk()的使用方式就是直接传递一个地址过来,做新的位置。
      brk()必须和sbrk()结合使用,获得第一个位置。

    sbrk()参数为位置,表示从当前位置开始移动多少位.sbrk(0)获取当前位置.

    brk()参数也为移动的位置,但是这个位置为从第一个位置开始.

    下面是一些帮助理解的小例子:

    //brk.c
    #include <stdio.h>
    #include <unistd.h>
    
    int main()
    {
       int* p = sbrk(0);
       brk(p+1);//分配空间
       brk(p+100);//分配空间
       brk(p+50);//释放空间
       brk(p);//全部释放
       int* pa = sbrk(4);//分配4bytes
       int* pb = sbrk(0);
       brk(p+100);//分配396bytes
       
       void* p2 = sbrk(4); //404
       printf("p=%p
    ", p);
       printf("p2=%p
    ", p2);
       printf("end=%p
    ", sbrk(0));
       //-------------------------------
       int* start = sbrk(100);
       int* p10 = sbrk(4);
       int* p20 = sbrk(4);
       //...
       brk(start);
    }


    这里的内存分配感觉有些麻烦,不过释放很轻松.

    //sbrk.c
    #include <stdio.h>
    #include <unistd.h>
    
    int main()
    {
       int* p1 = sbrk(4);//分配4个字节的内存空间
       printf("p1=%p
    ", p1);
       //*(p1+1023) = 1000;
       int* p2 = sbrk(4);
       int* p3 = sbrk(4);
       int* p4 = sbrk(4);
       printf("p2=%p
    ", p2);
       printf("p3=%p
    ", p3);
       printf("p4=%p
    ", p4);
       sbrk(-12);//释放12个字节的内存空间
       int* cur = sbrk(0);//获取sbrk后台的当前位置
       printf("cur=%p
    ", cur);
       sleep(15);
       //sbrk(-4);//再次释放4个字节的内存空间
       sbrk(4092+1);
       while(1);
    }

    sbrk分配比较轻松,释放麻烦.

    所以我们可以两个结合了使用

    #include <stdio.h>    
    #include <unistd.h>    
    int main()   
    {   
        void* p = sbrk(0);  //得到第一个地址 
        int* p1 = p;   
        printf("p1=%p
    ", p1);
        int* p2 = sbrk(4);
        int* p3 = sbrk(4);
        int* p4 = sbrk(4);
        printf("p2=%p
    ", p2);
        printf("p3=%p
    ", p3);
        printf("p4=%p
    ", p4);
        brk(p1+1024);//分配整个页面的空间    
        brk(p1+512);//释放一半空间    
        brk(p1);//释放所有空间    
    }
    一个分配,一个释放,分工合作干活不累.
  • 相关阅读:
    工具
    BZOJ 1202: [HNOI2005]狡猾的商人
    BZOJ 4562: [Haoi2016]食物链
    BZOJ 1922: [Sdoi2010]大陆争霸
    BZOJ 2429: [HAOI2006]聪明的猴子
    BZOJ 1083: [SCOI2005]繁忙的都市
    BZOJ 1012: [JSOI2008]最大数maxnumber
    Luogu P1078 文化之旅
    快速读入
    [HNOI2014]道路堵塞
  • 原文地址:https://www.cnblogs.com/linuxnewbie/p/3884611.html
Copyright © 2020-2023  润新知