首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | HR | 镜像
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
搜索中心 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>系统管理>系统管理>正文

内存管理内幕 动态分配的选择、折衷和实现

http://www.oklinux.cn  2007-08-03  赛迪网 kit  会员收藏  游客收藏  【 】 
您查看的文章来源于http://www.oklinux.cn

 

在大部分操作系统中,内存分配由以下两个简单的函数来处理:

 

void *malloc(long numbytes):该函数负责分配 numbytes 大小的内存,并返回指向第一个字节的指针。

 

void free(void *firstbyte):如果给定一个由先前的 malloc 返回的指针,那么该函数会将分配的空间归还给进程的“空闲空间”。

 

malloc_init 将是初始化内存分配程序的函数。它要完成以下三件事:将分配程序标识为已经初始化,找到系统中最后一个有效内存地址,然后建立起指向我们管理的内存的指针。这三个变量都是全局变量:

 

清单 1. 我们的简单分配程序的全局变量

 

 

int has_initialized = 0;
void *managed_memory_start;
void *last_valid_address;

 

如前所述,被映射的内存的边界(最后一个有效地址)常被称为系统中断点或者 当前中断点。在很多 UNIX® 系统中,为了指出当前系统中断点,必须使用 sbrk(0) 函数。 sbrk 根据参数中给出的字节数移动当前系统中断点,然后返回新的系统中断点。使用参数 0 只是返回当前中断点。这里是我们的 malloc 初始化代码,它将找到当前中断点并初始化我们的变量:

 

清单 2. 分配程序初始化函数

 

 

/* Include the sbrk function */
#include <unistd.h>
void malloc_init()
{
 /* grab the last valid address from the OS */
 last_valid_address = sbrk(0);
 /* we don't have any memory to manage yet, so
  *just set the beginning to be last_valid_address
  */
 managed_memory_start = last_valid_address;
 /* Okay, we're initialized and ready to go */
  has_initialized = 1;
}

 

现在,为了完全地管理内存,我们需要能够追踪要分配和回收哪些内存。在对内存块进行了 free 调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存。

 

 

共3页: 上一页 [1] [2] 3 下一页

上一篇:通过Linux系统的内核观察/proc/pid/statm   下一篇:Linux中的内存简单计算方式介绍

收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·让linux系统内存不再泄漏的好方法
·Linux启动时间的极限优化方案
·Linux内存磁盘初始化技术详细解析
·Ubuntu Linux系统上的三款超强监视工具
·让Ubuntu Linux支持第三方无线网卡的方法
·Ubuntu Linux系统常见问题解决方法集锦
·Linux下各种主要文件系统的读写性能测试
·Debian系统下Latex+Dvipdfm中文解决方案
·Linux下动态库的生成及链接方法
·Linux下加载ISO文件的方法介绍
·在Linux下FrameBuffer直接写屏
·Linux用户口令安全恢复方法介绍
·Linux环境下的高级隐藏技术详解
·Linux操作系统文件权限设置方法详细讲解
·快速安全的建立Linux操作系统的用户账户
·Linux服务器前台常出现的错误提示及含意
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·VirtualBox为Ubuntu系统配置共享文件夹
·Ubuntu下安装Netgear WG511v2 无线网卡
·Redhat Enterprise Linux磁带机简单操
·Linux系统下创建DBCA报错的解决方法
·Fedora和XP双系统中网卡Realtek冲突问
·Ubuntu开机自动挂载Win分区
·ubuntu8.04如何访问其它分区
·Fedora 9的安全措施
· 移动Linux系统中的TMP分区
·双Linux和多Linux系统的安装方法介绍
·轻松设置Wine程序的中文显示
·Linux系统下强大的杀毒软件:Avast
  阅读排行
·在Linux系统下查看端口的使用情况及启
·在Linux操作系统下查看磁盘空间的好方
·使用源代码将 Glibc 升级到 2.6
·Useradd和Adduser添加用户工具使用方法
·Linux系统的头文件和库文件搜索路径
·Linux下推荐的常用应用程序列表
·Linux环境进程间通信——信号(上)
·设置GRUB默认启动系统及Menu.lst参数介
·Linux系统挂载U盘和硬盘光驱的问题
·Df命令:查看Linux磁盘剩余空间方法介
·什么是Linux?Linux与UNIX之间的关系
·Linux系统利用Crontab命令实现定时重启
·使用 ActiveScaffold 增强 Ruby on Rai
·Linux系统下常用命令及账户管理
·新手入门:手把手教你如何写Makefile
网摘收藏: