第4章-存储管理教案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第11 次课教案
第4章存储管理
4.1 存储管理的功能
一、地址映射
地址映射指的是将用户程序的逻辑地址转换成内存中物理地址的过程。

在一个程序装入到与其地址空间不一致的存储空间时,对有关地址部分的重新调整的过程称为地址的重定位。

这个调整过程就是把程序地址空间中使用的逻辑地址变换成主存中物理地址的过程。

地址重定位的方式有:静态重定位和动态重定位。

⒈静态重定位
在装入一个作业时,把作业中的指令地址和数据地址全部转换成物理地址,由于地址转换工作是在作业开始执行前集中完成的,所以在执行过程中就不需要再进行地址转换工作,这种转换方式称为“静态重定位”。

静态重定位的优点是实现比较简单,但缺点是需要为用户程序分配连续的内存空间而且程序在内存中不能进行移动。

⒉动态重定位
程序在执行过程中,当需要进行地址转换时,用逻辑地址加上重定位寄存器中的地址就可以得到相对应的物理地址。

这种转换过程是在指令的执行过程中完成的,所以叫动态重定位。

动态重定位方式的优点是用户作业不要求分配连续的存储空间,并且用户作业在执行过程中,可以动态申请存储空间和在主存中移动,只需要更改重定位寄存器中的内容即可。

这样便于多个进程共享同一个程序的副本。

但缺点是代价大,需要附加的硬件地址变换机构来实现,并且实现地址转换的算法比较复杂。

二、内存的分配与回收
存储分配方式主要有以下两种:
⒈静态分配
⒉动态分配
三、存储信息的保护
⒈防止地址越界
每个进程都有自己独立的内存空间,如果一个进程在运行时所产生的地址在其地址空间之外,则发生地址越界。

一般是通过界限寄存器来实现防止地址越界的存储保护,界限寄存器是被广泛
使用的一种存储保护技术,机制比较简单,易于实现。

⒉防止操作越权
防止操作越权主要是针对多个进程所共享的区域进行保护的一种方式。

对于允许多个进程共享的存储区域,每个进程都有自己的访问权限。

如果一个进程对共享区域的访问违反了权限规定,则发生操作越权。

四、虚拟存储器
虚拟存储技术是将内存和外部存储器结合起来,只将进程的一部分放入内存,其余部分保留在辅存里,当执行到要访问的信息不在内存中时,再将这部分内容调到内存中。

虚拟存储技术不需要用户去考虑内、外存的问题,一切由操作系统和硬件相配合来完成主机和外围联机存储器之间信息的动态调度。

这样计算机系统好像为用户提供了一个其存储容量比实际主存大得多的存储器,这个存储器称为虚拟存储器。

虽然虚拟存储器是为了解决主存容量不够用而提出的,但实质上是解决了程序访问地址和主存的可用地址相脱离的问题。

实现虚拟存储器,需要有一定的物质基础。

其一是需要有相当容量的辅存,以便足以存放多用户的作业地址空间。

其二是要有一定容量的内存。

其三是要有地址变换机构。

然而引进虚存后系统就必须在地址变换上花费开销。

所以设计虚拟存储器时应该在可能的情况下力求地址变换能快速地进行。

4.2 程序的装入与链接(简介)
编译程序
产生的目
标模块
图用户程序的处理步骤
一、程序的装入
⒈绝对装入方式
⒉可重定位装入方式
⒊动态运行时装入方式
二、程序的链接
链接程序的功能是将经过编译或汇编后所得到的一组目标模块以及它们所需要的库函数,装配成一个完整的装入模块。

实现链接的方法有三种:
●静态链接方式(Static Linking)
●装入时动态链接(Load-time Dynamic Linking)
●运行时动态链接(Run-time Dynamic Linking)
第12 次课教案
4.3 连续分配存储管理方式
连续存储管理分配方式是指为一个用户程序分配一个连续的内存空间。

连续分配方式主要有两种:单一连续分配和分区分配。

一、单一连续分配
该方式是最简单的一种存储管理方式,但只能用于单用户、单任务的操作系统中。

使用这种存储管理方式,内存的用户区被用户程序所独占,即用户区一次只分配给一个作业使用,并且作业一旦进入主存将一直占有主存直到它运行结束才能释放。

