计算机内存管理介绍

摘要:
计算机操作系统内存管理是十分重要的,因为其中涉及到很多设计很多算法 。《深入理解计算机系统》这本书曾提到过,现在操作系统存储的设计就是“带着镣铐跳舞”,造成计算机一种一种容量多,速度快的假象 。包括现在很多系统比如数据库系统的设计和操作系统做法相似 。所以在学习操作系统之余我来介绍并总结一些操作系统的内存管理 。
首先我们看一下计算机的存储层次结构

计算机内存管理介绍

文章插图
 
按照金字塔结构可以分为四种类型: 寄存器,快速缓存,主存和外存 。而
寄存器和L1缓存都在Processor内部 。在金字塔中,越往下价格越低速度越慢但容量越大 。
还有两种存储空间需要分清:
  1. 地址空间:又称逻辑地址空间,源程序经过编译后得到的目标程序,存在于它所限定的地址范围内,这个范围称为地址空间 。地址空间是逻辑地址的集合 。
  2. 内存空间: 又称存储空间或物理地址空间 。是指主存中一系列存储信息的物理单元(划重点)的集合,这些单元的编号称为物理地址或绝对地址 。
简言之就这两个空间分别是程序员能够观测到的存储空间和真实的物理空间 。
需求与管理的目标需求:
  • 每个程序员希望没有第三方因素干扰程序运行
  • 计算机希望将有限的资源尽可能为多个用户提供服务
为了满足需求的目标:
  • 计算机至少同时存在一个用户程序和一个服务器程序(操作系统内核管理)
  • 每个程序互不干扰,所以其地址空间应该相互独立 。
  • 每个程序使用的空间应该被保护,最怕运行的时候程序中断 。就和看电影的时候无法播放一样难受 。
程序的内存管理操作系统在内存中的位置有以下三种可能
计算机内存管理介绍

文章插图
 
只有一个程序的环境下的内存管理此时整个内存只有两个程序,即用户程序和操作系统 。
操作系统所占的空间是固定的,则用户程序空间也是固定的,因此可以将用户程序永远加载到同一个地址,即用户程序永远从同一个地方开始运行 。这种情况下,用户程序地址可以在运行之前就可以计算出来 。
我们通过加载器计算程序运行之前的物理地址静态翻译 。此时既不需要额外实现地址独立和地址保护 。因为用户不需要知道物理内存的相关知识,而且也没有其它用户程序 。
多个程序的环境下的内存管理此时用户的程序空间需要通过分区来分给多个不同的程序了 。每个应用程序占用一个或几个分区,这种分配支持多个程序并发执行,但难以进行内存分区的共享 。
其中分区有两种方法:
一种方法: 固定(静态)式 分区分配,让程序适应分区顾名思义就是把内存划分为若干个固定大小的连续分区,这几个分区或者大小相等以适合多个相同程序并发,或者大小不等的分区以适合不同大小的程序 。
这种分配方法优点很明显,在于非常容易实现,开销小 。
缺点就是会产生很多内部碎片(也就是未被利用的存储空间),固定的分区总数也限制了并发执行的程序数目 。我们简单介绍下静态分配的几种方法 。
  1. 单一队列的分配方式
  2. 多队列分配方式
  3. 固定分区管理先使用表进行大小初始化,固定分区大小
另一种方法:可变(动态)式 分区分配,让分区适应程序此时分区的边界可以移动,但也产生了分区与分区之间狭小的外部碎片 。
计算机内存管理介绍

文章插图
 

计算机内存管理介绍

文章插图
 
在可变分区中,知道内存的空闲空间大小就十分重要了 。OS通过跟踪内存使用计算出内存有多少空闲 。跟踪的方法有两种:
位图表示法:
也就是所谓的bitmap,用每一位来存放某种状态 。将内存每一个分配单元赋予一个判断的用于判断状态的字位,字位取值位0表示单元闲置;字位为1表示单元被占用
  • 特点
  1. 空间成本固定:不受内存程序数量影响
  2. 时间成本低:操作的时候只需要将状态值改变
  3. 缺少容错能力:由于内存单元发生错误的时会将状态值改变,对操作系统来讲,这个状态值是因为发生错误发生的改变还是原来的状态很难判断 。


    推荐阅读