首页 > 代码库 > sbrk与brk的使用小例子

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\n", p);   printf("p2=%p\n", p2);   printf("end=%p\n", 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\n", p1);   //*(p1+1023) = 1000;   int* p2 = sbrk(4);   int* p3 = sbrk(4);   int* p4 = sbrk(4);   printf("p2=%p\n", p2);   printf("p3=%p\n", p3);   printf("p4=%p\n", p4);   sbrk(-12);//释放12个字节的内存空间   int* cur = sbrk(0);//获取sbrk后台的当前位置   printf("cur=%p\n", 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\n", p1);    int* p2 = sbrk(4);    int* p3 = sbrk(4);    int* p4 = sbrk(4);    printf("p2=%p\n", p2);    printf("p3=%p\n", p3);    printf("p4=%p\n", p4);    brk(p1+1024);//分配整个页面的空间        brk(p1+512);//释放一半空间        brk(p1);//释放所有空间    }
一个分配,一个释放,分工合作干活不累.