二、固定分区分配
固定分区的基本思想是系统预先将内存的用户区划分成若干个连续的区域,每一个区域称为分区。

每个分区中最多只能装入一个作业,且作业也只能在它所驻留的分区中运行。

分区一旦分好,每个分区的大小固定不再变化,且分区的个数也不再改变。

由于分区大小是事先固定的,因而可容纳作业的大小受到限制,而且当用户作业的地址空间小于分区的存储空间时,造成存储空间浪费。

系统将用户区划分成固定大小的分区,一般包含以下两种方法:
⒈分区大小相等
⒉分区大小不等
通过上述分析,无论是分区大小相等和分区大小不等的情况,当我们进行内存分配的时候,将满足条件的分区全部分配给该程序,而往往分区的大小都要大于用户程序的长度,因此,对于很多用户程序实际上只占用了分区的一部分空间,使分区中有一部分空间闲置不用,这实际上影响了主存空间的利用率。

那么就会造成内存浪费的情况,这时当给用户程序分配内存时,余下的不能再利用的空间我们称之为碎片,对于固定分区是在分区内产生碎片,所以称为“内部碎片”。

【例】假设内存大小为256KB,系统事先划分成5个分区,其中一个分区(0-32KB)为操作系统占有,其余4个分区为用户程序使用。

各个分区的容量为16KB、32KB、64KB和112KB。

假设有3个做作业A、B、C请求进入主存,其大小分别为6KB、25KB、32KB,内存分配情况如图所示,其中阴影部分表示各个分区中不能再使用的空闲碎片。

分区说明表
0B
32KB
48KB
80KB
124KB
256KB-1
分区1
分区2
分区3
内存分配情况
三、动态分区分配
动态分区存储管理方式相对于固定分区存储管理方式提高了内存的利用率,更好的适应了用户程序的需要,但是随着用户进程的动态变化,系统经过一系列的内存的分配和回收过程后,在内存中将会出现一些小的空闲区而不能再被使用,这些小的不能再被利用的空闲区将会成为碎片,对于动态分区所产生的碎片是在空闲区外,所以称为“外部碎片”。

动态分区是根据用户程序的实际需要,为其分配一个连续的内存空间。

在实现动态分区存储管理方式时,需要解决以下几个问题:
⑴分区分配所需要的数据结构
⑵分区分配算法
⑶分区的分配和回收
⒈分区分配中的数据结构
⑴空闲分区表
采用动态分区方式管理主存时,主存储器中已占用分区和空闲分区的数目和大小都是在变化的。

为了便于对主存空间的分配和回收,主存分配表可以用两张表格组成,一张“已分配区表”,另一张是“空闲区表”,如表所示。

动态分区表格
(a)已分配表 (b)空闲区表
⑵空闲分区链
头指针
⒉ 分区分配操作
⑴内存分配
设用户请求的大小为u.size ,空闲区的大小为m.size ,分区分配过程如图所示。

分配内存流程图⑵内存回收
可能会出现以下几种情况:
①回收区有下邻接空闲区F2
②回收区有上邻接空闲区F1
③回收区既有上邻接空闲区又有下邻接空闲区
④回收区既无上邻接又无下邻接空闲区
(a) (b) (c) (d)
⒊分区分配算法
⑴首次适应算法
首次适应算法要求空闲分区链按地址递增的顺序排列。

首次适应算法优先利用内存低地址部分的空闲区,从而保留了高地址部分的大
空闲区。

这样当后续到达的一些大的用户作业就可以得到分配,但是该算法对低地
址端频繁进行分割,留下许多难以利用的很小空闲分区,每次查找都要从低地址部
分开始查找,这样增加查找可用空闲分区开销。

⑵最佳适应算法
最佳适应算法的基本思想是当用户作业提出申请内存的请求时,每次分配满足
条件的最小分区给请求者,这时要求空闲分区链按大小递增的顺序排列。

最佳适应算法优先利用了大小与程序要求最接近的空闲区,保留了大空闲区。

但是,最佳适应算法看似最佳,其时不然。

使用此方法当满足用户请求,进行分配
后剩下的空闲区就是最小的,形成难于利用的空间。

