操作系统学习笔记005

3、存储管理

为什么要对内存资源进行管理?
内存时计算机中一种重要的资源,内存容量并不能无限大、速度也不能无限快、也不能永久性的存储数据,价格也并不便宜。正因为这样,所以要合理高效的利用内存的资源。

1、分层存储器体系(memory hierarchy)

在这个体系中,计算机有若干兆(MB)快速、昂贵且易失性的高速缓存(cache),数千兆(GB)速度与价格适中且同样易失性的内存,以及几兆兆(TB)低速、廉价、非易失性的磁盘存储,另外还有诸如DVD和USB等可移动存储装置。操作系统的工作是将这个存储体系抽象为一个有用的模型并管理这个抽象模型。

1.1存储管理器(memory manager)

是操作系统中管理分层存储器体系的部分。(是什么)
任务:有效地管理内存,即记录哪些内存是正在使用的,哪些内存是空闲的;在进程需要时为其分配内存,在进程使用完后释放内存。

由于最底层的高速缓存的管理由硬件来完成,这段内容将集中介绍针对编程人员的内存模型,以及怎样优化管理内存。(编程人员该如何优化内存的管理?)

2、无存储器抽象

最简单的存储器抽象就是根本没有抽象。(如早期的大型计算机早期的小型计算机、都没有存储器抽象。每一个程序都直接访问物理内存。)例如:MOV REGISTER1,1000这个指令执行后,计算机会将位置为1000的物理内存中的内容移到REGISTER1中。

问题:
把物理地址暴露给进程会带来下面几个严重问题:
1、第一,如果用户程序可以寻址内存的每个字节,它们就可以很容易地(故意地或偶然地)破坏操作系统,从而使系统慢慢地停止运行。
2、使用这种模型,想要同时(如果只有一个CPU就轮流执行)运行多个程序是很困难的。

3、 一种存储器抽象:地址空间

什么是地址空间?
是内存的抽象:地址空间。就像进程的概念创造了一类抽象的CPU以运行程序一样,地址空间为程序创造了一种抽象的内存。

我们希望内存中同时存在多个进程,因为我们希望能够同时运行多个进程,例如打开QQ我还希望打开文本编辑器、打开浏览器。而要实现这一点需要解决两个问题:保护和重定位。

地址空间就是为此而生的。比较难的是给每个程序一个自己的地址空间,使得一个程序中的地址28所对应的物理地址与另一个程序中的地址28所对应的物理地址不同。一种方式是使用基址寄存器与界限寄存器。

基址寄存器与界限寄存器
是简单地把每个进程的地址空间映射到物理内存的不同部分。当使用基址寄存器和界限寄存器时,程序装载到内存中连续的空闲位置且装载期间无须重定位,当一个进程运行时,程序的起始物理地址装载到基址寄存器中,程序的长度装载到界限寄存器中。每次一个进程访问内存,取一条指令,读或写一个数据字,CPU硬件会在把地址发送到内存总线前,自动把基址值加到进程发出的地址值上。同时,它检查程序提供的地址是否等于或大于界限寄存器里的值。如果访问的地址超过了界限,会产生错误并中止访问。

这种方式的优缺点:
优点:1、方法简单。2只有操作系统可以修改它们
缺点:每次访问内存都需要进行加法和比较运算。比较可以做得很快,但是加法由于进位传递时间的问题,在没有使用特殊电路的情况下会显得很慢。

4、交换技术

为什么需要交换技术?内存的空间有限,无法保存所有的进程。例如:例如,当一个Windows应用程序安装后,通常会发出一系列命令,使得在此后的系统引导中会启动一个仅仅用于查看该应用程序更新的进程。这样一个进程会轻易地占据5~10MB的内存。其他后台进程还会查看所收到的邮件和进来的网络连接,以及其他很多诸如此类的任务。并且,这一切都发生在第一个用户程序启动之前。当前重要的应用程序能轻易地占据50~200MB甚至更多的空间。因此,把所有进程一直保存在内存中需要巨大的内存,如果内存不够,就做不到这一点。

处理内存超载的两种通用方法:
1)交换(swapping)技术:即把一个进程完整调入内存,使该进程运行一段时间,然后把它存回磁盘。空闲进程主要存储在磁盘上,所以当它们不运行时就不会占用内存(尽管它们的一些进程会周期性地被唤醒以完成相关工作,然后就又进入睡眠状态)。
2)虚拟内存(virtual memory),该策略甚至能使程序在只有一部分被调入内存的情况下运行。(重要)

5、空闲内存管理

在动态分配内存时,操作系统必须对其进行管理。一般而言,有两种方式跟踪内存使用情况:位图和空闲链表。

1.使用位图的存储管理:

内存可能被划分成小到几个字或大到几千字节的分配单元。每个分配单元对应于位图中的一位,0表示空闲,1表示占用(或者相反)。
分配单元的大小是一个重要的设计因素。分配单元越小,位图越大。
在这里插入图片描述
使用位图跟踪内存使用情况的优缺点:
优点:利用一块固定大小的内存区就能对内存使用情况进行记录。
缺点:在分配内存时得先遍历位图,这会消耗大量的时间。(因为位图中0表示着内存中对应位置是可用的占用10个分配单元的进程就需要在位图中10个连续的0,这是非常耗时的操作。)

