文章目录
1 概论
1.1 CPU漏洞攻击
Meltdown和Spectre(熔断和幽灵)
1.2 操作系统简史
1.2.1 体系结构
-
冯诺依曼结构(普林斯顿结构)
-
哈佛结构(不考
1.2.2 系统发展
- 操作系统主要功能:进程管理、存储管理、设备管理、文件系统
-
批处理
- 把用户提交的作业成批送入计算机
- 由作业调度程序自动选择作业运行
目的:- 缩短作业之间的交接时间
- 减少处理机的空闲等待,提高系统效率
-
批处理系统
加载在计算机上的一个系统软件,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(这作业包括程序、数据和命令)。
-
联机批处理系统
作业的输入输出由CPU处理
- 优点:提高了计算机的利用率
- 缺点:慢速输入输出过程,高速CPU空闲,主机“忙等”
-
脱机批处理系统
作业的输入输出脱离主机控制
- 优点:主机和卫星机可并行,充分发挥主机高速计算能力
- 缺点:慢速输入输出过程,高速CPU空闲,主机“忙等”
-
多道程序系统
同时把多个程序放入内存中(前提是内存放的下),并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。
-
特点:
- 多道
- 宏观并行
- 微观串行
-
-
多道批处理系统
-
特点:多道、成批
-
优点:系统吞吐量达、资源利用率高
-
缺点:平均周转时间长、不能提供交互能力
-
-
分时系统
将CPU处理时间分割为多个时间片,将时间片分给不同程序,达到多个程序“同时”运行的效果
- 特点:多路性、交互性、独立性、及时性
-
现代操作系统基本特征
并发执行、资源共享、虚拟化管理、异步性
1.3 操作系统基本实现机制
1.3.1 异常:陷阱和中断
- 中断是异步异常,可能随时发生,与处理器正在执行的内容无关。中断主要由I/O设备、处理器时钟或定时器产生,可以被启用或禁用。 (Asynchronous Exceptions)
- 同步异常,它是某一特定指令执行的结果。在相同条件下,异常可以重现。例如内存访问错误、调试指令以及被零除。 (Synchronous exceptions)
- 系统调用也视作同步异常,或陷阱trap。
- 软件和硬件都可以产生中断,软件中断常称为陷阱trap。
- 陷阱(trap)帧:完整的线程描述表的子集,用于现场保护
- 陷阱处理程序处理少量事件,多数转交给其他的内核或执行体模块处理
2 系统引导
3 内存管理
3.1 预备知识-链接与装载
-
gcc工具
- cc1:预处理器和编译器
as:汇编器 - collect2:链接器
- cc1:预处理器和编译器
-
ELF文件部分含义
- .bss:Block Started bySymbol–存放未初始化数据
.data/.datal存放初始化数据
.rodata/.rodatal存放只读数据
.text 存放程序的执行指令
- .bss:Block Started bySymbol–存放未初始化数据
-
链接的过程
- 编译:每个.c->.o,函数在不同文件,不知道位置
链接:.o连接到一起,形成可执行文件。
重定位:未填写的地址填写
- 编译:每个.c->.o,函数在不同文件,不知道位置
-
重定位链接地址计算
-
程序入口点
_start 函数 ,
-
程序的装载与运行
-
执行过程:
-
shell调用fork()系统调用
-
创建一个子程序
-
子程序调用execve()加载program (装载)
-
-
程序的装载细节
- 一个segment在文件中的大小是小于等于其在内存中的大小。
- 如果在文件中的大小小于在内存中的大小,那么在载入内存时通过补零使其达到其在内存中应有的大小。
-
3.2 存储管理基础
3.2.1 存储器管理目标
- 研究对象:以内存为中心的存储资源
- 帕金森定律(Parkinson):无论存储器空间有多大,程序都能将其耗尽
3.2.2 存储器硬件发展
- 静态存储器(SRAM):读写速度快,生产成本高,多用于容量较小的高速缓冲存储器
- 动态存储器(DRAM):读写速度较慢,集成度高,生产成本低,多用于容量较大的主存储器。
3.2.3 存储管理的功能
-
存储管理的基本机制:抽象
基本概念:地址空间、逻辑地址、物理地址
地址空间:一个进程所能够用于访问内存的地址集合。
逻辑地址:又称虚拟地址,程序所使用的地址。
物理地址:物理内存中数据存储的地址
存储管理的基石:- 地址独立:程序发出的地址与物理地址无关
- 地址保护:一个程序不能访问另一个程序的地址空间
-
存储管理的功能
-
存储分配和回收:存储管理的主要内容。讨论其算法和相应的数据结构。
-
地址变换:可执行文件生成中的链接技术、程序加载时的重定位技术,进程运行时硬件和软件的地址变换技术和机构。
-
存储共享和保护:代码和数据共享,对地址空间的访问权限(读、写、执行)。
-
存储器扩充:涉及存储器的逻辑组织和物理组织;
-
由应用程序控制:覆盖;
-
由OS控制:交换(整个进程空间),请求调入和预调入(部分进程空间)
-
-
-
单道程序内存管理
-
特点:
-
在单道程序环境下,整个内存里只有两个程序:一个用户程序和操作系统。
-
操作系统所占的空间是固定的。
-
因此可以将用户程序永远加载到同一个地址,即用户程序永远从同一个地方开始运行。
-
用户程序的地址在运行之前可以计算。
-
-
方法:
- **静态地址翻译:**即在程序运行之前就计算出所有物理地址。
- 静态翻译工作可以由加载器实现。
-
分析:
- 地址独立?YES. 因为用户无需知道物理内存的地址。
- 地址保护?YES. 因为没有其它用户程序。
-
优点:执行过程中无需地址翻译,程序运行速度快。
-
缺点:比物理内存大的程序无法加载,因而无法运行;造成资源浪费(小程序会造成空间浪费;I/O时间长会造成计算资源浪费)。
-
-
多道程序的内存管理
-
特点:分区式分配
- 把内存分为一些大小相等或不等的分区(partition),每个应用程序占用一个或几个分区。操作系统占用其中一个分区。
- 适用于多道程序系统和分时系统,支持多个程序并发执行,但难以进行内存分区的共享。
-
方法:
- 固定(静态)式分区分配,程序适应分区。
- 可变(动态)式分区分配,分区适应程序。
-
固定式分区分析:
-
把内存划分为若干个固定大小的连续分区
- 分区大小相等:只适合于多个相同程序的并发执行(处理多个类型相同的对象)。
- 分区大小不等:多个小分区、适量的中等分区、少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。
-
优点:易于实现,开销小。
-
缺点:内碎片造成浪费,分区总数固定,限制了并发执行的程序数目。
-
采用的数据结构:分区表--记录分区的大小和使用情况。
-
分配方式
-
单一队列
-
多队列
-
-
-
可变式分区分析:
-
可变式分区:分区的边界可以移动,即分区的大小可变。
-
优点:没有内碎片。
-
缺点:有外碎片。
-
闲置空间的管理
-
位图表示法:
- 空间开销固定:不依赖于内存中的程序数量。
- 时间开销低:操作简单,直接修改其位图值即可。
- 没有容错能力:如果一个分配单元对应的标志位为1,不能确定是否因错误变成1。
-
链表表示法:
- 空间开销:取决于程序的数量。
- 时间开销:链表扫描速度较慢,还要进行链表项的插入、删除和修改。
- 有一定容错能力:因为链表有被占空间和闲置空间的表项,可相互验证。
-
-
-
3.2.4 存储器分配方法
-
基于顺序搜索的4种分配算法
- 首次适应算法(First Fit):每个空闲区按其在存储空间中地址递增的顺序连在一起,在为作业分配存储区域时,从这个空闲区域链的始端开始查找,选择第一个足以满足请求的空白块。
- 特点:**产生碎片、时间开销大。**优先利用内存低地址部分的空闲分区。但由于低地址部分不断被划分,留下许多难以利用的很小的空闲分区(碎片或零头) ,而每次查找又都是从低地址部分开始,增加了查找可用空闲分区的开销。
- 下次适应算法(Next Fit):把存储空间中空闲区构成一个循环链表,每次为存储请求查找合适的分区时,总是从上次查找结束的地方开始,只要找到一个足够大的空闲区,就将它划分后分配出去。
- 特点:使存储空间的利用更加均衡,不致使小的空闲区集中在存储区的一端,但这会导致缺乏大的空闲分区。
- 最佳适应算法(Best Fit):为一个作业选择分区时,总是寻找其大小最接近于作业所要求的存储区域。
- 特点:产生许多小碎片。若存在与作业大小一致的空闲分区,则它必然被选中,若不存在与作业大小一致的空闲分区,则只分配比作业稍大的空闲分区,从而保留了大的空闲分区。最佳适应算法往往使剩下的空闲区非常小,从而在留下许多难以利用的小空闲区(碎片) 。
- 最坏适应算法(Worst Fit):为作业选择存储区域时,总是寻找最大的空闲区。
- 特点:无法满足后期大作业。总是挑选满足作业要求的最大的分区分配给作业。这样使分给作业后剩下的空闲分区也较大,可装下其它作业。由于最大的空闲分区总是因首先分配而划分,当有大作业到来时,其存储空间的申请往往会得不到满足。
- 首次适应算法(First Fit):每个空闲区按其在存储空间中地址递增的顺序连在一起,在为作业分配存储区域时,从这个空闲区域链的始端开始查找,选择第一个足以满足请求的空白块。
-
基于索引搜索的分配算法
基于顺序搜索的动态分区分配算法一般只是适合于较小的系统,如果系统的分区很多,空闲分区表(链)可能很大(很长) ,检索速度会比较慢。为了提高搜索空闲分区的速度,大中型系统采用了基于索引搜索的动态分区分配算法。
- 快速适应算法
- 快速适应算法,又称为分类搜索法,把空闲分区按容量大小进行分类,常用大小的空闲区设立单独的空闲区链表。系统为多个空闲链表设立一张管理索引表。
- 优点:查找效率高,仅需要根据程序的长度,寻找到能容纳它的最小空闲区链表,取下第一块进行分配即可。该算法在分配时,不会对任何分区产生分割,所以能保留大的分区,也不会产生内存碎片。
- 缺点:分区回收算法复杂(链表的插入、分区合并等),系统开销较大。在分配空闲分区时是以进程为单位,一个分区只属于一个进程,存在一定的浪费。(空间换时间)
- 伙伴系统(Linux系统)
- 固定分区方式不够灵活,当进程大小与空闲分区大小不匹配时,内存空间利用率很低。
- 动态分区方式算法复杂,回收空闲分区时需要进行分区合并等,系统开销较大。
- 伙伴系统(buddy system)是介于固定分区与可变分区之间的动态分区技术。
- 伙伴:在分配存储块时将一个大的存储块分裂成两个
- 快速适应算法
-
系统中碎片
-
内部碎片:分配给作业的存储空间内未被利用的部分。只有作业完成后才能被释放。
外部碎片:分区与分区间无法利用的分区。 -
消除外部碎片的方法:紧凑技术(Compaction)
- 通过移动作业,把多个分散的小分区拼接成一个大分区的方法称为紧凑(拼接或紧缩) 。
- 实现支撑:动态重定位:作业在内存中的位置发生了变化,这就必须对其地址加以修改或变换。
-
-
多重分区分配
多重分区分配:为了支持结构化程序设计,操作系统往往把一道作业分成若干片段(如子程序、主程序、数据组等)。这样,片段之间就不需要连续了。只要增加一些重定位寄存器,就可以有效地控制一道作业片段之间的调用。
-
分区的存储保护
存储保护是为了防止一个作业有意或无意地破坏操作系统或其它作业。常用的存储保护方法有
-
界限寄存器方法:
- 上下界寄存器方法
- 基址、限长寄存器(BR,LR) 方法
-
存储保护键方法:
- 给每个存储块分配一个单独的保护键,它相当于一把锁。
- 进入系统的每个作业也赋予一个保护键,它相当于一把钥匙。
- 当作业运行时,检查钥匙和锁是否匹配,如果不匹配,则系统发出保护性中断信号,停止作业运行。
-
3.2.5 覆盖与交换-解决大作业在小内存中运行的问题
-
覆盖:把一个程序划分为一系列功能相对独立的程序段,让执行时不要求同时装入内存的程序段组成一组(称为覆盖段),共享主存的同一个区域,这种内存扩充技术就是覆盖。
- 主要用在早期的OS 中(内存<64KB) ,可用的存储空间受限,某些大作业不能一次全部装入内存,产生了大作业与小内存的矛盾。
- 程序段先保存在磁盘上,当有关程序段的前一部分执行结束,把后续程序段调入内存,覆盖前面的程序段(内存“扩大”了) 。
- 一般要求作业各模块之间有明确的调用结构,程序员向系统指明覆盖结构,然后由os完成自动覆盖。
- 缺点:用户不透明。
-
交换:把暂时不用的某个(或某些)程序及其数据的部分或全部从主存移到辅存中去,以便腾出存储空间;接着把指定程序或数据从辅存读到相应的主存中,并将控制转给它,让其在系统上运行。
- 优点:增加并发运行的程序数目,并且给用户提供适当的响应时间;编写程序时不影响程序结构
- 缺点:对换入和换出的控制增加处理机开销;程序整个地址空间都进行传送,没有考虑执行过程中地址访问的统计特性。
-
交换技术的几个问题
- 选择原则,即将哪个进程换出内存?
- 等待I/O的进程
- 交换时机的确定,何时需发生交换?
- 只要不用就换出(很少再用)
- 只在内存空间不够或有不够的危险时换出
- 交换时需要做哪些工作?
- 保存前一个进程的运行现场:寄存器、堆栈等
- 创建新进程的运行现场
- 换入回内存时位置的确定
- 选择原则,即将哪个进程换出内存?
-
覆盖与交换技术的区别
- 覆盖可减少一个程序运行所需的空间。交换可让整个程序暂存于外存中,让出内存空间。
- 覆盖是由程序员实现的,操作系统根据程序员提供的覆盖结构来完成程序段之间的覆盖。交换技术不要求程序员给出程序段之间的覆盖结构。
- 覆盖技术主要对同一个作业或程序进行。交换主要在作业或程序间之间进行。
- 覆盖:减少一个程序本身所占用的内存
交换:减少多个程序同时占用的内存
3.3 页式内存管理
3.3.1 补充知识
- 程序、进程、作业
- 程序是静止的,是存放在磁盘上的可执行文件
- 进程是动态的。进程包括程序和程序处理对象(数据集),是一个程序的执行过程,是分配资源的基本单位。通常把进程分为系统进程和用户进程:
- 系统进程:完成操作系统功能的进程;
- 用户进程:完成用户功能的进程。
- 作业是用户需要计算机完成的某项任务,是要求计算机所做工作的集合。
- 三者联系:
- 作业通常包括程序、数据和操作说明书3部分。
- 每一个进程由进程控制块PCB、程序和数据集合组成。这说明程序是进程的一部分,是进程的实体。
- 因此,一个作业可划分为若干个进程来完成,而每一个进程有其实体——程序和数据集合。
3.3.2 基本原理
- 分区式内存管理缺点
- 内存的碎片问题:无论固定分区,还是可变分区都普遍存在的问题
- 内存紧缩
- 程序需要装入连续的物理内存空间
- 小内存运行大程序:覆盖、交换
- 很难满足程序对内存空间的动态需求
- 很难找到一个绝对有效的内存分配/回收策略
- First Fit/Next Fit/Best Fit/Worst Fit
- Buddy System
- 内存利用率低
- 内存的碎片问题:无论固定分区,还是可变分区都普遍存在的问题
- 分页式存储管理的基本思想
- 基本思想:把一个逻辑地址连续的程序分散存放到若干不连续的内存区域内,并保证程序的正确执行。
- 带来的好处:既可充分利用内存空间,又可减少移动带来的开销。
- 纯分页系统
- 不具备页面对换功能的分页存储管理方式,不支持虚拟存储器功能,这种存储管理方式称为纯分页或基本分页存储管理方式。(v.s. 请求分页)
- 在调度一个作业时,必须把它的所有页一次装到主存的页框内;如果当时页框数不足,则该作业必须等待,系统再调度另外作业。
- 优点:
- 没有外碎片,每个内碎片不超过页大小
- 一个程序不必连续存放
- 便于改变程序占用空间的大小
- 缺点:
- 程序全部装入内存;有内碎片
3.3.3 基本概念:页表、地址变换、多级页表、快表
-
基本概念
- 页:把每个作业的地址空间分成一些大小相等的片,称之为**页面(Page)**或页,各页从0开始编号。
- 存储块:把物理内存的存储空间也分成与页面相同大小的片,这些片称为存储块,或称为页框(Frame),同样从0开始编号。
- 页表:为便于在内存找到进程的每个页面所对应的页框,分页系统中为每个进程配置一张页表。进程逻辑地址空间的每一页,在页表中都对应有一个页表项。
-
页面大小辨析
- 若页面较小
- 减少页内碎片和总的内存碎片,有利于提高内存利用率。
- 每个进程页面数增多,使页表长度增加,占用内存较大。
- 页面换进换出速度将降低。
- 若页面较大
- 增加页内碎片,不利于提高内存利用率。
- 每个进程页面数减少,页表长度减少,占用内存较小。
- 页面换进换出速度将提高。
-
关于页表
-
页表存放在内存中,属于进程的现场信息。
-
用途:
-
记录进程的内存分配情况
-
实现进程运行时的动态重定位。
-
-
访问一个数据需访问内存2 次(页表一次,内存一次)。
-
页表的基址及长度由页表寄存器给出。
-
-
二级页表
-
一级页表存在问题:逻辑地址大,页表大,占用存储空间(要求连续)大。
-
将页表再进行分页,离散地将各个页表页面存放在不同的物理块中,同时也再建立一个外层页表用以记录页表页面对应的物理块号。
-
正在运行的进程先把外层页表(页表的页表)调入内存,而后动态调入内层页表。只将当前所需的一些内层页表装入内存,其余部分根据需要再陆续调入。
-
练习题:
-
存在的问题: 内存访问效率降低
-
-
快表TLB
-
有效内存访问时间计算(一级页表)
TLB查询时间 ε \varepsilon ε 单次内存访问时间 τ \tau τ TLB命中率 α \alpha α
有效内存访问时间EAT=(τ+ε)α + (2τ+ε)(1-α) = 2τ + ε - τα
-
例题:
-
3.3.4 页表类型:哈希页表、反置页表
-
哈希页表(Hashed Page Table)
- 过程:将虚拟页号转换为哈希值,据此访问哈希表的表项(链表)。用虚拟页号与链表中的元素的第一个域相比较。如果匹配,那么相应的页框号(第二个域)就用来形成物理地址;如果不匹配,那么就进一步比较链表的下一个节点,以找到匹配的页号。
-
反置页表(Inverted Page Table)
- 原因:每个页表可能有很多项。这些表可能消耗大量物理内存,却仅用来跟踪物理内存是如何使用的。
- 原理:反置页表不是依据进程的逻辑页号来组织,而是依据该进程在内存中的页框号来组织(即:按页框号排列),其表项的内容是逻辑页号P及隶属进程标志符pid 。
- 反置页表的大小只与物理内存的大小相关,与逻辑空间大小和进程数无关。如: 64M主存,若页面大小为4K,则反向页表只需64KB。
- 地址变换过程:
- 用进程标志符和页号去检索反置页表。
- 如果检索完整个页表未找到与之匹配的页表项,表明此页此时尚未调入内存,对于具有请求调页功能的存储器系统产生请求调页中断,若无此功能则表示地址出错。
- 如果检索到与之匹配的表项,则表项的序号i 便是该页的物理块号,将该块号与页内地址一起构成物理地址。
- 反置页表按照物理地址排序,而查找依据虚拟地址,所以可能需要查找整个表来寻找匹配。 可以通过哈希页表限制页表条目或加入TLB改善。通过哈希表(hash table)查找可由逻辑页号得到物理页面号。虚拟地址中的逻辑页号通过哈希表指向反置页表中的表项链头(因为哈希表可能指向多个表项),得到物理页面号。
- 采用反置页表的系统很难共享内存,因为每个物理帧只对应一个虚拟页条目。
3.3.5 页共享与保护
- 页式存储管理系统提供了两种方式:
- 地址越界保护
- 在页表中设置保护位(定义操作权限:只读,读写,执行等)共享带来的问题
- 若共享数据与不共享数据划在同一页框中,则:
- 有些不共享的数据也被共享,不易保密。
- 实现数据共享的最好方法:分段存储管理。
3.4 段式内存管理
3.4.1基本原理
-
段式存储管理的主要动机
-
**方便编程:**通常一个作业是由多个程序段和数据段组成的,用户一般按逻辑关系对作业分段,并能根据名字来访问程序段和数据段。
-
**信息共享:**共享是以信息的逻辑单位为基础的。页是存储信息的物理单位,段是信息的逻辑单位。页式管理中地址空间是一维的,主程序、子程序都顺序排列,共享公用子程序比较困难,一个共享过程可能需要几十个页面。
-
**信息保护:**页式管理中,一个页面中可能装有2 个不同的子程序段的指令代码,不能通过页面共享实现一个逻辑上完整的子程序或数据块的共享。段式管理中,可以使用信息的逻辑单位进行保护。
-
**动态增长:**实际应用中,某些段(数据段)会不断增长,前面的存储管理方法均难以实现。
-
**动态链接:**动态链接在程序运行时才把主程序和要用到的目标程序(程序段)链接起来。
-
-
基本思想
- 一个段可定义为一组逻辑信息,每个作业的地址空间是由一些分段构成的(由用户根据逻辑信息的相对完整来划分),每段都有自己的名字(通常是段号),且都是一段连续的地址空间,首地址为0。
- 一个段可定义为一组逻辑信息,每个作业的地址空间是由一些分段构成的(由用户根据逻辑信息的相对完整来划分),每段都有自己的名字(通常是段号),且都是一段连续的地址空间,首地址为0。
3.4.2地址变换
-
地址变换
-
段表记录了段与内存位置的对应关系。
-
段表保存在内存中。
-
段表的基址及长度由段表寄存器给出。
-
访问一个字节的数据/指令需访问内存两次(段表一次,内存一次)。
-
逻辑地址由段和段内地址组成。
-
-
地址变换过程
-
将逻辑地址中的段号S 与段表长度TL 进行比较。
-
若S>TL,表示访问越界,产生越界中断。
- 若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的始址。
- 再检查段内地址d,是否超过该段的段长SL。
- 若超过,即d >SL,同样发出越界中断信号。
-
- 若未越界,则将该段的基址与段内地址d 相加,即可得到要访问的内存物理地址。
-
- 补充知识:可重入代码
- 可重入代码
(Reentrant Code)
又称为“纯代码”(Pure Code)
,是指在多次并发调用时能够安全运行的代码。要求:不能使用全局/静态变量;代码不能修改代码本身;不能调用其他的不可重入代码。
- 可重入代码
3.4.4与页式管理优缺点对比
-
分段管理优缺点
- 优点:
- 分段系统易于实现段的共享,对段的保护也十分简单。
- 更好地支持动态的内存需求
- 缺点:
- 处理机要为地址变换花费时间;要为段表提供附加的存储空间。
- 为满足分段的动态增长和减少外碎片,要采用内存紧凑的技术手段。
- 在辅存中管理不定长度的分段比较困难(交换)。
- 分段的最大尺寸受到主存可用空间的限制。
- 优点:
-
分页与分段的比较
-
分页的作业的地址空间是单一的线性地址空间(注:页式管理所用的一维的虚拟地址也称为线性地址),分段作业的地址空间是二维的。
-
“页”是信息的“物理”单位,大小固定。“段”是信息的逻辑单位,即它是一组有意义的信息,其长度不定。
-
分页对用户是透明的,是系统对于主存的管理。分段是用户可见的(分段可以在用户编程时确定,也可以在编译程序对源程序编译时根据信息的性质来划分)。
-
-
3.4.5 段页式管理
-
实现原理
-
基本思想:用分段方法来分配和管理虚拟存储器,而用分页方法来分配和管理物理存储器。
-
段页式存储管理:分段和分页原理的结合,即先将用户程序分成若干个段(段式) ,并为每一个段赋一个段名,再把每个段分成若干个页(页式) 。
-
地址结构由段号、段内页号、及页内位移三部分所组成。
-
系统中设段表和页表,均存放于内存中。读一次指令或数据须访问内存三次。为提高速度可增设高速缓存。
-
每个进程一张段表,每个段一张页表。
-
段表含段号、页表始址和页表长度;页表包含页号和页框号。
-
3.5 虚拟内存管理
- 常规存储的问题
- 常规存储管理方式的特征:
- 一次性:要求一个作业全部装入内存后方能运行。
- 驻留性:作业装入内存后一直驻留内存,直至结束。
- 可能出现的问题:
- 有的作业很大,所需内存空间大于内存总容量,使作业无法运行。
- 有大量作业要求运行,但内存容量不足以容纳下所有作业,只能让一部分先运行,其它在外存等待。
- 已有解决方法:
- 增加内存容量
- 从逻辑上扩充内存容量:覆盖、对换。
- 常规存储管理方式的特征:
3.5.1 局部性原理
-
程序的局部性
-
程序在执行时,大部分是顺序执行的指令,少部分是转移和过程调用指令。(空间局部性)
-
过程调用的嵌套深度有限,因此执行的范围不超过这组嵌套的过程。(空间局部性)
-
程序中存在很多对特定数据结构的操作,如数组操作,往往局限在较小范围内。(空间局部性)
-
程序中存在很多循环结构,它们由少量指令组成,而被多次执行。(时间局部性)
-
-
局部性原理
-
指程序在执行过程中的一段较短时间内,所执行的指令地址和指令的操作数地址分别局限于一定区域。具体表现为:
-
时间局部性:即一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一段较短时间内;
-
空间局部性:即当前指令和邻近的几条指令,当前访问的数据和邻近的数据都集中在一个较小区域内。
-
-
3.5.2 请求式分页
-
虚拟存储
-
目标**(与覆盖和交换的关系)**:
- 借鉴覆盖技术:不必把程序的所有内容都放在内存中,因而能够运行比当前的空闲内存空间还要大的程序。
- 与覆盖不同:由操作系统自动完成,对程序员是透明的。
- 借鉴交换技术:能够实现进程在内存与外存之间的交换,因而获得更多的空闲内存空间。
- 与交换不同:只将进程的部分内容(更小的粒度,如分页)在内存和外存之间进行交换。
-
原理:
- 在程序装入时,不需要将其全部读入到内存,而只需将当前需要执行的部分页或段读入到内存,就可让程序开始执行。
- 在程序执行中,如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段) ,则由处理器通知操作系统将相应的页或段调入到内存,然后继续执行程序。(请求调入功能)
- 操作系统将内存中暂时不使用的页或段调出保存在外存上,从而腾出空间存放将要装入的程序以及将要调入的页或段。(置换功能)
-
特征:
-
离散性: 物理内存分配的不连续,虚拟地址空间使用的不连续(数据段和栈段之间的空闲空间,共享段和动态链接库占用的空间)
-
多次性: *作业被分成多次调入内存运行。*正是由于多次性,虚拟存储器才具备了逻辑上扩大内存的功能。多次性是虚拟存储器最重要的特征,其它任何存储器不具备这个特征。
-
**对换性:**允许在作业运行过程中进行换进、换出。换进、换出可提高内存利用率。
-
**虚拟性:**允许程序从逻辑的角度访问存储器,而不考虑物理内存上可用的空间容量。
- 范围大,但占用容量不超过物理内存和外存交换区容量之和。
- 占用容量包括:进程地址空间中的各个段,操作系统代码。
-
虚拟性以多次性和对换性为基础,
多次性和对换性必须以离散分配为基础。
-
-
优缺点:
-
优点:
-
**小内存大程序:**可在较小的可用(物理)内存中执行较大的用户程序;
-
**支持更多并发:**可在(物理)内存中容纳更多程序并发执行;
-
不必影响编程时的程序结构(与覆盖技术比较)
-
**虚拟内存通常远大于物理内存:**提供给用户可用的虚拟内存空间通常大于物理内存
-
-
代价:虚拟存储量的扩大是以牺牲CPU 处理时间以及内外存交换时间为代价。
-
限制:虚拟内存的最大容量主要由计算机的地址结构决定。例如: 32 位机器的虚拟存储器的最大容量就是4GB。
-
-
与Cache异同:
-
相同点:
-
出发点相同:二者都是为了提高存储系统的性能价格比而构造的分层存储体系,都力图使存储系统的性能接近高速存储器,而价格和容量接近低速存储器。
-
原理相同:都是利用了程序运行时的局部性原理把最近常用的信息块从相对慢速而大容量的存储器调入相对高速而小容量的存储器。
-
-
不同点:
-
侧重点不同:cache主要解决主存与CPU的速度差异问题;虚存主要解决存储容量问题,另外还包括存储管理、主存分配和存储保护等。
-
数据通路不同:CPU与cache和主存之间均有直接访问通路,cache不命中时可直接访问主存;而虚存所依赖的辅存与CPU之间不存在直接的数据通路,当主存不命中时只能通过调页解决,CPU最终还是要访问主存。
-
透明性不同:cache的管理完全由硬件完成,对系统程序员和应用程序员均透明;而虚存管理由软件(OS)和硬件共同完成,由于软件的介入,虚存对实现存储管理的系统程序员不透明,而只对应用程序员透明(段式和段页式管理对应用程序员“半透明”)。
-
未命中时的损失不同:由于主存的存取时间是cache的存取时间的5~10倍,而主存的存取速度通常比辅存的存取速度快上千倍,故主存未命中时系统的性能损失要远大于cache未命中时的损失。
-
-
-
-
请求分页(段)系统
-
请求分页与请求分段系统的比较:
-
虚存机制要解决的关键问题:
- 地址映射问题:进程空间到虚拟存储的映射问题;
- 调入问题:决定哪些程序和数据应被调入主存,以及调入机制。
- 替换问题:决定哪些程序和数据应被调出主存。
- 更新问题:确保主存与辅存的一致性。
- 其它问题:存储保护与程序重定位等问题
-
请求分页式管理
-
基本概念:
- 进程的逻辑空间(虚拟地址空间):一个进程的逻辑空间的建立是通过链接器(Linker),将构成进程所需要的所有程序及运行所需环境,按照某种规则装配链接而形成的一种规范格式(布局),这种格式按字节从0开始编址所形成的空间也称为该进程的逻辑地址空间。由于该逻辑空间并不是物理上真实存在的,所以也称为进程的虚拟地址空间。
- 如:Hello World进程包含Hello World可执行程序、printf函数(所在的)共享库程序以及OS相关程序。
- 虚拟地址空间和虚拟存储空间:进程的虚拟地址空间即为进程在内存中存放的逻辑视图。因此,一个进程的虚拟地址空间的大小与该进程的虚拟存储空间的大小相同,都从0开始编址。
- 交换分区(交换文件):
- 一段连续的磁盘空间(按页划分的),并且对用户不可见。它的功能就是在物理内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出物理内存来让别的程序运行。
- 在Linux系统中,交换分区为swap;在Windows系统中则以文件的形式存在(pagefile.sys)。
- 交换分区的大小:交换分区的大小应当与系统物理内存(M)的大小保持线性比例关系(Linux中):
- 进程的逻辑空间(虚拟地址空间):一个进程的逻辑空间的建立是通过链接器(Linker),将构成进程所需要的所有程序及运行所需环境,按照某种规则装配链接而形成的一种规范格式(布局),这种格式按字节从0开始编址所形成的空间也称为该进程的逻辑地址空间。由于该逻辑空间并不是物理上真实存在的,所以也称为进程的虚拟地址空间。
-
地址映射问题
进程空
-