内存管理是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。
内存管理是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。一个执行中的程式,譬如网页浏览器在个人电脑或是图灵机(Turing machine)里面,为一个行程将资料转换于真实世界及电脑内存之间,然后将资料存于电脑内存内部(在计算机科学,一个程式是一群指令的集合,一个行程是电脑在执行中的程式)。一个程式结构由以下两部分而成:“本文区段”,也就是指令存放,提供 CPU 使用及执行; “资料区段”,储存程式内部本身设定的资料,例如常数字串。
内存可以通过许多媒介实现,例如磁带或是磁盘,或是小阵列容量的微芯片。 从 1950 年代开始,计算机变的更复杂,它内部由许多种类的内存组成。内存管理的任务也变的更加复杂,甚至必须在一台机器同时执行多个进程。
虚拟内存是内存管理技术的一个极其实用的创新。它是一段程序(由操作系统调度),持续监控着所有物理内存中的代码段、数据段,并保证他们在运行中的效率以及可靠性,对于每个用户层(user-level)的进程分配一段虚拟内存空间。当进程建立时,不需要在物理内存件之间搬移数据,数据储存于磁盘内的虚拟内存空间,也不需要为该进程去配置主内存空间,只有当该进程被被调用的时候才会被加载到主内存。
可以想像一个很大的程序,当他执行时被操作系统调用,其运行需要的内存数据都被存到磁盘内的虚拟内存,只有需要用到的部分才被加载到主内存内部运行。
当一个程序执行,操作系统将程序的资料区段及本文区段映射到虚拟内存空间内部,然后在内存执行程序的指令(见冯诺依曼架构(von Neumann architecture),无论如何,当进程执行时就必须去储存暂时性的资料,或更重要的,它会呼叫一些函数(function)或是子程序(subroutine),并且储存当前函数的状态,最好的数据结构方法,资料由堆栈(stack)的方式储存,当我们完成这个函数,资料会由堆栈的 pop 方式取出,堆栈将会在函数的生命周期内动态的成长,操作系统提供区分本文区段及资料区段,而堆栈区段则在一个行程的最顶端,这种方式称为段式结构(segments)或“分段”。
内存管理对于编写出高效率的 Windows 程序是非常重要的,这是因为 Windows 是多任务系统,它的内存管理和单任务的 DOS 相比有很大的差异。DOS 是单任务操作系统,应用程序分配到内存后,如果它不主动释放,系统是不会对它作任何改变的;但 Windows 却不然,它在同一时刻可能有多个应用程序共享内存,有时为了使某个任务更好地执行,Windows 系统可能会对其它任务分配的内存进行移动,甚至删除。因此,我们在 Windows 应用程序中使用内存时,要遵循 Windows 内存管理的一些约定,以尽量提高 Windows 内存的利用率。
Windows 应用程序可以申请分配属于自己的内存块,内存块是应用程序操作内存的单位,它也称作内存对象,在 Windows 中通过内存句柄来操作内存对象。内存对象根据分配的范围可分为全局内存对象和局部内存对象;根据性质可分为固定内存对象,可移动内存对象和可删除内存对象。
固定内存对象,特别是局部固定内存对象和 DOS 的内存块很类似,它一旦分配,就不会被移动或删除,除非应用程序主动释放它。并且对于局部固定内存对象来说,它的内存句柄本身就是内存对象的 16 位近地址,可供应用程序直接存取,而不必象其它类型的内存对象那样要通过锁定在内存某固定地址后才能使用。
可移动内存对象没有固定的地址,Windows 系统可以随时把它们移到一个新地址。内存对象的可移动使得 Windows 能有效地利用自由内存。例如,如果一个可移动的内存对象分开了两个自由内存对象,Windows 可以把可移动内存对象移走,将两个自由内存对象合并为一个大的自由内存对象,实现内存的合并与碎片回收。
可删除内存对象与可移动内存对象很相似,它可以被 Windows 移动,并且当 Windows 需要大的内存空间满足新的任务时,它可以将可删除内存对象的长度置为 0,丢弃内存对象中的数据。
可移动内存对象和可删除内存对象在存取前必须使用内存加锁函数将其锁定,锁定了的内存对象不能被移动和删除。因此,应用程序在使用完内存对象后要尽可能快地为内存对象解锁。内存需要加锁和解锁增加了程序员的负担,但是它却极大地改善了 Windows 内存利用的效率,因此 Windows 鼓励使用可移动和可删除的内存对象,并且要求应用程序在非必要时不要使用固定内存对象。
不同类型的对象在它所处的内存堆中的位置是不一样的,定对象位于堆的底部;可移动对象位于固定对象之上;可删除对象从堆的顶部开始分配。