2、使用链表的存储管理

通过维护一个记录已分配内存段和空闲内存段的链表,来记录内存的使用情况。其中链表中的一个结点或者包含一个进程,或者是两个进程间的一个空的空闲区。

结点的结构:
链表中的每一个结点都包含以下域:空闲区(H)或进程(P)的指示标志、起始地址、长度和指向下一结点的指针。

在这里插入图片描述

当按照地址顺序在链表中存放进程和空闲区时,有几种算法可以用来为创建的进程(或从磁盘换入的已存在的进程)分配内存。
1)首次适配(first fit)算法。
2)首次适配(first fit)算法。
3)最佳适配(best fit)算法。
4)最差适配(worst fit)算法。
5)快速适配(quick fit)算法。

6、虚拟内存

前言:尽管基址寄存器和界限寄存器可以用于创建地址空间的抽象,还有另一个问题需要解决:管理软件的(bloatware)。虽然存储器容量增长快速,但是软件大小的增长更快。(也就是说现在的进程已经可以大到连整个内存都存不下)这一发展的结果是,需要运行的程序往往大到内存无法容纳,而且必然需要系统能够支持多个程序同时运行,即使内存可以满足其中单独一个程序的需要,但总体来看,它们仍然超出了内存大小。

虚拟内存的基本思想是:每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块称作一页或页面(page)。每一页有连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。

虚拟内存是对基址寄存器和界限寄存器的一种综合。8088为正文和数据分离出专门的基址寄存器(但不包括界限寄存器)。而虚拟内存使得整个地址空间可以用相对较小的单元映射到物理内存,而不是为正文段和数据段分别进行重定位。

虚拟内存很适合在多道程序设计系统中使用,许多程序的片段同时保存在内存中。当一个程序等待它的一部分读入内存时,可以把CPU交给另一个进程使用。

5.1分页

在使用虚拟内存的情况下,虚拟地址不是被直接送到内存总线上,而是被送到内存管理单元(Memory Management Unit,MMU),MMU把虚拟地址映射为物理内存地。虚拟地址空间按照固定大小划分成称为页面(page)的若干单元。在物理内存中对应的单元称为页框(page frame)。页面和页框的大小通常是一样的。RAM和磁盘之间的交换总是以整个页面为单元进行的。
在这里插入图片描述
在这里插入图片描述
MMU注意到该页面没有被映射(在图中用叉号表示),于是使CPU陷入到操作系统,这个陷阱称为缺页中断(page
fault)。操作系统找到一个很少使用的页框且把它的内容写入磁盘(如果它不在磁盘上)。随后把需要访问
的页面读到刚才回收的页框中,修改映射关系,然后重新启动引起陷阱的指令。

MMU使用页表来完成虚拟内存到物理内存的映射
(画了一张好看点的图)
在这里插入图片描述

5.2页表

页表的目的是把虚拟页面映射为页框。
页表项(注意看 是页表项是页表项就是页表中的被分成一段一段的那个东西)的结构:页表项的结构是与机器密切相关的,但不同机器的页表项存储的信息都大致相同。
在这里插入图片描述
最重要的域是页框号。毕竟页映射的目的是找到这个值,其次是“在/不在”位,这一位是1时表示该表项是有效的,可以使用;如果是0,则表示该表项对应的虚拟页面现在不在内存中,访问该页面会引起一个缺页中断。“保护”(protection)位指出一个页允许什么类型的访问。最简单的形式是这个域只有一位,0表示读/写,1表示只读。一个更先进的方法是使用三位,各位分别对应是否启用读、写、执行该页面。
为了记录页面的使用状况,引入了“修改”(modified)位和“访问”(referenced)位。在写入一页时由硬件自动设置修改位。该位在操作系统重新分配页框时是非常有用的。如果一个页面已经被修改过(即它是“脏”的),则必须把它写回磁盘。如果一个页面没有被修改过(即它是“干净”的),则只简单地把它丢弃就可以了,因为它在磁盘上的副本仍然是有效的。这一位有时也被称为脏位(dirty bit),因为它反映了该页面的状态。不论是读还是写,系统都会在该页面被访问时设置访问位。它的值被用来帮助操作系统在发生缺页中断,时选择要被淘汰的页面。不再使用的页面要比正在使用的页面更适合淘汰。这一位在即将讨论的很多页面置换算法中都会起到重要的作用。最后一位用于禁止该页面被高速缓存。对那些映射到设备寄存器而不是常规内存的页面而言,这个特性是非常重要的。假如操作系统正在紧张地循环等待某个I/O设备对它刚发出的命令作出响应,保证硬件是不断地从设备中读取数据而不是访问一个旧的被高速缓存的副本是非常重要的。通过这一位可以禁止高速缓存。具有独立的I/O空间而不使用内存映射I/O的机器不需要这一位。

注意:虚拟内存本质上是用来创造一个新的抽象概念——地址空间,这个概念是对物理内存的抽象,类似于进程是对物理机器(CPU)的抽象。虚拟内存的实现,是将虚拟地址空间分解成页,并将每一页映射到物理内存的某个页框或者(暂时)解除映射。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值