在介绍内容之前之前,首先问一个问题:什么是内存管理,或者说为什么需要内存管理?如果你半天想不出一些内容,那就来看看我写的这个文章。
一般,计算机的内存大小大约是64M,而我们的操作系统运行时会有很多的进程,如何合理的“安置”这些进程是一个很复杂的问题。大家都知道内存的造价要比磁盘贵很多,而且内存过大相应CPU的性能也要提升,否则计算机将不能正常运行。因此,扩大内存的方法并不符合实际。这样人们提出了内存管理的思想。所谓的内存管理就是,操作系统将用户使用的存储部分进一步细分,以满足多个进程的要求。
这里我们主要介绍6种内存管理方案,分别是分区、分页、分段、伙伴系统、交换分区、虚拟内存。
分区
分区的主要思想是在程序加载时,将程序整体加载到一块分区上。分区一共有两种方法,固定分区和动态分区。
固定分区
固定分区的主要思想是,程序加载时,将主存划分为成多个大小相等或不等的静态分区,进程运行时使用大于或等于自身大小的分区。
固定分区的优势在于,实现简单,操作系统的开销极少,但是缺陷也很明显,容易产生内部碎片,造成内存的浪费。并且当内存全部分配出去后,新的进程无法运行,这样对操作系统的运行效率产生很大的影响。
动态分区
相比于固定分区,动态分区的是操作系统动态的为即将运行的新进程创建分区,以保证进程的大小尽可能地接近于分区大小。
与固定分区相比,动态分区的优势是没有内部碎片产生,内存的利用率也高,但是动态分区的方法并不是完美的。动态分区的缺陷在于,操作系统在创建新分区时,容易产生外部碎片,而且外部碎片需要很大的开销才能回收回来以供下次使用,所以动态分区的内存利用率也不是很高。
分页
分页的主要思想类似于大小相等固定分区,是在系统初始化时,将内存划分为大小相等的页帧(大小为4K),而用户程序在磁盘上存储,同样是按照4K的页面进行存储,程序加载时,操作系统为每一个进程维护一个页表。同一个进程,可以在不连续的内存上占据多个页帧。
分段
分段是指,程序加载时,根据程序的段将程序加载到内存上,操作系统为每一个进程维护一个段表。一个进程可以在不连续的内存上占据多个段。每个帧的大小是固定的,每个段的大小是根据用户程序的代码段划分,大小不固定。
伙伴系统
伙伴系统的主要思想是,操作系统在为每一个进程分配内存时,根据请求的的内存大小将内存空间不断减半,直到以最小的内存空间分配给进程。当进程结束后,系统回收分配出去的内存空间,会判断该内存的相邻左边或者右边有没有跟自身大小相等的空闲内存块,如果存在则与其合并成更大的内存块,然后在检测合并,直至无法合并为止。伙伴系统的操作类似于二叉树。
交换分区
交换分区是一块在磁盘上扩展的内存空间,是真实存在的额外的内存空间,作为对内存的补充。当内存空间不足时,操作系统将内存上的部分数据(MMU)交换到交换分区上,从而可以为新的进程继续分配内存。有了交换分区之后,操作系统就可以运行更多的进程,同时也能够运行比内存大的进程。
虚拟内存
虚拟内存是一种内存管理的技术。虚拟内存技术是将内存抽象成一个巨大的统一的数组,进而可以分离逻辑内存和物理内存,虚拟内存技术允许内存不完全在内存中执行。