brk/sbrk

brk/sbrk

brk / sbrk
从堆中分配空间,本质是移动一个位置,向后移就是分配空间,向前移就是释放空间

sbrk用相对的整数值确定位置,如果这个整数是正数,会从当前位置向后移若干字节,如果为负数就向前若干字节。在任何情况下,返回值永远是移动之前的位置

brk用绝对的地址指定移到哪个位置。

#include 
< stdio.h >
#include 
< unistd.h >
int  main()
{
    
void *  p  =  sbrk( 0 );
    
int *  p1  =  p;
    brk(p1
+ 4 ); // 分配了16个字节的空间
    p1[ 0 =   10 ;
    p1[
1 =   20 ;
    p1[
2 =   30 ;
    p1[
3 =   40 ;
    p1[
4 =   50 ;
    
int *  p2  =  sbrk( 4 );
    printf(
" *p2=%d\n " * p2);
    brk(p1
+ 1024 ); // 分配整个页面的空间
    brk(p1 + 512 ); // 释放一半空间
    brk(p1); // 释放所有空间
}

sbrk:
参数
> 0  向后移动当前位置,相当分配内存空间
参数
< 0  向前移动当前位置,相当释放内存空间
参数==
0  当前位置不动
返回总是移动前的位置

brk(
void *  ptr);
将当前位置移动到ptr的位置
ptr的位置一般通过sbrk(
0 )获取首地址,然后再计算得出

sbrk实例
#include 
< stdio.h >
#include 
< unistd.h >
int  main()
{
    
/* 分配10个字节的空间,返回该空间的首地址 */
    
void *  p  =  sbrk( 12 );
    
void *  p2  =  sbrk( 4 );
    
void *  p3  =  sbrk( 4 );
    
void *  p4  =  sbrk( 4 );
    printf(
" p=%p\n " , p);
    printf(
" p2=%p\n " , p2);
    printf(
" p3=%p\n " , p3);
    printf(
" p4=%p\n " , p4);
    
/* 用参数为0来获取未分配空间的开始位置 */
    
void *  p0  =  sbrk( 0 );
    printf(
" p0=%p\n " , p0);
    
void *  p5  =  sbrk( - 4 );
    printf(
" p5=%p\n " , p5);
    printf(
" pid=%d\n " , getpid());
    sleep(
10 );
    
/* 当释放到一个页面的开始位置时,整个页面会被操作系统回收 */
    sbrk(
- 20 );

    
/*
    int* pi = p;
    *pi = 10;
    *(pi+1) = 20;
    *(pi+2) = 30;
    *(pi+1023) = 1023;
    *(pi+1024) = 1024;
    
*/
    
while ( 1 );
}


#include 
< stdio.h >
#include 
< unistd.h >
int  main()
{
    printf(
" pid=%d\n " , getpid());
    
void *  p  =  sbrk( 0 );
    
int *  p1  =  sbrk( 4 );
    sleep(
10 );
    
int *  p2  =  sbrk( 1023 * 4 + 1 );
    sleep(
10 );
    sbrk(
- 1 );
    
while ( 1 );
}

你可能感兴趣的:(brk/sbrk)