注:2^20=1M(兆)
主机+外设(总共五个)
存储器结构-金字塔(建议搜出来看看)也叫易失性存储器?
注意:内存空间是物理空间
模块的调用-》跳转指令?/drump?
可以解决静态的问题–移动
存储器是计算机系统的重要组成部分,是计算机系统中的一种宝贵而紧俏的资源。操作系统中的
存储管理
是指对内存
的管理,它是操作系统的重要功能之一。
存储管理的主要任务是为
多道程序
提供良好的运行环境,方便用户使用存储器,提高存储器的利用率以及从逻辑上扩充存储器。为此
存储管理应具有以下功能:
1.实现内存的分配和回收
(因为并发,存在多道程序的程序段和数据段)
2.地址变换
(相对地址←→绝对地址)
(相对地址也就是逻辑地址,即为程序员看到的,取零地址,绝对地址是物理地址)
3.“扩充”
内存容量
(时间上-速度,内存扩充也要考虑速度,页面调度算法防止抖动。设备管理也就是I/O虚拟化)
4.进行存储保护
程序的装入和链接
源文件(通过编辑)->.obj(目标文件)(通过链接)->.dll(或一个.exe+.多个dll)->装入->取指分析执行(冯诺伊曼)
程序的
装入
方式(三种)
1.绝对装入方式
2.可重定位装入方式
3.动态运行时装入方式
1.绝对装入方式
(编译时修改地址)
如果在编译时,事先知
用户程序在内存的驻留位置,则编译程序在编译时就产生绝对地址
的目标代码。装入程序就直接把装入模块中的程序和数据装入到指定的位置,(不需进行地址转换
)
该装入方式只适用于单道程序环境
。
2.可重定位装入方式
静态重定位:装入时
动态重定位:运行时(可以解决静态的问题-移动)
(可重定位-装入的时候加上首地址,程序不便移动,calla->drump?)
3.动态运行时装入方式
如果事先不知
用户程序在内存的驻留位置,为了保证程序在运行过程中,它在内存中的位置可经常改变
。装入程序把装入模块装入内存后,并不立即把装入模块中相对地址转换为绝对地址,而是在程序运行时才进行
。这种方式需一个重定位寄存器
(放的程序的首地址)来支持。(在程序运行过程
中进行地址转换
)
程序的
链接
根据链接时间的不同,可将链接分成三种:
1.静态链接
2.装入时动态链接
3.运行时动态链接
1.静态链接方式
(静态也就是一次性)
2.装入时动态链接方式
指将一组目标模块在装入内存时,边装入边链接
的方式。具有便于修改和更新
、便于实现对目标模块的共享
。
存在问题:
由于程序运行所有可能用的目标模块在装入时均全部链接在一起,所以将会把一些不会运行的目标模块
也链接进去。如程序中的错误处理模块。
3.运行时动态链接方式
在程序运行
中需要某些目标模块时,才对它们进行链接的方式。具有高效
且节省内存空间
的优点。
连续分配存储管理方式
主要分为单一连续分配和分区分配
1.单一连续分配方式
(没必要实现存储保护,但不支持并发)
(B是字节,一个盘512字节)
2.分区分配方式存储管理
分区分配方式是满足多道程序
设计需要的一种最简单的存储管理方法。
存储管理方法
将内存分成若干个分区(大小相等/不相等),除OS占一区外,其余的每一个分区容纳一个用户程序。按分区数目的变化情况,可将分区存储管理进一步分为:
a.固定分区存储管理
(有内部碎片-已分配但没有利用)
b.动态分区存储管理
(有外部碎片-未分配-很小装不进去。也可能有内部碎片)
c.可重定位分区分配方式
(内部碎片,外部碎片都可能有)
(Null是操作系统零地址)
空间分区表 (nx)B=o(n)
空间分区链DwoRD=o(1)
分区分配算法
为了将一个作业装入内存,应按照一定的分配算法从空闲分区表(链)中选 出一个满足作业需求的分区分配给作业,如果这个空闲分区的容量比作业申请的空间要大,则将该分区一分为二,一部分分配给作业,剩下的部分仍然留在空闲分区表(链)中,同时修改空闲分区表(链)中相应的信息
:
1.首次适应算法(最先适应算法)
2.循环首次适应算法
3.最佳适应算法
4.最坏适应算法
1.首次适应算法(最先适应算法)
-不公平性
算法
空闲分区(链)
按地址递增
的次序排列。在进行内存分配时,从空闲分区表/链首
开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表(链)中。
2.循环首次适应算法
算法要求
又称为下次适应
算法,由首次适应算法演变而来。在为作业分配内存空间时,不再每次从空闲分区表/链首开始查找
,而是从上次找到的空闲分区的下一个空闲分区开始查找
,直到找到第一个能满足其大小要求的空闲分区为止。然后,再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表/链中
图:
3.最佳适应算法
算法要求:
空闲分区/链按容量大小递增
的次序排列。在进行内存分配时,从空闲分区表/链的首
开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。
按这种方式为作业分配内存,就能把既满足作业要求又与作业大小最接近的空闲分区分配给作业
。
4.最坏适应算法
算法要求
空闲分区/链按容量大小递减
的次序排列。在进行内存分配时,将第一个(即最大的)空闲分区
分割给作业使用。
分区分配操作_分配内存和回收内存
(1)分配内存
系统利用某种分配算法,从空闲分区表/链中找到所需大小的分区。
分区的切割
:
设请求的分区
大小为u.size
,空闲分区
的大小为m.size
,若m.size-u.size<=size
(size是事先规定的不再切割的剩余分区的大小
),说明多余部分大小,可不再切割,将整个分区分配给请求者;否则,从该分区中按请求的大小划分出一块内存空间分配出去,余下的部分仍留在空闲分区表/链中,然后,将分配区的首址和大小返回给调用者/内存管理进程。
分配流程图如下
(<=size,变成内部碎片,删去表项)
(回收内存只有3需要删去下面的表项,4是增加一项表项,1,2不需要增删,第4种首地址为回收分区的首地址,大小为回收分区的大小)
3.可重定位分区分配方式-动态运行装入时
(实际上不用做重定位)
磁盘:
对换区 | 连续(保证效率) |
---|---|
文件区 | 离散(保证空间利用率) |
特点:
可以充分利用存储区中的“零头/碎片”,提高主存的利用率
。 但若 “零头/碎片”大多,则拼接频率过高会使系统开销加大
。
分区的存储保护
存储保护是为了防止一个作业有意或无意地
破坏操作系统或其它作业
,常用的存储保护方法有:
1、界限寄存器方法
1)上下界寄存器方法
(适合静态和可重定位装入):用这两个寄存器分别存放作业的起始地址
和结束地址
。在作业运行过程中,将每一个访问内存的绝对地址
都同这两个寄存器的内容比较,如超出这个范围便产生保护性中断。
2)基址、限长寄存器方法
(适合动态运行时装入):用这两个寄存器分别存放作业的起始地址
和作业的地址空间长度
。当作业执行时,将每一访问内存的相对地址
和限长寄存器比较,如果超过了限长寄存器的值,则发出越界中断信号,并停止作业的运行。
(上述第二种效率更高,因为只访问一次)
2、存储保护键方法
-可实现共享
给每个存储块(大小相同,一个分区为整数倍存储块)分配一个单独的保护键,它相当于一把锁。进入系统的每个作业也赋予一个保护键,它相当于一把钥匙。当作业运行时,检查钥匙和锁是否匹配,如果不匹配,则系统发出保护性中断信号,停止作业运行。
覆盖与交换
覆盖不是系统做的,是让程序员做的
交换与覆盖技术的
区别
:
1.交换技术不要求程序员给出程序段之间的覆盖结构,交换主要交换主要在作业或进程之间
进行。
2.覆盖技术要求程序员必须把一个程序划分成不同的程序段,并规定好它们的执行和覆盖顺序,操作系统根据程序员提供的覆盖结构来完成程序段之间的覆盖。覆盖技术主要在同一个作业或进程
中进行,同时覆盖只能覆盖与覆盖程序段无关的程序段
。
(即:一个内存时,一个大作业用覆盖,多个小作业用交换)
基本分页存储管理方式
基本–表示不会用到虚拟存储–一次性和驻留性
1.连续分配存储管理方式产生的问题
在分区存储管理中,要求把进程放在一个连续的存储区中,因而会产生许多碎片
。
2.碎片问题的解决方法
(1)拼接/紧凑技术
----代价较高。
(2)离散分配方式
—允许将作业/进程离散放到多个不相邻接的分区中,就可以避免拼接。基于这一思想产生了以下的离散分配方式:
分页式存储管理
(系统决定的):离散分配的基本单位是页
(物理方面,分页可能有内部碎片,一定没有外部碎片,是二维到二维)
分段式存储管理
(程序员决定的):离散分配的基本单位是段
(逻辑方面,分段可能有外部碎片,没有内部碎片)
段页式存储管理
:离散分配的基本单位是段、页
在分页存储管理方式中,如不具备页面对换功能,不支持虚拟存储器功能
,在调度作业运行时,必须将它的所有页面一次调入内存,若内存没有足够的块,则作业等待,这种存储管理方式称为纯分页
或基本分页存储管理方式
。
(分页缺乏逻辑性)
(页表放在内存里的进程的pcb里,是一种数据结构,一个进程一个)
(页表始址:base+2xfai-x是页号,xl)–指针加法
(页表长度:防止地址越界)–越界中断
页面较小时第二个问题解决方式–页表分级
高速缓存(快表):提高访问速度(如果没有这个缓存,就要访问3/2次(3次表示未命中,2次表示命中),因为还要访问高速缓存器
快表-并行-因为程序的局部性
快表淘汰页(解决抖动问题-页面···算法)
解决方法中的第一种就是内存扩充技术
文件拷贝叫映象
基本分段存储管理方式
(动态运行时装入,链接)
(也有越界,2次比较)(引入分段因为分页安全性有问题)
引入分段存储管理方式,主要是为了满足用户的一系列要求:
1.方便编程:按逻辑关系分为若干个段,每个段从0编址,并有名字和长度,访问的逻辑地址
由段名
和段内偏移量
决定。
2.信息共享:共享是以信息
为逻辑单位,页是存储信息的物理单位,段却是信息的逻辑单位。
3.信息保护:保护也是信息
为逻辑单位。
4.动态链接:动态链接以段
为单位。
5.动态增长:实际应用中,某些段(数据段)会不断增长,前面的存储管理方法均难以实现。
(分段-二维到一维)
例1:
例2:
【590】->10位
是2不是9
log2(n+1)向上取整
分段注意4200+x<400
段页式存储管理
段表和页表还是在pcb里
段页式系统中的地址变换
1.系统中设
段表
和页表
,均存放于内存
中.读一字节的指令或数据须访问内存三次
。为提高执行速度可增设高速缓冲寄存器
。
2.每个进程一张段表,每个段一张页表.
3.段表含段号,页表始址和页表长度.页表含页号和块号.
4.进行地址变换:
先用段号
与段寄存器中的段长
进行比较,若小于段长则利用段表始址和段号找出该段页表的始址,(否则越界中断)
, 再用逻辑地址中的段内页号在页表中找到相应的块号
,最后与页内位移形成物理地址。
虚拟存储器
1.常规存储管理方式的共同点:
要求一个作业全部装入
内存后方能运行。
2.问题:
(1)有的作业很大
,所需内存空间大于内存总容量,使作业无法运行。
(2)有大量作业
要求运行,但内存容量不足以容纳下所有作业,只能让一部分先运行,其它在外存等待。
3.解决方法 (1)*增加内存容量。
(2)从逻辑上扩充内存容量
----覆盖
----对换
----虚拟存储器
引入
1.常规存储器管理方式的特征
(1)一次性
:作业在运行前需一次性地全部装入内存。将导致上述两问题。
(2)驻留性
:作业装入内存后,便一直驻留内存,直至作业运行结束。
2.局部性原理
指程序在执行时呈现出局部性规律,即在一较短时间内,程序的执行仅限于某个部分,相应地,它所访问的存储空间也局限于某个区域。
局部性又表现为时间局部性
(由于大量的循环操作,某指令或数据被访问后,则不久可能会被再次访问)和空间局部性
(如顺序执行,指程序在一段时间内访问的地址,可能集中在一定的范围之内)。
概念
1.基于局部性原理,程序在运行之前,没有必要全部装入内存,仅须将当前
要运行的页(段)
装入内存即可。
2.运行时,如访问的页(段)在内存中,则继续执行,如访问的页未在内存中(缺页或缺段),则利用OS的请求调页(段)功能
,将该页(段)调入内存。
3.如内存已满,则利用OS的页(段)置换功能
,按某种置换算法将内存中的某页(段)调至外存,从而调入需访问的页。
交换的是页/段
I/O通过中断实现外存调入内存,即请求调页/段
虚拟存储器是指仅把作业的
一部分
装入内存便可运行作业的存储管理系统,它具有请求页调入功能
和页置换功能
,能从逻辑上对内存容量进行扩充,其逻辑容量由外存容量和内存容量之和
决定,其运行速度接近于内存,成本接近于外存。
(物理上的磁盘空间虚拟化成逻辑上的内存空间)
注:外存以盘块/族为基本单位(512B)
实现方法
1、分页请求系统
在分页系统的基础上,增加了
请求调页
功能、页面置换
功能所形成的页式虚拟存储器系统。
它允许只装入若干页的用户程序和数据,便可启动运行,以后再硬件支持下通过调页功能和置换页功能,陆续将要运行的页面调入内存,同时把暂不运行的页面换到外存上,置换时以页面
为单位。
系统须设置相应的硬件支持和软件:
(1)硬件支持:请求分页的页表机制
、缺页中断机构
和地址变换机构
。
(2)软件:请求调页功能和页置换功能的软件。
2、分段请求系统
在分段系统的基础上,增加了
请求调段
功能及分段置换
功能,所形成的段式虚拟存储器系统。
它允许只装入若干段的用户程序和数据,便可启动运行,以后再硬件支持下通过请求调段功能和分段置换功能,陆续将要运行的段调入内存,同时把暂不运行的段换到外存上,置换时以段
为单位。
系统须设置相应的硬件支持和软件:
(1)硬件支持:请求分段的段表机制
、缺段中断机构
和地址变换机构
。
(2)软件:请求调段功能和段置换功能的软件。
特征
1、多次性
多次性是虚拟存储器最重要的特征。指一个作业被分成多次调入内存运行。
2、对换性
对换性指允许在作业运行过程中进行换进、换出。换进、换出可提高内存利用率。
3、虚拟性
虚拟性是指能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。虚拟性是虚拟存储器所表现出来的最重要的特征,也是实现虚拟存储器最重要的目标。
注:虚拟性以多次性和对换性为基础,而多次性和对换性又是离散分配为基础
外存地址:存的外存的盘块号,如果需要多个,只存第一个盘块号
(设备驱动程序–通信程序)
一般中断:每条指令执行完才···
(1⃣️间接寻址方式为例,一条指令最多6次中断)
请求分页中的内存分配策略和分配算法
在请求分页系统中,为进程分配内存时,将涉及以下三个问题:
1、最小物理块数的确定
(至少6块)
最小物理块数指能保证进程正常运行所需的最小的物理块数
,与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。
2、物理块的分配策略
(1)固定分配局部置换
:为每个进程分配固定数目n的物理块
,在整个运行中都不改变。如出现缺页,则从中置换一页。
(2)可变分配全局置换
(动态性):分配固定数目的物理块
,但OS自留一空闲块队列,若发现缺页,则从空闲块队列中分配一空闲块与该进程,并调入缺面于其中。当空闲块队列用完时,OS才从内存中任选择一页置换
。
(3)可变分配局部置换
(动态性):分配一定数目的物理块
,若发现缺页,则从该进程的页面中置换一页,根据该进程缺页率高低
,则可增加或减少物理块
。
3、物理块分配算法
在采用固定分配策略时,将系统中可供分配的所有物理块分配给各个进程,可采用以下几种算法:
(1)平均分配算法
:平均分配给各个进程。
(2)按比例分配算法
:根据进程的大小按比例分配给各个进程。
(3)考虑优先权的分配算法
:将系统提供的物理块一部分根据进程大小先按比例分配给各个进程,另一部分再根据各进程的优先权适当增加物理块数。
请求分页中的页面调入策略
调入策略决定什么时候将一个页面由外存调入内存,从何处将页面调入内存。
一.何时调入页面
预
调页策略
:``将那些预计在不久便被访问的页预先调入内存。这种调入策略提高了调页的效率,减少了I/O次数。但由于这是一种基于局部性原理的预测,若预调入的页面在以后很少被访问,则造成浪费,故这种方式常用于程序的首次调用(就是进程的创建)
。
2.请求调页策略
:当进程运行中访问的页出现缺页时,则发出缺页中断,提出请求调页,由OS将所需页调入内存。这种策略实现简单,应用于目前的虚拟存储器中,但易产生较多的缺页中断,且每次调一页,系统开销较大,容易产生抖动现象。
二.从何处调入页面
在请求分页系统中,通常将外存分成了文件区
和对换区
,文件区按离散
分配方式存放文件,对换区按连续
分配方式存放对换页。
1.对换区
:系统有足够的对换区空间时,运行前可将与进程相关的文件从文件区复制至对换区,以后缺页时,全部从对换区调页。(进程创建效率低,进程执行时效率高)
2.文件区
:系统没有足够的对换区空间,凡是不会被修改的文件,每次都直接从文件区调页,换出时不必换出。
3.文件区、对换区
:系统没有足够的对换区空间,对可能会修改的文件第一次调页直接从文件区,换出时换至对换区,以后从对换区调页。
4.UNIX方式
:凡未运行过的页面均从文件区调页,运行过的页面和换出的页面均从对换区调页。
程序的备份:文件区,数据从对换区调是最理想的。
请求分页中的页面置换算法
页面置换算法
也称为页面淘汰算法
,是用来选择换出页面的算法。页面置换算法的优劣直接影响到系统的效率,若选择不合适,可能会出现以下现象:
刚被淘汰出内存的页面,过后不久又要访问它,需要再次将其调入,而该页调入内存后不入又再次被淘汰出内存,然后又要访问它,如此反复,使得系统把大部分时间用在了页面的调进换出
上,而几乎不能完成任何有效的工作,这种现象称为抖动(又称颠簸
)(抖动必考)。
常用的页面置换算法:
1.最佳置换算法OPT
(但可以作为其他算法的评价优劣):选择永远不再需要的页面或最长时间以后才需要访问的页面予以淘汰。(不可行,因为基于预测)
2.先进先出置换算法FIFO
(顺序):选择先进入内存的页面予以淘汰。(物理块数与缺页率没有直接关系,即物理块数多,缺页率不一定减小,因为程序大多都是顺序执行?)(空间局部性,不太循环)
3.最近最久未使用置换算法LRU
(循环):选择最近一段时间最长时间没有被访问过的页面予以淘汰。(时间局部性)
4.*其它算法
硬件实现的,并行,所以O(1)
改进型:如果都被修改过,就又全部变为0;
最近一段时间:上次置换-这次置换
CDN:内容分发网络
页面缓冲技术:就是虚拟磁盘技术
分段保护
在分段系统中,由于每个段在逻辑上是独立,因而比较容易实现信息保护。目前分段管理的保护主要有三种:
1.地址越界保护
先利用段表寄存器中的段表长度
与逻辑地址中的段号
比较,若段号超界则产生越界中断
;再利用段表项中的段长
与逻辑地址中的段内位移
进行比较,若段内位移大于段长,也会产生越界中断
。
注:在允许段动态增长的系统中,允许段内位移大于段长。
2.访问控制保护(存取控制保护)
在段表中设置了一个存取控制字段
,用于规定对该段的访问方式
。
3.环保护机构
(windows)
在环系统中,程序的访问和调用应遵循一定的规则:
(1)一个程序可以访问同环或较低特权环中的数据
;
(2)一个程序可以调用同环或较高特权环中的服务
;