【操作系统】第四、五章 存储器管理和虚拟存储器

一、存储器的层次结构
存储部件的层次
CPU寄存器
————————
高速缓存:一种比内存块的存储设备。将短时间内经常访问的部分数据从内存放到高速缓存中,减少CPU访问内存的时间,是基于程序局部性。
————————
主存 :保存进程运行时的程序和数据
磁盘缓存:内存的一部分,将频繁使用的一部分磁盘数据信息预读入在磁盘缓存,
减少磁盘读写时间
————————
磁盘
可移动介质
1.程序的装入和链接
创建进程的第一件事:将程序和数据装入内存。
(1)程序进入内存的一般过程
a.编译程序:将用户源代码编译成若干个目标模块
b.链接程序:将形成的一组目标模块及它们需要的库函数链接在一起,形成一个完整的装入模块
c.由装入程序将装入模块装入内存,构造PCB,形成进程,开始运行(使用物理地址)。
(2)程序装入中的地址处理
1)绝对装入方式:逻辑地址 == 物理地址
编译程序生成的“目标代码”就是”装入模块” ,逻辑地址直接从某个地址R处增长,装入模块直接装入内存地址R处。
2)静态可重定位装入方式:逻辑地址 -》重定位-》 物理地址
地址映射在程序执行之前进行,重定位后物理地址不再改变
装入时根据所定位的内存地址去修改每个逻辑地址,添加相应偏移量,重定位为物理地址
3)动态运行时(重定位)装入方:逻辑地址 -》重定位-》 物理地址
程序装入内存时,可多次重定位到不同位置。且可以不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行(运行时才修改地址)。
(3)不同的程序链接装入方式(使用内存的时机)
装入是使用内存的开始,但链接的不同会使内存的使用有差别:
根据链接时间的不同,分成三种:
a.静态链接:装入运行前将多个目标模块及所需库函数链接成一个整体,以后不再拆开。
b.装入时动态链接:装入内存时,边装入边链接的链接方式。
c.运行时动态链接:对某些目标模块的链接,在执行中需要该目标模块时,才对它进行链接。
二、连续分配存储管理方式
1.单一连续分配
内存分为系统区和用户区两部分。
只能用于单用户、单任务的操作系统中。
2.固定分区分配
把内存分为一些大小相等或不等的分区,每个应用进程占用一个分区。操作系统占用其中一个分区。支持多个程序并发执行,适用于多道程序系统和分时系统。
(1)建立一记录相关信息的分区表(或分区链表)
分区表中,表项值随着内存的分配和释放而动态改变
也可将分区表分为两个表格:空闲分区表/占用分区表。
(2)固定分配的不足
a.产生内碎片
b.分区总数固定,限制并发执行的程序数目
3.动态分区分配
分区的大小不固定:在装入程序时根据进程实际需要,动态分配内存空间,即——需要多少划分多少。
产生外碎片
分区分配算法:
(1)首次适应算法FF
空闲分区排序:以地址递增的次序链接。
检索:分配内存时,从链首开始顺序查找直至找到一个大小能满足要求的空闲分区;
分配:从该分区中划出一块作业要求大小的内存空间分配给请求者,余下的空闲分区大小改变仍留在空闲链中。
优点:优先利用内存低址部分,保留了高地址部分的大空闲区;
缺点:但低址部分不断划分,会产生较多小碎片;而且每次查找从低址部分开始,会逐渐增加查找开销。
(2)循环首次适应算法 (next-fit)
检索:从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区。为实现算法,需要:
设置一个起始查寻指针
采用循环查找方式
优点:空闲分区分布均匀,减少查找开销
缺点:缺乏大的空闲分区
(3)最佳适应算法 (best-fit)
空闲分区排序:所有空闲分区按容量从小到大排序成空闲分区表或链。
检索:从表或链的头开始,找到的第一个满足的就分配
缺点:每次找到最合适大小的分区割下的空闲区也总是最小,会产生许多难以利用的小空闲区(外碎片)
(4)最差适应算法/最坏匹配法(worst-fit)
基本不留下小空闲分区,但会出现缺乏较大的空闲分区的情况。
(5)快速适应算法
根据进程常用空间大小进行划分,相同大小的串成一个链,需管理多个各种不同大小的分区的链表。进程需要时,从最接近大小需求的链中摘一个分区。
4.动态重定位分区分配——有紧凑功能的动态分区分配
5.内存空间管理之对换
当内存空间还是满足不了需求时,引入“对换”
按对换单位分类:
整体对换(或进程对换):以整个进程为单位(连续分配)
页面对换或分段对换:以页或段为单位(离散分配)
三、基本分页存储管理方式
1.
(1)内存划分成多个小单元,每个单元K大小,称**(物理)块**。
作业也按K单位大小划分成片,称为页面
物理划分块的大小 = 逻辑划分的页的大小
(2)要找到作业A
关键是找到页表(PCB)
根据页表找物理块
(3)作业相对地址在分页下不同位置的数有一定的意义结构:
页号+页内地址(即页内偏移)
页面大小决定偏移量(页内地址)的位数 n;
作业大小-》页面数量
页表长度 a
页号的位数 m(或总位数-页内位数)
内存容量决定块数,块数决定编址位数,即页表项位数 b。

