三、内存管理

考试大纲

(一)内存管理基础

1.内存管理概念

  • 程序装入与链接;
  • 逻辑地址与物理地址空间;
  • 内存保护。

2.连续分配管理方式
3.非连续分配管理方式

  • 分页管理方式;
  • 分段管理方式;
  • 段页式管理方式。

(二)虚拟内存管理

1.虚拟内存基本概念
2.请求分页管理方式
3.页面置换算法
最佳置换算法(OPT);
先进先出置换算法(FIFO);
最近最少使用置换算法(LRU);
时钟置换算法(CLOCK)。
4.页面分配策略
5.工作集
6.抖动

核心考点

1.(★★)程序执行的完整过程(包括编译、链接、装入执行),静态装入与动态装入,物理地址与逻辑地址,交换与覆盖。
2.(★★★)连续内存分配方式与3种非连续内存分配方式(分页、分段、段页式),内部碎片与外部碎片,段式与页式分配的区别。
3.(★★★★)分页管理方式中的逻辑地址结构、页表、访存过程以及访存有效时间,快表与多级页表。
4.(★★★)虚拟内存与3种虚拟内存管理方式(请求分页、请求分段、请求段页式),每种方式的特点及其之间的区别。
5.(★★★★)请求分页管理方式中的逻辑地址结构、页表结构、访存过程、访存有效时间以及常见的几种页面置换算法。

WD3.1.6

一、单项选择题
1.【2011统考真题】在虚拟内存管理中,地址变换机构将逻辑地址变换为物理地址,形成该逻辑地址的阶段是()
A.编辑 C.链接 B.编译 D.装载

5.【2009统考真题】分区分配内存管理方式的主要保护措施是()
A.界地址保护 B.程序代码保护 C.数据保护 D.栈保护

6.【2010统考真题】某基于动态分区存储管理的计算机,其主存容量为55MB(初始为空),采用最佳适配(Best Fit)算法,分配和释放的顺序为:分配15MB,分配30MB,释放15MB,分配8MB,分配6MB,此时主存中最大空闲分区的大小是()。
A.7MB B.9MB C.10MB D.15MB

-内存的基础知识

■计算机体系结构/内存层次

■计算机体系结构

对于计算机系统来讲,它的体系结构当中就约定了我哪些地方可以来存数据,然后在存数据的这些地方,既包括CPU里的寄存器也包括内存和外存,这几种不同的存储介质,它的容量速度价格都是不一样的,为了组织一个合理的系统,我们把计算机系统当中的存储组织成了一个层次结构,针对这种层次结构下的存储单元,操作系统需要对它进行管理。
操作系统当中的存储管理实际上就是用来管理这些存储介质的。
最基本的管理要求是说,我们一个进程需要使用存储单元的时候,需要从操作系统分一块给它,等它不用的时候还给操作系统,这是它最基本的分配和释放的管理要求
针对这种内存管理的要求,我们来看系统结构当中有哪些因素对它有影响?
计算机系统包括CPU,内存和I/O设备,CPU在加电的时候,我们关心各个寄存器的初始状态。讲存储的时候会更多关注与存储相关的内容。
比如说在CPU里头,我们可以往寄存器存内容,寄存器可以存数据,但是寄存器它的容量是非常小的,通常是32位64位的寄存器,能存几十到几百字节。

在这里插入图片描述

内存是更多的存数据的地方,它的最小访问单位是字节也就是8bit,而通常我们所说的计算机系统是32位的总线,那所谓32位总线也就相当于我一次读写,可以从内存当中读或者写32位,也就是4字节,这样一来我们读写的速度就会快了,你在由于一次读写32位的有地址对齐的事,所以在访问的时候就不能从任意地方开始一个4字节,有可能这个读写就会被分成两次。
还有一个是说我们在CPU里头你还会看到高速缓存,在你进行读写指令或者指令执行过程中访问数据都需要从内存里读数据,这个时候如果说我有大量数据要读写而且我会重复利用的话,我在CPU里加上高速缓存,那这样的话它的读写速度会更快,这个时候整个读写效率会提高,所以在CPU里加了高速缓存。
这几个部分都对我们存储管理有至关重要的影响

