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);//释放所有空间
}

一个分配,一个释放,分工合作干活不累.

sbrk与brk的使用小例子的更多相关文章

  1. springmvc入门的第一个小例子

    今天我们探讨一下springmvc,由于是初学,所以简单的了解一下 springmvc的流程,后续会持续更新... 由一个小例子来简单的了解一下 springmvc springmvc是spring框 ...

  2. java即时通信小例子

    学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是 ...

  3. Runtime的几个小例子(含Demo)

    一.什么是runtime(也就是所谓的“运行时”,因为是在运行时实现的.)           1.runtime是一套底层的c语言API(包括很多强大实用的c语言类型,c语言函数);  [runti ...

  4. bootstrap 模态 modal 小例子

    bootstrap 模态 modal  小例子 <html> <head> <meta charset="utf-8" /> <title ...

  5. INI配置文件分析小例子

    随手写个解析INI配置字符串的小例子 带测试 #include <iostream> #include <map> #include <string> #inclu ...

  6. JavaScript小例子:复选框全选

    JavaScript小例子:复选框全选 这只是一个小例子,很简单,但是这个功能还是很常用的: 实现后效果如图: JavaScript代码: <script type="text/jav ...

  7. 【zTree】 zTree使用的 小例子

    使用zTree树不是第一次了  但是 还是翻阅着之前做的 对照着 使用起来比较方便  这里就把小例子列出来   总结一下使用步骤 这样方便下次使用起来方便一点 使用zTree树的步骤: 1.首先  在 ...

  8. js小例子(标签页)

    运用js写的一个小例子,实现点击不同的标签出现不同的内容: <!DOCTYPE html> <html> <head> <meta chaset=" ...

  9. c# BackGroundWorker 多线程操作的小例子

    在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...

随机推荐

  1. JavaScript方法的调用

    1.假如是有名字的函数 调用是用名字调用,并且会把返回值赋值给接受它的参数 代码: function f() { alert("我是f"); return '我是返回值'; } f ...

  2. 详解依赖注入(DI)和Ioc容器

    简单的来说,关键技术就是:注册器模式. 场景需求 我们知道写一个类的时候,类本身是有个目的的,类里面有很多方法,每个方法搞定一些事情:我们叫这个类为主类. 另外这个主类会依赖一些其他类的帮忙,我们叫这 ...

  3. 求解PDE的多重网格法(MG)

    多重网格法相对于普通的Jacobi迭代或者G-S迭代等能够得到和未知数的个数成线性的高效运行时间的主要原因在于:迭代初值的一步步接近真值和G_S方法的前面几步的快速收敛性. 先看一张图[1]: 这张图 ...

  4. 程序最多能new多少内存(2G内存里要放程序的5大区,HeapAlloc比new要快多了,而且超过2G的时候会告诉你)

    根据<Windows核心编程>得知:X86操作系统提供每个程序最多只有4G的虚拟内存,其中2G虚拟内存提供给系统用(具体用来干什么还待考察),还有2G的内存留给用户使用.那这2G内存能拿来 ...

  5. tableView主从表在storyboard连线是 Selcetion Segue和Accessory Action的区别

    当按住Ctorl这样连线时会出现,当选择Selection Segue下面的push时,点击cell的任何位置都会跳转到下一个tableView,当选择Accessory Action的下面的push ...

  6. tensorflow 学习(一)

    改系列只为记录我学习 udacity 中深度学习课程!! 1. 整个课程分为四个部分,如上图所示. 第一部分将研究逻辑分类器,随机优化以及实际数据训练. 第二部分我们将学习一个深度网络,和使用正则化技 ...

  7. Advanced REST client

    好用的测试工具,老是忘记名字chrome插件 Advanced REST client

  8. DuiLib学习笔记2——写一个简单的程序

    我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新 ...

  9. csuoj 1114: 平方根大搜索

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1114 1114: 平方根大搜索 Time Limit: 5 Sec  Memory Limit:  ...

  10. Viewdraghelper解析

    2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用, 其实研究他们的源码你会发现这两个类都运用了ViewDr ...