操作系统存储管理

    任何的程序指令必须先装入内存。当用户提出主存空间的要求时,应该要能快速响应。并且为它分配相应的内存空间。然后,当用户使用完毕后,应该立即回收其存储空间,以供其他用户使用。

    下面这篇文章就是我总结的存储管理需要知道的一些基本知识。最重要的一部分是【实现内存空间的分配和回收】,这也是操作系统存储管理的核心。

    下面先来看一张简单的图:

    所以存储管理的功能主要包括下面三个部分:

    1. 建立内存分配登记表,记录哪些已经被分配,哪些没有被分配
    2. 实施分配内存,当有作业提出要求时,按照一定的原则分配,并且要修改一说的内存分配登记表
    3. 内存回收,由操作系统的内存管理程序负责回收资源,并修改相应内存分配登记表

    地址转换

    用户装入主存之前是逻辑地址,装入之后是物理地址。要有相应的硬件机构配合,将物理地址转换成物理地址。

    逻辑地址和逻辑空间

    地址空间:一个程序限定的地址范围。

    源程序经过汇编或者编译后,形成目标程序,每个目标程序都是以0为基址顺序进行编制的。这样生成的目标程序就会占据一定空间。成为作业的逻辑空间。

    物理地址与物理空间

    内存以字节为编址空间。分别由0,1,2….这样编号。这个唯一的编号就是内存单元中的物理地址。可以直接通过这个编号寻址

    一个编译好的程序在自己的逻辑空间中。运行时,要把它装入内存空间。在多道程序中,每个用户不可能用内存的物理地址来编写程序。我们需要一种存储管理机制提供地址映射功能将用户程序中的逻辑地址转换成运行时机器可以直接寻址的物理地址。这个功能叫做地址映射或者地址重定位


    地址重定位方式

    静态地址重定位

    静态重定位是在程序装入过程中,由操作系统的重定位装入程序一次完成作业的地址转换过程。以后不再转换。即直接修改指令中的地址代码,把这些地址代码从逻辑转换成物理。

    静态地址重定位优点
    1. 由于在程序执行前就完成了地址转换,所以执行速度快。
    2. 地址转换方法无需硬件支持,在硬件中容易实现。
    静态地址重定位缺点
    1. 程序一旦经过转换后,其占用的存储空间就不能变了,所以静态地址重定位不能再内存中移动。
    2. 程序必须分配连续的存储空间,不能把程序放在若干个不连续的区域中,这些不利于存储空间的充分利用。
    3. 程序中涉及的所有要转换地址的指令,不管程序运行过程是否会执行到,都必须转换。这就有可能有些指令实施了转换,但根本不会执行。因此做了不必要的工作。
    4. 程序共享不方便,用户必须事先确定所需的存储量,若所需的存储量超过可用的存储空间,用户必须覆盖结构。

    动态地址重定位

    动态地址重定位的作业是在装入时,不进行地址转换,而是直接把作业装到分配的主存区域中,执行过程中再进行地址重定位。

    这个过程中需要重定位寄存器(硬件支持),它用来存放用户作业装入主存空间的起始地址。

    在程序执行过程中,执行到访问内存指令的时候,并不立即把指令中的地址码送到地址总线,而是先经过动态地址重定位机制,由地址转换硬件逻辑自动把指令中的相对地址码与定位寄存器的值相加,形成物理地址码,然后把这个地址码送到地址总线,以此来实现对内存存储单元的访问。这个过程中,动态地址重定位的过程是在执行访问内存指令时,由硬件机制自动完成地址转换的。所以对程序执行的速度没有太大影响。

    这个过程中,可以看到,执行前或者执行中代码没有任何变化。所以也可以实现内存的移动,对后面内存碎片提供了技术支持。

    并且也可以在互补连续的内存空间,只要各程序段有自己对应的重定位寄存器,有利于内存资源的充分利用和共享。

    缺点就是硬件支持需要,系统开销大,实现村粗管理的软件比较复杂。


    存储保护

    在多道系统中,内存中的许多用户或系统程序和数据段可以提供不同的用户进程共享。这样会提高内存的利用率。但是,我们也需要限制各个进程只在自己的存储区活动。除了共享的以外,各进程不能对别人的进程的程序和数据段产生干扰和破坏,因此必须对内存中的程序和数据段采用存储保护措施。

    主要是两方面:

    1. 防止地址越界(上,下界存储保护和基址限长)
    2. 存取权限控制(每个进程都有自己的访问权限)

    存储扩充

    多个程序同时在系统中运行,往往受内存容量的限制。使得有些大程序不能装入系统运行,或者只能装入很少的程序。解决办法可能有下面两种:

    从硬件上:增加内存芯片的数量
    从软件上:虚拟存储器,实现逻辑上的扩充


    分区存储管理

    分区存储管理是多道程序运行环境中最简单的存储管理方法,基本思想就是讲内存划分为若干个连续区域,成为分区。每个分区只放一个程序

    单一连续分配方案

    一段时间内,只能有一个进程在内存的用户可用区。内存空间中,只有一道用户进程。这一般由单道系统采用。

    固定分区

    在作业未进入内存之前,就由操作员吧内存划分为若干个固定存储区。除操作系统占用一个区域外,其他的为用户共享。分区一旦划分,就不可以变。由于一个分区只存放一个进程,所以系统可以同时运行的最大进程道数就是内存分区的大小。通常采用静态地址重定位。注意这个每个分区的大小可以不同。
    固定分区表,分区的分配,分区的回收。这是要做的主要工作。缺点也很明显。严重浪费,碎片大,影响内存利用率。

    可变分区管理

    内存中除了操作系统的区域外,对内存剩余空间预先不划分分区,初始构成一个大的空闲去。当作业装入时,根据作业的大小,在内存的空闲区划分出一个连续的存储区域。作为分区分配给给作业使用。这里面涉及到碎片问题,还有移动和覆盖。

    这里面主要要有:建立空闲区表,内存分配,可变分区的回收,地址转换和存储保护。

    内存分配中又涉及到三种方法:最先适应算法,最佳适应算法,最坏适应算法。

    最先适应算法(nrst-fit):按分区在内存的先后次序从头查找,找到符合要求的第一个分区进行分配。该算法的分配和释放的时间性能较好,较大的空闲分区可以被保留在内存高端。但随着低端分区不断划分会产生较多小分区,每次分配时查找时间开销便会增大。

    最佳适应算法(best-fit):按分区在内存的先后次序从头查找,找到其大小与要求相差最小的空闲分区进行分配。从个别来看,外碎片较小;但从整体来看,会形成较多外碎片优点是较大的空闲分区可以被保留。

    最坏适应算法(worst- fit):按分区在内存的先后次序从头查找,找到最大的空闲分区进行分配。基本不留下小空闲分区,不易形成外碎片。但由于较大的空闲分区不被保留,当对内存需求较大的进程需要运行时,其要求不易被满足。

    ncfp3


    页式存储管理

    将进程分配在不连续但大小先疼痛的存储区域中,实现内存见缝插针的分配,同时又保证进程的连续执行。页式技术包括:先把内存空间分块,再把用户程序逻辑空间分页,再以页为单位分配内存。

    具体步骤

    1. 等分内存

      页式存储管理将内存空间划分成等长的若干区域
      每个区域的大小一般取2的整数幂,称为一个物理页面有时称为块。
      内存的所有物理页面从0开始编号,称作物理页号。

    2. 逻辑地址

      系统将程序的逻辑空间按照同样大小也划分成若干页面,称为逻辑页面也称为页。
      程序的各个逻辑页面从0开始依次编号,称作逻辑页号或相对页号。
      每个页面内从0开始编址,称为页内地址。程序中的逻辑地址由两部分组成:页号和页内位移

    3. 内存分配

      系统可用一张“位示图”来登记内存中各块的分配情况,存储分配时以页面(块)为单位,并按程序的页数多少进行分配。
      相邻的页面在内存中不一定相邻,即分配给程序的内存块之间不一定连续。

      程序地址空间的分页是系统自动进行的,即对用户是透明的
      由于页面尺寸为2的整数次幂,故相对地址中的高位部分即为页号,低位部分为页内地址。


    实现原理

    1.页表

    系统为每个进程建立一张页表,用于记录进程逻辑页面与内存物理页面之间的对应关系。地址空间有多少页,该页表里就登记多少行,且按逻辑页的顺序排列。

    2.地址映射过程

    页式存储管理采用动态重定位,即在程序的执行过程中完成地址转换。处理器每执行一条指令,就将指令中的逻辑地址(p,d)取来从中得到逻辑页号(p),硬件机构按此页号查页表,得到内存的块号B’,便形成绝对地址(B’,d),处理器即按此地址访问主存。

    3.页面的共享与保护

    当多个不同进程中需要有相同页面信息时,可以在主存中只保留一个副本,只要让这些进程各自的有关项中指向内存同一块号即可。同时在页表中设置相应的“存取权限”,对不同进程的访问权限进行各种必要的限制


    页式管理方式的优点

    没有外碎片,程序不必连续存放,便于改变程序占用空间的大小。

    页式管理方式的缺点

    要求程序全部装入内存,没有足够的内存,程序就不能执行。

    除了页式存储管理,还有段式存储管理。


    覆盖和交换技术

    覆盖技术

    引入覆盖 (overlay)技术的目标是在较小的可用内存中运行较大的程序。这种技术常用于多道程序系统之中,与分区式存储管理配合使用。

    覆盖技术的原理:一个程序的几个代码段或数据段,按照时间先后来占用公共的内存空间。将程序必要部分(常用功能)的代码和数据常驻内存;可选部分(不常用功能)平时存放在外存(覆盖文件)中,在需要时才装入内存。不存在调用关系的模块不必同时装入到内存,从而可以相互覆盖

    覆盖技术的缺点是编程时必须划分程序模块和确定程序模块之间的覆盖关系,增加编程复杂度;从外存装入覆盖文件,以时间延长换取空间节省。


    交换技术

    交换 (swapping)技术在多个程序并发执行时,可以将暂时不能执行的程序(进程)送到外存中,从而获得空闲内存空间来装入新程序(进程),或读人保存在外存中而处于就绪状态的程序。交换单位为整个进程的地址空间。交换技术常用于多道程序系统或小型分时系统中,因为这些系统大多采用分区存储管理方式。与分区式存储管理配合使用又称作“对换”或“滚进/滚出” (roll-in/roll-out)。

    原理:暂停执行内存中的进程,将整个进程的地址空间保存到外存的交换区中(换出swap out),而将外存中由阻塞变为就绪的进程的地址空间读入到内存中,并将该进程送到就绪队列(换入swap in)。


    两者比较

    交换花费大量内,外存交换时间。两者都实现了大作业在小内存上运行。

    覆盖于与换技术的区别:

    a. 覆盖由用户解决空间不足问题(即:覆盖只能在一个程序内部进行)

    b. 交换由系统解决空间不足问题(即:交换可以在任意程序间进行)

    c. 覆盖对程序结构有严格的限制,交换对程序结构没有限制(这也是由于a,b的原因)


    虚拟存储器

    什么是虚拟存储器

    当代计算机系统的主存主要由半导体存储器组成,由于工艺和成本的原因,主存的容量受到限制。然而,计算机系统软件和应用软件的功能不断增强,程序规模迅速扩大,要求主存的容量越大越好,这就产生了矛盾。为了给大的程序提供方便,使它们摆脱主存容量的限制,可以由操作系统把主存和辅存这两级存储系统管理起来,实现自动覆盖。

    一个大作业在执行时,其一部分地址空间在主存,另一部分在辅存,当所访问的信息不在主存时,则由操作系统而不是程序员来安排I/O指令,把信息从辅存调入主存。从效果上来看,好像为用户提供了一个存储容量比实际主存大得多的存储器,用户无需考虑所编程序在主存中是否放得下或放在什么位置等问题。我们称这种存储器为虚拟存储器。

    虚拟存储器只是一个容量非常大的存储器的逻辑模型,不是任何实际的物理存储器。它借助于磁盘等辅助存储器来扩大主存容量,使之为更大或更多的程序所使用。虚拟存储器指的是主存-外存层次,它以透明的方式为用户提供了一个比实际主存空间大得多的程序地址空间。

    物理地址是实际的主存单元地址,由CPU地址引脚送出,是用于访问主存的。设CPU地址总线的宽度为m位,则物理地址空间的大小就是2m。

    虚拟地址是用户编程时使用的地址,由编译程序生成,是程序的逻辑地址,其地址空间的大小受到辅助存储器容量的限制。显然,虚拟地址要比实际地址大得多。程序的逻辑地址空间称为虚拟地址空间。


    判断过程

    程序运行时,CPU以虚拟地址来访问主存,由辅助硬件找出虚拟地址和实际地址之间的对应关系,并判断这个虚拟地址指示的存储单元内容是否已装入主存。如果已在主存中,则通过地址变换,CPU可直接访问主存的实际单元;如果不在主存中,则把包含这个字的一个存储块调入主存后再由CPU访问。如果主存已满,则由替换算法从主存中将暂不运行的一块调回外存,再从外存调入新的一块到主存。


    总结

    主要是了解了操作系统是怎么进行内存分配的,怎么进行管理进程进入内存的。了解了覆盖和交换技术的区别和联系。了解了分区管理和页式管理的区别。对存储分配和管理有了一点认识。解决了一点点心中的疑惑,本意记录下来方便以后查阅。