冯·诺伊曼原理:程序必须先在内存,然后才被执行
存储管理,又称主存管理
主要管理对象:内存
内存的功能:存储指令和数据
存储结构:寄存器->快速缓存(cache)->内存->外存
存储速度越来越慢,存取频度越来越低,容量越来越大,价格越来越低
程序被装入内存前的地址叫:相对地址、程序地址、逻辑地址、虚拟地址、有效地址
程序被装入内存时,相对地址转为绝对地址,或者说程序地址转为内存地址,逻辑地址转为物理地址,物理地址对应着内存的某个存储单元的编号
当程序被装入内存时,程序的逻辑地址转为物理地址,这一过程称为地址重定位,由内存管理单元MMU完成
逻辑地址空间,又称地址空间;物理地址空间,又称存储空间
源程序->可执行文件,形成逻辑地址空间
可执行文件->进程,形成物理地址空间
链接:多个目标模块在执行时的地址空间分配和相互引用
链接分为:静态链接、动态链接
静态链接:在生成可执行文件时进行。在目标模块中记录被调用模块的名字符号地址,在生成可执行文件时,把该名字符号转为该名字符号对应的逻辑地址
动态链接:在装入或运行可执行文件时进行。被链接的共享代码称为动态链接库DLL或共享库
存储管理的目的
- 使用户和用户程序不涉及内存使用的细节
- 为用户程序把程序装入内存
- 提高内存利用率,缓和用户对内存容量的需求与内存实际容量之间的矛盾
- 令内存的存储速度匹配上CPU
- 实现内存共享
存储管理的任务
- 存储分配和回收(主要)
- 地址变换(动态再定位)
- 存储共享和保护(将代码/数据共享,或设置访问权限)
- 存储扩充
如果由应用程序控制,则采用覆盖技术
如果由操作系统控制,则采用交换技术、请求调入、预调入
页式存储和段式存储的比较
(1)分页是出于系统管理的需要,分段是出于用户应用的需要。因此,一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处。
(2)页的大小是系统固定的,而段的大小则通常不固定。
(3)逻辑地址表示:分页是一维的,各个模块在链接时必须组织在同一个地址空间;而分段是二维的,各个模块在链接时可以把每个段组织成一个地址空间。
(4)通常段比页大,因而段表比页表短,可以缩短查找时间,提高访问速度。
(5)分段式存储管理可以实现内存共享,而分页式存储管理则不能实现内存共享。两者都不能实现存储扩充。
页式存储管理 | 段式存储管理 | |
划分依据 | 系统管理需要 | 用户应用需要 |
页/段大小 | 各页面大小相同 | 段的大小不固定 |
逻辑地址 | 只有一个逻辑地址空间 | 每个段一个独立的逻辑地址空间 |
页表/段表 | 页面较多,页表较长,查找费时 | 段较少,段表较短,查找速度快 |
碎片 | 存在内碎片 | 存在外碎片 |
内存共享 | 不支持 | 支持 |
存储扩充 | 不支持 | 不支持 |
虚拟存储
程序的局限性包含以下两个方面:
时间局限性:程序中的数据和指令一旦被访问,不久以后可能再次被访问。其原因是程序中存在着大量的循环操作。
空间局部性:一旦程序访问了某个存储单元,不久以后,其附近的单元也将被访问,原因是程序的顺序执行。
局部性原理具体体现在以下几方面:
·程序中大部分是顺序执行的指令,少部分是转移和过程调用指令。
·过程调用的嵌套深度一般不超过5层,因此执行的范围不超过这组嵌套的过程。
·程序中存在相当多的循环结构,它们由少量指令组成,而被多次执行。
·程序中存在相当多的对一定数据结构的操作,这些操作往往局限在较小范围内。
连续分配和基本的分页分段分配方式的共同特点是:程序或作业一次性全部装入后才运行。
虚拟存储管理基于程序的局部性原理,利用大容量的磁盘作为后备,当作业要占用的内存空间不够大时,将作业的一部分暂时先放在磁盘上,当需要时再从磁盘上调入。
虚拟存储的基本原理:
在程序装入时,不必将其全部读入到内存,而只需将当前需要执行的部分页或段读入到内存,就可让程序开始执行。在程序执行过程中,如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页或段调入到内存,然后继续执行程序。
操作系统将内存中暂时不使用的页或段调出保存在外存上,从而腾出空间存放将要装入的程序以及将要调入的页或段,这就是请求调入和置换功能。
虚拟存储技术的特征:
·物理内存分配可以不连续,虚拟地址空间也可以不连续(包括数据段和栈段之间的空闲空间,共享段和动态链接库占用的空间)。
·与交换技术比较,调入和调出是对部分虚拟地址空间进行的。
·结合物理内存与快速外存,提供大范围的虚拟地址空间,但占用的容量不超过物理内存和外存交换区容量之和。
虚拟存储技术分为:请求分页/虚拟页式、请求分段/虚拟段式、请求段页式。
请求分页(段)存储管理在页式(段式)存储管理的基础上,增加了请求调页(调段)等功能。
请求段页式存储管理是请求分页和请求分段管理的结合。
它们都不需要一次性把程序全部装入。
段页式存储管理的分配单位是段和页,逻辑地址是由段号、页号和页内偏移地址三部分组成。地址变换的过程也分为两步,先查段表,再查该段的页表。因此,在地址变换的过程中会产生缺段中断和缺页中断两种不同类型的中断。
1.虚拟页式存储/请求分页存储
工作集:一个进程执行过程中所访问的页面的集合。
分页:将某一页从内存移到外存称为“出页”,从外存调入内存称为“入页”。入页与出页的操作称为“分页”操作。
抖动:在请求分页系统中,从内存中刚刚移走某个页面后,根据请求马上又调入该页,这种反复进行入页和出页的现象称为“抖动”,也叫做系统颠簸。它浪费了大量的处理机时间,所以应尽可能避免“抖动”的发生。
缺页中断:缺页中断是指执行指令期间产生和进行处理的。CPU的地址变换机构根据页表项的存在位判断是否产生缺页中断。所缺的页面调入内存之后,中断的指令会被重新执行。一条指令的执行期间可能会产生多次缺页中断。
影响缺页次数的因素:
分配给进程的物理页面数
页面本身的大小
程序的编制方法
页面淘汰算法
缺页率:可以用(缺页次数/内存访问次数)或(缺页的平均时间间隔)来表示。
页面调度策略包括:页面调入策略、置页策略、页面置换策略
页面调入策略:决定发生缺页时调入哪些页面
置页策略:内存管理器需要把调入的虚页存放在内存的什么地方
页面置换策略:缺页时需要请求调入,但物理内存已满,需要确定置换那个页面
页面淘汰算法:决定在需要调入页面而内存已满时,选中哪个物理页面进行置换
常驻内存的操作系统的关键部分不能被置换出去,需要锁定。实现方法:在页表中添加锁定标志位。
虚拟页式存储/请求分页存储的性能:
- 颠簸/抖动:页面在内存与外存之间频繁调度的现象称为颠簸或抖动。
- 常驻集:指分配给进程的物理页面数。
- 工作集:对一个作业来说,当分配给它的页面数小于某一个数值时,其缺页中断次数急剧增加,甚至出现页面抖动现象;而高于这个数时,缺页中断次数不会明显减少。此时我们称这个页面数范围为页面的“工作集”。
- 缺页率算法PFF
- 可采样间隔算法VSWS
- 虚拟存储中的负载控制
2.虚拟段式存储/请求分段存储
请求分段与请求分页的不同之处在于,指令和操作系统一定不会跨越在段边界上。但在请求分段系统中,一般会增加存取权限的违法终端和段的越界中断。
在请求分段存储管理中,对物理内存进行分配时可采用与动态分区相似的最佳适应分配、首先适应分配等分配策略。
1)段的动态链接
在程序开始运行时,只将主程序段调入内存,其他各段的装配是在主程序段的运行过程中逐步完成的。每当需要调用一个新段时,才将这个新段装配好,并与主程序段链接。而页式存储管理难以完成动态链接,其逻辑地址是一维的。
2)链接间接字
机器指令可采用直接寻址或间接寻址方式。
采用间接寻址时,间接地址指示的单元的内容称为间接字,在间接字中,包含了直接地址及附加的状态位。
处理机在执行间接指令时,其硬件能自动对链接字中的链接标志位进行判断。当L=1时,硬件自动发链接中断,并停止执行该间接指令,转去执行链接中断处理程序。处理完后(L已被中断处理程序改为0),再重新执行该间接指令;若L=0,则根据间接字中的直接地址去取数据。
3)链接中断处理步骤
(1)根据链接间接字找出要访问段的符号名和段内地址
(2)分配段号,检查该段是否在内存。若不在内存,则从外存调入,并登记段表,修改内存分配表
(3)修改间接字:修改链接标志位为0,并修改直接地址
(4)重新启动被中断的指令执行
高速缓冲存储器
高速缓存是为匹配CPU的处理速率和内存的访问而设,其目的是为提高CPU的利用率。
高速缓存由三部分组成:高速缓冲存储器、缓存目录和缓冲控制器。
(1)高速缓冲存储器:主要作用是缓存内存中数据。
(2)缓冲目录:描述各缓冲存储器块的状态。缓冲目录的表项与缓冲存储器块一一对应。每32个缓冲目录的表项构成一行,对应于一个缓存区。它包括内存地址行号、状态位以及用于缓存淘汰算法的缓存访问信息。
·内存地址行号:相应缓存块对应的内存地址(24位)为行号(13位)+列号(5位)+字节数(6位)。
·3个状态位描述相应缓存块的状态:
有效位:相应缓存块中的数据是否有效,0表示有效,1表示无效。
修改位:相应缓存块中的数据是否已经被修改过,0表示未修改,1表示已修改
故障位:相应缓存块是否出了故障,0表示无故障,1表示有故障。
(3)缓存控制器:负责缓存目录的维护,并利用缓存淘汰算法进行缓存的更新。
缓存的工作过程
在不同类型的内存操作时,缓存会有不同的工作过程。具体的缓存工作过程如下:
(1)CPU读数据:缓存控制器自动查找缓存目录,确定相应内存数据是否在缓存中。
·查找过程:
◇依据读操作的地址确定查找缓存目录的列号。
◇比较缓存目录相应列的各区行号与地址行号。
◇判断有效位是否为0。
·依据查找结果,有两种可能的操作:
◇如果在缓存,则从缓存中读数据,并修改访问标志。
◇如果不在缓存,则从内存中读数据,同时该块内容被送到缓存相应列的某块。
(2)CPU写数据:查找缓存目录,确定相应地址是否在缓存中。
·如果在缓存,则修改缓存内容,并把缓存目录中相应修改位置1。这时有两种做法:
立即写:在内存与缓存的相应块同时写。
惰性写:数据只写入缓存,不马上写入内存。当该缓存块被淘汰时,才写回内存
·如果不在缓存,则先把内存读入缓存,再在缓存中修改。
(3)通道向内存写数据:数据被写入内存,缓存控制器同时查找缓存目录,如果有,则修改相应表项的有效位为1。
(4)通道从内存读数据:
·如果在缓存中,则从缓存中读数据到通道。
·如果不在缓存中,则从内存中读数据到通道,但并不同时送到缓存。