操作系统——内存管理

1. 内存管理

计算机的作用就是执行程序,而程序是则指令和数据的集合,我们肯定需要把他存放在一个位置,即内存。就像JVM虚拟机一样有自己的内存分配和回收,计算机的内存也有多种内存管理方案。

计算机执行程序的大致过程,就是先从内存中读取指令,接着被CPU解码,然后根据需要从内存中读取操作数,执行完指令后可能写回内存。在这个过程中从可以发现需要从内存中读取程序的指令和操作数,这个过程是怎么实现的呢?

1.1 地址绑定

以下为用户程序的大致执行过程

通常将指令和数据绑定到内存地址有以下几种情况:

  1. 编译时:编译时就知道进程将在内存中的驻留地址,可以生成绝对代码。若发生变化,必须重新编译
  2. 加载时:即地址绑定会延迟到加载时进行
  3. 运行时:程序可以在运行时从一个内存段移到另一个内存段,且需要特定的硬件辅助完成,而绝大多数操作系统采用这种方式

1.2 交换技术

在分时系统中,用户的进程比内存能容纳的数量要多,这就需要在磁盘上保存那些内存放不下的进程。在需要运行这些进程时,再将它们装入内存。进程从内存移到磁盘并再移动回内存称为交换。交换技术是进程在内存与外存之间的动态调度,是由操作系统控制的。

注意通常一个交换出的进程需要交换回它原来所占有的内存空间的。这一限制是由程序的地址绑定方式实现的。编译和加载是肯定不行的,运行是可以的!

交换技术的缺点:
由于交换时需要花费大量的CPU时间,这将影响对用户的响应时间,因此,减少交换的信息量是交换技术的关键问题。

1.3 连续内存分配

连续分配方式是指为一个用户程序分配一个连续的内存空间,连续分配方式有单一连续分配,固定分区分配和动态分区分配。

  1. 单一连续分配
    内存在此方式下分为系统区和用户区,系统区仅供操作系统使用,通常在低地址部分;用户区是为用户提供的,除系统区以外的内存区域,*这种方式无须进行内存保护,因为内存中只存在一道用户程序,(在任何时间,用户区域中最多只有一个任务),不会因为访问越界而干扰其它程序。 *

     - 优点是没有外部碎片,分配方式简单,可以采用覆盖技术,不需要其它的技术支持。
     - 缺点是只能用于单用户,单任务的操作系统中,有内部碎片,内存的利用率低,灵活性低(要求程序的存储空间小于等于内存可用空间,否则不能使用覆盖技术),周转时间长(必须等内存中的作业执行完毕,下一个任务才能进入内存并执行)。
  2. 固定分区分配
    固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间分成若干大小固定的区域。每个分区只放入一道作业,当有空闲分区时,便可再从当前队列中选出一个作业进入。

     固定分区是可用于多道程序设计的最简单的分配存储,无外部碎片,但是存在内部碎片,而且也是较为严重,并且不能实现多个进程共享一个内存区,所以存储效率低,不被现在的操作系统所通用。但是在某些操作系统控制多个相同对象时发挥重要作用。
  3. 动态分区分配
    动态分区分配又称可变分区分配,是一种动态划分内存的分区方法,它并不预先的分配好内存空间,而是在程序装入时,根据程序的大小为其分配正好合适的内存空间来满足程序的需要,因此,系统分区的大小和数目是可变的。

    在进程装入或换入内存时,若内存中有多个足够大的内存块时,则操作系统必须确定为该进程分配哪个内存块,即以下四点内存分配策略:
    首次适应算法(First fit)
    按空闲分区依地址递增次序链接,分配内存时按顺序查找,放入第一个匹配到的空闲分区,会造成内部碎片,有着较大的浪费
    最佳适应算法(Best fit)
    将空闲分区按内存大小递增的顺序链接起来,分配内存时按照顺序放入第一个匹配的空闲分区。
    最坏适应算法(Worst fit)
    将空闲分区按容量递减的顺序链接起来,分配内存时放入第一个匹配的空闲分区,即最大的分区,造成内部碎片

操作系统——内存管理
动态分区在开始分配是很好的,但随着为进程不断的分配和释放内存空间,会产生越来越多的内存碎片,内存的利用率随之降低,这些小的内存块被称之为外部碎片,这些外部碎片可以通过紧凑技术来解决,即操作系统通过不断地对进程进行移动和整,但是这种操作需要动态重定位寄存器的支持,且相对比较费时

1.4 非连续内存分配

推荐阅读博文:c.biancheng.net/cpp/html/2611.html

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!