随着时间的推移,系统中的小
空闲区会越来越多,从而造成存储区的大量浪费。

⑶最坏适应算法
最坏适应算法是要给用户作业分配满足条件的最大分区,这时要求空闲分区链
按大小递减的顺序排列。

最坏适应算法总是挑选出最大的分区分配给程序。

分配给程序后剩下的空闲区
较大,还能装下其它作业。

但是,使用此算法最大空闲区总是首先被分配并被进行
划分,以后如果有大的作业提出请求,很难满足其要求。

⒋碎片问题
不能供任何用户(或进程)使用的极小的空闲区称为碎片。

碎片的出现造成了存
储空间的浪费。

在分区存储管理方式中,可以采取紧凑技术来解决碎片的问题。

即把所有空闲
区进行拼接形成大的空闲区,以便为该用户使用。

紧凑工作要求大量程序和数据在
内存中移动,虽然可以提高主存的利用率,但是将浪费许多系统资源和CPU的时间,增加了系统的开销。

利用紧凑技术的内存管理一般采用动态重定位。

第14 次课教案
4.4 分页存储管理方式
连续分配存储管理方式会形成许多“碎片”,虽然可以通过“紧凑”的方法将碎片拼接成可用的大块空间,但须为此付出很大开销。

如果能够允许将一个进程直接分散地分配到许多不相邻接的分区中,就不必再进行“紧凑”,基于这一思想产生了离散分配方式。

根据离散分配时所用的基本单位的不同,又可把离散分配方式分为以下三种:
● 分页存储管理 ● 分段存储管理 ● 段页式存储管理
一、基本原理
分页存储管理,是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。

相应地,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框(frame),也同样为它们加以编号,如0#块、1#块等等。

在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。

⒈ 页表
在分页存储管理下,进程的每个页面可以离散的放到内存的任一个物理块中,但是进程就是一个整体,系统必须要保证该进程的正确运行,那么就必须要知道该进程的每一个逻辑页面具体放入内存中哪个对应的物理块。

因此系统为每个进程建立一个数据结构――页表,如图1所示。

0页1页2页……N 页
用户程序
内存
0123456
图1页表结构
⒉ 页面大小的选择
分页存储管理系统中,页面的大小是由硬件地址结构决定的,即是由系统硬件决定的。

对于页面的选择会影响到系统的性能。

如果页面太小,一方面虽然可以使内存碎片减小,从而减少了内存碎片的总空间,有利于提高内存利用率,但另一方
面也会使每个进程占用较多的页面,从而导致进程的页表过长,占用大量内存;此外,还会降低页面换进换出的效率。

然而,如果选择的页面较大,虽然可以减少页表的长度,提高页面换进换出的速度,但又会使页内碎片增大。

因此,页面的大小应选择得适中,并且页面大小应是2的幂,通常为512B~8KB。

⒊分页中的地址结构
在分页存储管理方式下,作业装入内存或进程访问某个逻辑地址中的数据时,由机器硬件将作业的逻辑地址划分为页号P和页内地址W,这是由系统地址结构所决定的,如图2所示。

15 10 9 0
图2逻辑地址结构
按照上述的结构来分,作业的逻辑地址被分为两部分。

假设某系统地址为16位,则按上图的地址结构,两部分的地址长度为16位,0~9位为页内地址,即每页大小为210=1K;10~15位为页号,即地址空间最多允许有26=64个页面。

当给定一个逻辑地址空间中的地址为A时,则A转换为页号P和页内地址W 可按下式求得:
页号P=(int)A/L,页内地址W=A % L(取余)
在分页存储管理方式中,相应的物理地址也可以用两部分来表示:块号和块内地址。

因此,如果已知页号和页内地址,相应的物理地址可以通过下式求得:物理地址=块号*页面大小+页内地址W
【例1】设有一个页式存储管理系统,向用户提供的逻辑地址空间最大为16页,每页2KB,内存总共有8个存储块,试问逻辑地址至少应为多少位?内存空间有多大?
【例2】若进程程序长度为8KB,分页管理系统中的页面大小为2KB,如果该进程的页表如图3所示,求程序中逻辑地址3840和1F01H的物理地址。