(4)设置一个页表寄存器PTR(page table register)记录页表在内存中的首地址和页表长度,运行时快速定位页表
(5)在这里插入图片描述
(6)快表放正在执行进程的页表的数据项。
在这里插入图片描述
(7)两级页表
外页号 | 页在外页内的偏移 | 页内地址
外页偏移量与页表项大小有关。
四、基本分段存储管理方式
分段存储管理:作业分成若干段,各段可离散放入内存,段内仍连续存放。
(1)段的特点
a.每段有自己的名字(一般用段号做名),都从0编址,可分别编写和编译。装入内存时,每段赋予各段一个段号。
b.每段占据一块连续的内存。(即有离散的分段,又有连续的内存使用)
c.各段大小不等
(2)地址结构:段号 + 段内地址
段表:记录每段实际存放的物理地址
五、段页式存储管理方式
(1)基本原理
将用户程序分成若干段,并为每个段赋予一个段名。
把每个段分成若干页
地址结构包括段号、段内页号和页内地址三部分
段号 | 段内的页号 | 页内偏移(页内地址)
(2)三次访问内存
根据段号检索段表
页表
内存中实际数据
六、虚拟存储器
1.程序执行的局部性:
时间局部性
空间局部性
2.虚拟存储器的定义
(1)是指具有请求调入功能置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。
(2)虚拟存储管理:允许将一个作业分多次调入内存。
若采用连续分配方式,需申请足够空间,再分多次装入,造成内存资源浪费,并不能从逻辑上扩大内存容量。
(3)虚拟存储器的特征:离散分配方式是基础
多次性、对换性、虚拟性
3.请求分页式存储管理方式
(1)硬件支持
基本分页 + “请求调页”和“页面置换”功能。
换入和换出基本单位都是长度固定的页面
1)页表的基本功能不变:逻辑地址映射为物理地址
页号 | 物理块号 | 状态位P | 访问字段A | 修改位M | 外存地址
状态位P:指示该页面是否已调入内存 (调入内存1,否则0)
访问字段A :用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问。(置换时考量的参数)
修改位M :该页在调入内存后是否被修改过。(关系到置换时调出的具体操作)
2)缺页中断机构:
每当要访问的页面不在内存时,便产生一缺页中断通知OS,OS则将所缺之页调入内存。作为中断,需经历几个步骤:
“保护CPU环境”
“分析中断原因”
“转入缺页中断处理程序”
“恢复CPU环境”等。
3)地址变换机构
分页系统地址变换机构的基础上增加:
产生和处理缺页中断(请求调入)
从内存中换出一页的功能(置换)
(2)内存分配
1)物理块的分配策略
a.固定分配、局部置换
为每个进程分配一定数目的物理块,在整个运行期间不再改变(基于进程的类型,或根据程序员、程序管理员的建议)
运行中缺页时,只能从该进程内存中n个页面中选出一页换出,然后再调入一页。
b.可变分配、全局置换
先为每个进程分配一定数目的物理块
OS管理一个空闲物理块队列,发生缺页时,系统从队列中取出一块分配给该进程,将欲调入的页装入(动态增长型,全局空闲空间都可分配使用)
空闲空间不足时,可与其他任何进程页面置换。“会使其他进程缺页率提高,影响运行”
c.可变分配、局部置换
为每个进程分配一定数目的物理块
缺页时,只允许换出该进程在内存的页面,不影响其他进程执行。
根据缺页率增减进程的物理块数:若频繁缺页中断,则系统再为进程分配若干物理快;若缺页率特别低,则适当减少分配给该进程的物理块。
2)物理块的分配算法
固定分配策略时,分配物理块可采用以下几种算法:
a.平均分配算法
将所有可供分配的物理块平均分配给各进程。
缺点:未考虑各进程本身的大小,利用率不均。
b.按比例分配算法
根据进程的大小按比例分配物理块。
4.页面置换算法
(1)进程运行过程中,访问的页面不在内存,调入时内存已无空闲空间,需要将内存中的一页程序或数据调到外存。
(2)缺页率=页面调入次数(缺页次数)/总的页面使用次数
(3)
a.最佳Optimal置换算法
换出以后永不再用的,或在最长(未来)时间内不再被访问的页面。作为参照标准,评价其他算法。
b.先进先出置换算法(FIFO)
先进入的先淘汰,即选择内存中驻留时间最久的页面予以淘汰。(队列)
Belady现象:出现分配的页面数增多,缺页率反而提高的异常现象。
Belady现象的原因:FIFO算法的置换特征与进程访问内存的动态特征矛盾,即被置换的页面并不是进程不会访问的。
c.最近最久未使用(LRU)置换算法
1)寄存器记录时间的原理
页面被访问后的操作:
将该页对应的寄存器的Rn-1位置为1
2)栈记录时间的原理
某页面被访问,便将该页面的页面号从栈中移出,将它压入栈顶。因此:栈顶始终是最新被访问页面的编号,越久未使用,页面越被压在栈底。
d.轮转算法(clock)(最近未使用算法(NRU, Not Recently Used))
每个页设一个使用标志位(use bit),若该页被访问则将其置为1。
设置一个指针,从当前指针位置开始按地址先后检查各页,寻找use bit=0的页面作为被置换页。
若指针经过的页use bit=1,修改use bit=0(暂不凋出,给被用过的页面驻留的机会 ),指针继续向下。到所有页面末尾后再返回队首检查。
e.其他置换算法
1)最少使用 (LFU, Least Frequently Used)
每页设置访问计数器,每当页面被访问时,该页面的访问计数器加1;缺页中断时,淘汰计数值最小的页面,并将所有计数清零;
2)页面缓冲算法PBA(page buffering algorithm)
仍用FIFO算法选择被置换页但并不将其马上换入外存。
系统将页面放入两个链表之一:如果页面未被修改,就将其归入到空闲页面链表的末尾;否则将其归入到已修改页面链表。
需要调入新的物理页面时,将新页面内容读入到空闲页面链表的第一项所指的页面,然后将第一项删除(从空闲链表摘下)。
空闲页面和已修改页面,仍停留在内存中一段时间,如果这些页面被再次访问,只需较小开销,而被访问的页面可以返还作为进程的内存页。
当已修改页面达到一定数目后,再将它们一起调出到外存,然后将它们归入空闲页面链表,这样能大大减少I/O操作的次数。
(4)影响缺页率的主要因素
a.分配给作业的主存块数:
多则缺页率低,反之则高。
b.页面大小:
大则缺页率低;反之则高。
c.页面调度算法:
对缺页中断率影响很大,但不可能找到一种最佳算法。
d.程序编制方法:
(5)抖动
根本原因:
页面淘汰算法不合理;分配给进程的物理页面数(驻留集)太少。
工作集:某段时间间隔中,进程实际要访问的页面的集合。
驻留集>工作集可使进程顺利的运行。
5.请求分段存储管理方式
(1)硬件支持
a.段表机制
b.缺段中断机构
c.地址变换机构
基于分段系统地址变换机构的基础
段调入内存
修改段表
再利用段表进行地址变换。

猜你喜欢

转载自blog.csdn.net/sun_sxq/article/details/84404711