■内存层次

在CPU里头有两级缓存,这两级缓存,我们如果说你在读写数据或者指令的时候,在缓存里已经有相应的内容,事先已经读过,那这个时候我就直接可以从缓存里拿到
然后说如果在这里头缓存不命中,那这个时候你就必须上内存里去读,写程序的时候你是感觉不到L1 L2 cash的存在的,原因在于这部分完全是由硬件在做控制,你写的程序不能显示的使用到它们。而内存的访问就需要使用到操作系统的控制
在内存里访问的时候仍然找不到,还有可能去外存里找,外存的读取就需要使用到操作系统的控制
从CPU内部一直到硬盘外部
存储器的层次结构
通用计算机,存储层次至少应具有三级:最高层为CPU存储器,中间为主存,最底层是辅存
高档计算机根据具体功能划分寄存器,高速缓存,主存,磁盘缓存,磁盘,可移动存储介质6层

CPU存储器寄存器
主存高速缓存
主存
磁盘缓存
辅存磁盘
可移动存储介质

计算机系统存储层次中,寄存器和主存储器又被称为可执行存储器
主存储器
(简称内存或主存)用于保存进程运行时的程序和数据,也称可执行存储器
为缓和主存储器的访问速度远低于CPU执行指令的速度矛盾,引入寄存器和高速缓存
寄存器
寄存器访问速度最快,价格昂贵,容量不大
高速缓存
容量大于寄存器,比内存小几十KB~几MB;访问速度快于主存储器;存放CPU在当前一小段时间内多次使用的程序和数据
根据程序执行的局部性原理即程序在执行时将呈现出局部性规律,在一较短的时间内,程序的执行仅局限于某个部分,将主存中一些经常访问的信息存放在高速缓存中,减少访问主存储器的次数,提高程序执行速度
磁盘缓存
磁盘的I/O速度远低于对主存的访问速度,将频繁使用的一部分磁盘数据和信息,暂时存放在磁盘缓存中,可减少访问磁盘的次数

1.内存及作用【存储单元,内存地址,按字(节)编址】

内存可存放数据。程序执行前需要先放到内存中才能被CPU处理——缓和CPU与硬盘之间的速度矛盾
思考:在多道程序环境下,系统中会有多个程序并发执行,也就是说会有多个程序的数据需要同时放到内存中。那么,如何区分各个程序的数据是放在什么地方的呢?
方案:给内存的存储单元编地址,内存地址从0开始,每个地址对应一个存储单元
如果计算机“按字节编址”,则每个存储单元大小为1字节,即1B,即8个二进制位
如果字长为16位的计算机“按字编址”,则每个存储单元大小为1个字;每个字的大小为16个二进制位

2.进程运行的基本原理

指令的工作原理

操作码+若干参数(可能包含地址参数)

逻辑地址vs物理地址

逻辑地址(相对地址),即:相对于进程的起始地址而言的地址
物理地址(绝对地址)
地址总线数,数据总线数,内存大小,操作系统位数之间的关系

3.程序执行过程

创建进程的第一件事将程序和数据装入内存
将一个用户源程序变为一个可在内存中执行的程序编译→链接→装入

编译:

由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译为机器语言)

链接:

由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块
链接的三种方式:

1.静态链接:

在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。

2.装入时动态链接:

将各目标模块装入内存时,边装入边链接的链接方式。

3.运行时动态链接:

在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。

装入(地址转换):

由装入程序将装入模块装入内存运行,操作系统负责逻辑地址到物理地址的转换

1.绝对装入