图3 页表结构
二、地址转换过程
⒈基本地址变换
图4 分页地址转换过程
4.5 分段存储管理
一、基本原理
分段存储管理的基本思想是将用户程序根据其逻辑意义划分成若干个段,每一段为一组逻辑意义完整的信息集合,每段有自己的名字(为了方便,通常用一个段号来表示),且每一个分段都是首地址为0的连续的一维地址空间。

段的长度由其所包含的逻辑信息的长度所决定,因此,各段的长度可能不等。

例如,一个C语言的程序一般包含有:主程序段main,数据段data,子程序段等等。

分段存储管理方式在进行内存的分配时,以段为单位分配内存,每段分配一个连续的内存区,但各段不要求连续。

⒈段表
段式存储管理为作业的每一段分配一个连续的主存区域,作业的各段可以被装到不相连的几个区域中。

为了能控制作业的正确执行,必须把作业的各段在主存储器中的位置记录下来。

因此,在装入作业时,操作系统为作业建立一张“段表”,段表中主要由段号、段长和段在内存的起始地址等信息组成,如表所示。

段表
⒉分段的地址结构
段式存储管理提供给用户编程时使用的逻辑地址由两部分组成:段号和段内地址,其格式如图
图1逻辑地址结构
当地址结构确定以后,那么允许作业的最多段数及每段的最大长度也就限定了。

假定地址用m位表示,其中段内地址占用了n位。

那么,每个作业最多可分2(m-n)段,每段的最大长度可达2n B。

例如,假设某机器的指定的地址为24位,其中8位表示段号,16位表示段内地址,那么系统允许的最多段数为256个,最大的段长是64KB。

从表面上看,段式存储管理的地址结构与页式存储管理的地址结构类似,但是,它们之间有实质上的不同。

页式存储管理提供连续的逻辑地址,由系统自动地进行分页;段式存储管理中作业的分段是由用户决定的,每段独立编程,因此,段间的逻辑地址是不连续的,所以用户在编写程序时需要明确指出段号和段内地址。

二、地址转换过程
在分段存储管理系统中,实现逻辑地址到物理地址的转换,就是要将二维逻辑地址(段号,段内地址),转换成相应的物理地址,转换过程如图2所示。

为了便于实现地址转换,在系统中设置了段表寄存器,专门用于存放当前进程
的段表起始地址和长度。

进行地址转换时,需要按照以下步骤来完成:
⑴根据段表寄存器的内容可以得到段表的地址。

如果段号大于段表长度,则发生越界中断,否则继续。

⑵找到段表的地址后,根据逻辑地址中的段号,到段表中去查找其对应的段表项。

如果段内地址大于段长度,发生越界中断,否则可以即可以得到该段在内存中的起始地址。

⑶将段内地址和段的起始地址相加得到物理地址。

8K
图2分段地址转换
【例1】在一个段式存储管理系统中,其段表如表所示:
段表
分页和分段管理都是采用离散式的存储管理方法,从地址变换结构上十分类似,但在思想和实现上两者的主要区别如下:
⑴页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,
提高内存的利用率。

或者说,分页仅仅是由于系统管理的需要而不是用户的需要。

段则是信息的逻辑单位,它含有一组其意义相对完整的信息。

分段的目的是为了能更好地满足用户的需要。

⑵页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面;
段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。

⑶分页的地址空间是一维的;分段的地址空间则是二维的,需要给出段名和段内地址。

三、段页式存储管理
程序的分段结构具有逻辑上清晰的优点,但采用段式存储管理的一个致命弱点是每段必须占据主存储器的一个连续区域。

于是,装入一个分段时,可能要移动已经在主存储器中的信息。

为了克服这个缺点,可兼用分段和分页的方法,通常被称为是“段页式存储管理”。

每个作业仍由用户进行分段,每一段的逻辑地址仍是从“0”开始的一组连续地址。

但存储管理不是为每一段分配一个连续的主存空间,而是把每一段再分成若干个页面,把一段的信息按页存放在不必相邻的空闲主存块中。

所以,段页式存储管理兼顾了段式在逻辑上清晰和页式在管理上方便的优点。

