第10章 基本内存管理

来源:互联网 发布:vm12安装mac 编辑:程序博客网 时间:2024/04/27 13:50

10.1  内存管理的环境

计算机最开始时没有把执行程序加载到内存中,而是把程序放到光盘中,从光盘读取一条命令就执行一条命令;因为cpu的速度是光盘的几十万倍,这就造成了cpu的资源浪费和程序执行的效率低下;这时就要求在光盘和cpu之间加上一种存储结构,让程序执行的更有效率。此时就产生了许多存储结构,主要包括如下:

常见的存储结构:

  • 缓存:量小、速度快、价格贵
  • 主内存:量中、速度中、价格中
  • 磁盘:量大、速度慢、价格低

理想情况下,程序员对存储结构的要求是:大容量、高速度、持久化;但上面计算机的存储结构(包括三部分不同特性的存在介质); 三种不同的存储介质如果直接提供给操作系统或者开发同学来使用则变的无比复杂;这时就需要操作系统的一种机制,这种机制就叫内存管理机制 
内存管理机制负责对内存架构进行管理,使程序在内存架构任何一个层次存放对用户来说都是一样的;用户无需担心数据是存储在缓存、主存、磁盘还是磁带上,反正运行、计算、输出的结果都是一致的。内存管理机制实现这种对用户透明的机制的方案是虚拟内存来实现。

10.2 内存管理的目标

  • 地址保护:多个进程会申请自己的内存空间,内存管理机制必须保证进程之前是互斥的,不允许进程之间访问其他的内存空间
  • 地址独立:程序执行的地址空间,跟物理地址是没有关系的;这个程序地址需要根据当前的硬件存储进行程序地址跟物理存储地址的分配(建立对应关系)


10.3 虚拟内存的基本概念

虚拟内存的基本思想就是把磁盘空间当成主存使用,让程序感觉主存更大了;虚拟内存也是内存管理机制的一个重要的概念,通过对缓存、主存、磁盘的有效管理,让用户感觉主存更大,缓存更快;就是os系统(内存管理机制)的魔幻之处

10.4 操作系统的内存空间

从根本上讲,计算机上存在着两类程序:一类是管理计算机的程序(os),一类是使用计算机的程序;而操作系统就是管理计算机的程序,那操作系统的程序需要放在内存空间的哪里呢?最简单的就是把主存空间分成2部分:一部分是给操作系统的ram,一部分是给用户程序的ram;

10.5 多进程编程的内存管理

多进程编程,意味着需要把程序都加载到内存后,执行程序时现场计算程序地址跟物理内存之间的关系;这计算对应关系是由地址翻译器完成的。


10.5.1 固定分区内存管理

把内存分成固定大小的不同区域,最下面的一部分给操作系统使用,其他的部分分配给进程使用;每个进程可以分配一个区域,但因为区域是固定大小,进程可能需要的区域大小也不同,很容易造成资源浪费;给一个占用内存小的程序分配了一个大的内存区域

10.5.2 非固定分区内存管理

解决上面问题的办法就是采取非固定分区管理,内存只分成2个区域,一个区域是给操作系统用的(操作系统占用的内存是固定的,分配时只需要多分配一些备用即可);剩下的内存作为一个整体进行管理;多进程按照加载(进程启动后会加载)顺序进行分配内存,加载时根据程序需要分配内存,为了避免程序执行过程中会不断读入新的数据造成开始分配的内存空间不够,一般会多分配一些内存作为一些buffer,因为一些数据如果不同了也会清理数据,释放内存空间。但也会引发2个问题:
  • 给程序(进程) 分配的内存不够,造成进程不能继续进行
  • 内存碎片化的问题:程序stop后或者运行过程中会进行数据清理、淘汰释放出一些小的内存块;这些内存块成为一个个孤立的内存块;他们的使用和处理也将成为问题
解决程序分配内存不够的方案是采用swap 分区,这就涉及到交换(swap) 的机制:当程序分配的内存不够用【如果是一台机器只有一个进程那就是整个内存不够用了】会触发交换制,即是:把整个程序的代码+数据都转移到swap区[实质就是磁盘],然后清理这个进程的内存区域,并给这个进程分配更大的内存区后,把程序代码+数据从swap 转移回内存,这样来解决程序分配内存不够的问题;这个过程都是操作系统自己实现的,程序代码完全不用care。但交换也会带来问题,本来程序从内存中读写数据就可以完成服务的请求,但是现在转移到swap上,那转移过程中或者在swap 区域都会出现在磁盘上读写数据,会频繁写io;造成io压力比较大,从来导致系统服务超时比较多。

10.5.3 交换和重叠

交换上面已经说的很清楚了,下面说下重叠;如果一台机器只有一个程序,而且程序需要的内存超过了物理内存,那这个程序还可以运行吗?答案是肯定的,采取的方案就是:
把程序分成一个一个执行单元,前面执行单元执行完毕,后面的执行单元可以直接覆盖前面的;这样一台机器就可以允许超出自己内存的程序;备注: 程序加载只是代码加载,很多代码执行过程中要分配内存,如果机器连加载程序的内存都不够,那肯定是不能执行的!!

10.6 闲置内存空间管理

在管理内存时,我们要知道哪些内存空间已经被使用,哪些内存空间是空闲的;这时操作系统需要对内存空间进行打标签,有2种方案来标识内存空间的使用或者空闲。
  • 位图表示法
给每个分配单元分配一个位(设置1、0)来表示这个单元是否已经被使用或者空闲,1表示被使用,0表示空闲

  • 链表表示法
采用链表的方式来表示内存单元的状态;P是程序,H 是空闲单元,后面的是内存起始地址和单元的大小;所有内存管理也是内存管理机制自己完成,程序只需要调用API 接口完成最基本的读写、析构(释放)即可


位图表示法和链表表示法2种方案各有优缺点,需要时可以自己查资料









0 0
原创粉丝点击