• 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);//释放所有空间    
    }
    一个分配,一个释放,分工合作干活不累.
  • 相关阅读:
    LeetCode算法题-Find Pivot Index(Java实现)
    LeetCode算法题-Longest Word in Dictionary(Java实现)
    LeetCode算法题-1-bit and 2-bit Characters(Java实现)
    2016-8-4学习正则表达式
    doT 这个模板 是怎么实现的?
    manually Invoking Model Binding / Model Binding /Pro asp.net mvc 5
    隐隐约约 听 RazorEngine 在 那里 据说 生成代码 很 美。
    web api 的 安全 认证问题 , 对外开放 的 时候 需要考虑到安全的问题
    鼠标滑过显示图片
    页面加载中效果实现
  • 原文地址:https://www.cnblogs.com/linuxnewbie/p/3884611.html
Copyright © 2020-2023  润新知