段页式存储管理要求把主存储器预先分成大小相等的许多块,在把一段的信息装入主存时,按块的大小分页,一段信息可被分散存放在若干个主存块中。

段页式存储管理为了保证程序的正确运行,为每一个装入主存储器的作业建立一张段表,且对每一段要建立一张页表。

段表的长度由作业分段的个数决定,段表中的每一个表目指出本段的页表始址和长度。

页表的长度由对应段所分的页的个数决定,页表中的每一个表目指出本段的逻辑页号与主存块号的对应关系。

因此,段页式存储管理的逻辑地址的格式如图3所示:
段号页号页内地址
图3 逻辑地址结构
段页式存储管理方式中,当执行某条指令时,地址机构根据逻辑地址中的段号查找段表,得到该段的页表始址,然后根据页号查找页表,得到对应的主存块号,由主存块号与逻辑地址中的页内地址可形成可访问的绝对地址。

如果逻辑地址中的段号超出了段表中的最大段号或者页号超出了该段页表中的最大页号,都将产生“越界中断”。

第16 次课教案
-----WORD格式--可编辑--专业资料-----
4.6 虚拟存储器
一、虚拟存储器的基本概念
基于局部性原理,在程序装入时,不必将其全部读入到内存,而只要将当前需要执行的部分页或段读入内存,就可以让程序开始执行。

在程序执行过程中,如果需要执行的指令或访问的数据不在内存,则由处理机通知操作系统将相应的页或段调入到内存,然后继续执行程序。

另一方面,操作系统会将内存中暂时不使用的页或段调出,保存在外存上,从而腾出空间存放将要装入的程序以及将要调入的页或段。

从用户的角度看,该系统具有的内存容量将比实际的内存容量大得多,所以称之为虚拟存储器。

虚拟存储器是指具有请求调入功能和置换功能,能从逻辑上对内存容量进行扩充的一种存储器系统。

其逻辑容量是由内存容量和外存容量之和所决定的。

二、请求分页存储管理方式
请求分页存储管理是在页式存储管理方式的基础下,增加了请求调页功能、页面置换功能的虚拟存储管理系统。

在进程开始运行之前,不是装入全部页面,而是装入部分页面,之后根据进程运行的需要,动态装入其它页面;当内存空间已满,而又需要装入新的页面时,则根据某种算法淘汰某个页面,以便装入新的页面。

在请求分页存储管理中进行地址重定位时,可能会出现所需要的页面不在主存的情况,此时,系统必须解决以下两个问题:
⑴当程序要访问的某页不在内存时,如何发现这种缺页情况?发现后应如何处理?
⑵当需要把外存上的某个页面调入内存时,此时内存中没有空闲块应该怎么办?
⒈页表
在请求分页存储管理系统中主要的数据结构还是页表。

其主要的作用是将用户的逻辑地址变成内存的物理地址。

由于只是将部分的页调入内存,还有一部分在外存中,而程序是作为一个整体在运行,为了保证程序的正确运行,对页表进行了扩充,增加了状态位、访问字段、修改位和外存地址。

请求分页存储管理的页表如图1所示:
图1 页表结构
⑴状态位P:表示该页是否已经调入内存。

⑵访问字段A:用于记录该页在一段时间内被访问的次数或是最近未被访问的次数,作为页面置换算法的依据。

⑶修改位M:表示该页在内存中是否被修改过,如果未修改过,在置换页面时如果被选中则不需要将该页再写回到外存上;如果被修改过则在置换时需要将其再写回到外存上以保证内外存的版本一致。

⑷外存地址:指示该页在外存的地址,为调用提供依据。

⒉缺页中断
在请求分页存储管理系统中只是将部分页放入到内存中,如果在进程的执行过程中,发现所要访问的页不在内存,则产生缺页中断。

操作系统接到此中断信号后,就调出缺页中断处理程序,根据页表中给出的外存地址,将该页调入内存,使作业继续运行下去。

如果内存中有空闲块,则分配一块,将新调入的页装入内存,并修改页表中相应页表项的驻留位及相应的内存块号。

若此时内存中没有空闲块,则要淘汰某页,若该页在内存期间被修改过,则要将其写回到外存。

相关文档
最新文档