追溯到在 apple ii 上进行汇编语言编程的时代,那时内存管理还不是个大问题.您实际上在运行整个系统.系统有多少内存,您就有多少内存.您甚至不必费心思去弄明白它有多少内存,因为每一台机器的内存数量都相同.所以,如果内存需要非常固定,那么您只需要选择一个内存范围并使用它即可.
确定您是否有足够的内存来处理数据. 从可用的内存中获取一部分内存. 向可用内存池(pool)中返回部分内存,以使其可以由程序的其他部分或者其他程序使用.【程序编程相关:怎样挑选企业存储资源管理工具?】
不过,即使是在这样一个简单的计算机中,您也会有问题,尤其是当您不知道程序的每个部分将需要多少内存时.如果您的空间有限,而内存需求是变化的,那么您需要一些方法来满足这些需求: 【推荐阅读:请教Buffer Credits的调节办】
c 风格的内存分配程序 【扩展信息:寻找类似于SANScan的管理软件】
实现这些需求的程序库称为 分配程序(allocators),因为它们负责分配与回收内存.程序的动态性越强,内存管理就越重要,您的内存分配程序的选择也就更重要.让我们来了解可用于内存管理的不同方法,它们的好处与不足,以及它们最适用的情形.
c 编程语言提供了两个函数来满足我们的三个需求: malloc:该函数分配给定的字节数,并返回一个指向它们的指针.如果没有足够的可用内存,那么它返回一个空指针. free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存归还给操作系统).物理内存与虚拟内存
要理解内存在程序中是如何分配的,首先需要理解如何将内存从操作系统分配给程序.计算机上的每一个进程都认为自己可以访问所有的物理内存.显然,由于同时在运行多个程序,所以每个进程不可能拥有全部内存.实际上,这些进程使用的是 虚拟内存.只是作为一个例子,让我们假定您的程序正在访问地址为 629 的内存.不过,虚拟内存系统不需要将其存储在位置为 629 的 ram 中.实际上,它甚至可以不在 ram 中 —— 如果物理 ram 已经满了,它甚至可能已经被转移到硬盘上!由于这类地址不必反映内存所在的物理位置,所以它们被称为虚拟内存.操作系统维持着一个虚拟地址到物理地址的转换的表,以便计算机硬件可以正确地响应地址请求.并且,如果地址在硬盘上而不是在 ram 中,那么操作系统将暂时停止您的进程,将其他内存转存到硬盘中,从硬盘上加载被请求的内存,然后再重新启动您的进程.这样,每个进程都获得了自己可以使用的地址空间,可以访问比您物理上安装的内存更多的内存.
在 32-位 x86 系统上,每一个进程可以访问 4 gb 内存.现在,大部分人的系统上并没有 4 gb 内存,即使您将 swap 也算上, 每个进程所使用的内存也肯定少于 4 gb.因此,当加载一个进程时,它会得到一个取决于某个称为 系统中断点(system break)的特定地址的初始内存分配.该地址之后是未被映射的内存 —— 用于在 ram 或者硬盘中没有分配相应物理位置的内存.... 下一页