为什么80%的码农都做不了架构师?>>>   

进程的内存布局:

Heap的顶端的限制叫做program break,通过系统调用brk活着sbrk可以想内核申请内存从而改变break,也就是增加或收缩heap的大小。
进程的地址空间所面对的都是虚拟地址,kernel为每个进程维护一个page table,建立了虚拟地址空间的页和物理内存页或swap空间的映射(虚拟内存或物理内存都是以页为单位)。
很重要的一个特点是,虚拟地址空间是连续的!
虚拟内存管理有很多好处:1、进程相互之间或进程与内核之间相互隔离,进程不能操作其他进程的内存空间,更不能操作内核的空间。2、多个进程可以共享内存。 (多个进程执行相同的程序,也就是多个进程的text segment所对应的物理内存是同一份),节约内存。3、进程维护的页表可以更容易的实现内存保护。(标记page table的entry即可)
虚拟内存这块让我想到了,“软件的很多问题都可以靠加一个中间层解决”;o(∩_∩)o 哈哈
下面是一个简单的malloc和free实现,通过系统调用sbrk来实现:
实现细节:
1、在需要的内存块前面追加一小块空间,来存储当前块的大小(貌似都这样)
2、维护两个全局变量,managed_memory_start、所维护内存的起始地址
last_valid_address、所维护内存的最后有效地址,也就是program break
3、free的实现很简单,标记此块为未用

4、malloc实现,遍历所维护的内存块,找到合适的就返回,找不到就要求系统分配所要求大小的内存。

参考这篇文章:    http://www.ibm.com/developerworks/cn/linux/l-memory/index.html

这个简单的内存管理程序有很多缺点:
1、每一次内存不够时,都要调用sbrk系统调用。sbrk系统调用的单位通常是页大小的很多倍(页典型为4K,sbrk调用最小典型为128K,数据来自于tlpi),这样会有效减少系统调用的次数。
2、malloc中的内存大小匹配算法,找到size>=required的块,会有很多浪费(glibc的实现,则会把大块分裂,返回用户需要的,剩余的放到free list中)。
3、malloc的块查找算法,是遍历整个进程空间,效率太低(glibc是双向链表)。
4、mem_control_block的结构中变量is_available只有一位,确是个int类型,占用空间过多(glibc中只有一个size记录块大小,free块时在块中分配两个指针插入到free list双向链表中)。
5、申请的内存并不会返回给内核(glibc在某种情况下,释放的内存在heap的顶端形成一大片连续的区域,并且大小达到一定的数值(比如128K,数据来自tlpi),尽量减少sbrk系统调用的次数)。
前面,后面最重要的文字总结,都是我自己写的,哈哈~~~

转载于:https://my.oschina.net/astute/blog/91983

对malloc和free的思考相关推荐

  1. malloc/free函数的简单实现及思考

    用于内存管理的malloc/free这对函数,对于使用C语言的程序员应该很熟悉.前段时间听说有的IT公司以"实现一个简单功能的malloc"作为面试题,正好最近在复习K&R ...

  2. malloc为什么会报错:memory corruption

    最近遇到一个问题,很有意思,在此记录下,以备后续参考. 程序运行异常,报错:malloc: memory corruption. 用gdb 调试程序,bt 如下,程序在申请344 bytes内存时失败 ...

  3. nginx内存占用高---内存池使用思考

    nginx内存占用高-内存池使用思考 问题现象 nginx top 进程 虚拟内存 200G 实际内存5G 和 CDN 平台相比要高很多 排查思路 使用pmap -p 进程号,发现从系统角度确实 有分 ...

  4. malloc/new函数及malloc()的一种简单原理性实现

    malloc函数 void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间.返回类型是 void* 类型.void* 表示未确定类型的指针.C,C ...

  5. go二维map_mirrorlang——从0设计二维内存寻址语言及vm(五.内存管理的思考)

    目录 鹏鹏李李:mirrorlang--从0设计二维内存寻址语言及vm [目录]​zhuanlan.zhihu.com 由一段函数开始思考内存布局 func longestPalindrome(s s ...

  6. 基于malloc与free函数的实现代码及分析

    用于内存管理的malloc与free这对函数,对于使用C语言的程序员应该很熟悉.前段时间听说有的IT公司以"实现一个简单功能的malloc"作为面试题,正好最近在复习K&R ...

  7. malloc()之后free报错的原因[详细解析]

    前言 今天闲着没事去敲一些简单的编程题来复习复习,结果在用free()函数的时候报错了. 由此引发了我的思考. 题目如下: 输入一串字符,以"?"结束.统计其中字母个数,数字个数, ...

  8. 编程思考:对象生命周期的问题

    前情提要 只要写过 c/c++ 的项目的童鞋应该对对象生命周期的问题记忆犹新.怕有人还不理解这个问题,笔者先介绍下什么是生命周期的问题? 一个 struct 结构体生命周期分为三个步骤: 出生:mal ...

  9. c malloc 头文件_C/C++笔试题:主要考察C/C++语言基础概念算法及编程,附参考答案...

    1.编写my_strcpy函数,实现与库函数strcpy类似的功能,不能使用任何库函数: 答:char *strcpy(char *strDest, const char *strSrc) { if ...

最新文章

  1. 图像集存储成MNIST数据集格式实现
  2. Paxos的工程实践
  3. 微软职位内部推荐-Senior Software Engineer
  4. python使用阿里云sdk
  5. innodb一页为什么要存储两行记录_innodb数据记录存储结构
  6. 最新综述:对话系统之用户模拟器
  7. vb 如何检测打印机是否联机_打印机提示该文档未能打印导致打印失败的原因及解决方法...
  8. [渝粤教育] 西南科技大学 数据库应用 在线考试复习资料(3)
  9. 解读OC中的load和initialize
  10. 视频语义显著实例分割数据集SESIV
  11. 实现线程安全的单例模式的四种方式
  12. 鸿蒙-HI3516-Docker环境搭建编译烧录
  13. linux nm命令_Linux的networkmanager
  14. 如何用Chrome自带的截屏功能截取超过一个屏幕的网页 1
  15. vue进阶学习组件03
  16. 【ABAP系列】SAP ABAP的事件执行顺序
  17. AIRCHECK G2 v5 新版本-AirMapper APP发布
  18. Jfrog Artifactory安装及备份恢复搭建
  19. MapReduce发生Permission denied: user=zhen, access=WRITE错误
  20. java ssssss,在Java 7中将字符串日期转换为yyyy-MM-dd’T’HH:mm:ss.SSSSSS格式的字符串...

热门文章

  1. 7-1 水文数据校验及处理 (50 分)
  2. kido机器人没反应_机器人不能钩的三个英雄,章鱼妈上榜,钩中图四我方直接团灭!...
  3. ajax传递复选框的参数,ajax将table复选框的数组值传递到后台
  4. 微型计算机按原理可分为那几种,东师微型机原理与应用19秋在线作业2题目【标准答案】...
  5. Android应用程序组件
  6. SQL 语句(原生)
  7. Luogu P4774 / LOJ2721 【[NOI2018]屠龙勇士】
  8. cuDNN编写卷积实例
  9. FileZilla 安装配置参考
  10. PyCharm5.0.2最新版破解注册激活码