在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。编译、链接后得到的装入模块的指令直接就使用了绝对地址。
编译时编译器产生绝对地址(只适用于单道程序环境,此时还没产生操作系统

2.可重定位装入(静态重定位)

编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)
静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。
装入时装入程序将逻辑地址转换为物理地址(用于早期的多道批处理操作系统

3.动态运行时装入(动态重定位)

编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。
重定位寄存器:存放装入模块存放的起始位置
采用动态重定位时允许程序在内存中发生移动。并且可将程序分配到不连续的存储区中;在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。
运行时将逻辑地址转换为物理地址,需设置重定位寄存器(现代操作系统

地址生成时机和限制:

编译时
口假设起始地址已知口如果起始地址改变,必须重新编译

地址生成过程:
■CPU
ALU:需要逻辑地址的内存内容
MMU:进行逻辑地址和物理地址的转换
CPU控制逻辑:给总线发送物理
地址请求
■内存
发送物理地址的内容给CPU
或接收CPU数据到物理地址
■操作系统
建立逻辑地址LA和物理地址PA的映射

地址检查:

内存管理
内存空间的分配与回收
从逻辑上对内存空间的扩充(实现虚拟性)
地址转换
为了使编程更方便,程序员写程序时应该只需要关注指令、数据的逻辑地址。
(这个过程称为地址重定位),这样就保证了程序员写程序时不需要关注物理内存的实际情况。
存储保护
保证各进程在自己的内存空间内运行,不会越界访问
内存保护可采取两种方法:
方法一:在CPU中设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址时,CPU检查是否越界。
方法二:采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址。
内存空间的分配与回收

-连续内存分配

计算机系统当中除了处理能力之外还有存储能力,存储能力相当于我们有一系列基本的存储介质,我们要在这些介质当中来存我们的代码和数据。

■操作系统的内存管理方式

对操作系统来说我们存储管理最后想达到什么效果?
首先系统当中的存储,内存是以字节为单位进行访问,每一个字节有自己的一个地址,这个地址是物理地址,如果数据存到外存里,比如磁盘,磁盘的访问有扇区编号,每一个扇区是512个字节最小单位。
那这是你能够读写存储的最基本的内容,而写程序的时候我们希望看到的情况是什么?
是有若干个进程,每一个进程,它们都有共同的一部分的地址空间是操作系统的内核,然后每一个应用程序自己又是不一样的,它们各自有各自的内容,我希望在各自写这些内容的时候,它们的地址是可以重叠的,相互之间是不干扰的。
把内存访问的状态转变成程序执行的逻辑的理想状态,在两者之间加了一层存储管理单元。
存储管理单元就把逻辑地址空间转变成物理地址空间。这个时候说我实际操作系统代码存在哪呢?通常情况下是在内存里头的
而进程的地址空间,随着它们运行的转换,有些是在内存里头,有些是在外存里头。这个转换的过程由中间的存储管理单元来完成。
如果说我们能做到这样一步,实际就相当于存储管理要达到效果是抽象

  • 把线性的物理地址编号转变成抽象的逻辑地址空间;
  • 然后我需要在这里头对地址空间进行保护,每一个进程只能访问自己的空间,尽管说在内存里它们是相邻存放的;
  • 与此同时我们还要方便共享,比如说在我们这里头大家可以看到的,操作系统的内核的代码是各个进程都是一样的或者说绝大部分是样的,这种一致如果说每个进程地址空间是相互保护的不能访问,这段你就得存多份,这个效率是低的。我们希望能够很好地把保护和共享统一起来,这个目标是有一些矛盾的。
  • 与此同时我们还希望它实现更好的虚拟化,这说的是我们每个进程的地址空间编号都是一样的,但实际上每个进程都有一段自己的用户地址空间,到这里实际上物理地址空间存的位置是不一样的,但是给每个进程看到的都是一个区域一致的一个地址空间,甚至于说我们在逻辑地址空间里看到的可以存数据的地方,它的大小是大于你的物理内存的总量的

我们看到实际上要想实现存储管理的抽象,保护,共享和虚拟化是很有挑战的,那操作系统可能采用一些什么样办法呢?

■重定位

我们第一个办法就是重定位

■地址空间&地址生成

■连续内存分配

■伙伴系统

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值