技术开发站45793.com
操作系统 第五章 存储器管理
发布时间:
2023年12月30日
1 存储器的层次结构
1 多层结构的存储器
多层结构
是为了解决存储器的速度和容量之间的矛盾。在计算机系统中,存储器被组织成多层结构,包括寄存器、高速缓存、主存和辅存等。
可执行存储器
CPU
寄存器
和
主存
又被称
为可执行存储器
,其中的信息在掉电后
不复存在
。但是辅存中的信息可以长期保存。
对于可执行存储器和辅存,计算机访问的机制是不同的。
程序需要从辅存中载入可执行存储器才可以执行,访问辅存的时间远大于访问可执行存储器的时间。
可执行存储器的访问速度快,但容量小,而辅存的访问速度慢,但容量大。
存储器的访问
CPU首先会在
寄存器
中查找数据,如果没有找到,那么它会在
高速缓存
中查找,如果还是没有找到,那么它会在
主存
中查找,最后在
辅存
中查找。这种多层次的存储器结构可以有效地平衡存储器的速度和容量。
2 主存储器和寄存器
主存储器
含义
简称
内存或主存
,用于保存
进程运行时
的
程序和数据
。
工作原理
通常处理机都是从
主存
储器中取得指令和数据的,并将其所得的指令放入
指令寄存器
,而将其所读取的数据装入到
数据寄存器
中。或者反之,将寄存器中的数据存入到主存储器。
问题
主存的访问速度虽然也很快,但是还不够匹配 CPU 执行指令的速度,因此在计算机系统中引入了
寄存器
和
高速缓冲存储器
(Cache)
寄存器
含义
寄存器是计算机中最小的存储单元,位于
CPU
内部
,用于存储
正在执行的
指令、数据和地址等。
工作原理
寄存器具有与处理机相同的速度,故对寄存器的访问速度最快,完全能与 CPU 协调工作,价格昂贵,容量小。寄存器的主要功能是提供一个临时存储空间,以便 CPU 在执行指令时能快速地获取数据。
3 高速缓存和磁盘缓存
高速缓存
含义
高速缓冲存储器
介于
寄存器和存储器之间,主要用于
备份
主存中常用的数据,以
减少
处理机对主存储器的访问次数,大幅
提高
程序执行速度。
工作原理
当CPU需要读取主存中的数据时,会先在高速缓存中查找。如果找到(称为
缓存命中
),则直接读取;如果没有找到(称为
缓存未命中
),则从主存中读取数据,并将读取的数据存入高速缓存,以便下次使用。
特点
高速缓存的容量
远大于
寄存器。而又比内存约小到三个数量级,容量一般为
几十KB到几MB
,访问速度快于内存。
磁盘缓存
含义
磁盘缓存是一种存储技术,用于暂时存放
频繁使用
的一部分磁盘数据和信息,以减少访问磁盘的次数,提高数据访问速度。
工作原理
为了缓和磁盘与主存的访问速度差异,设置了磁盘缓存。当操作系统需要读取磁盘上的数据时,会先在磁盘缓存中查找。如果找到(称为缓存命中),则直接读取;如果没有找到(称为缓存未命中),则从磁盘中读取数据,并将读取的数据存入磁盘缓存,以便下次使用。磁盘缓存不是实际存在,而是利用
主存中的部分存储空间存放磁盘中的信息
。
2 程序的装入与链接
用户程序变为可执行程序需要经过的步骤
源代码
编译
:首先,程序员编写的源代码需要通过
编译器
转换为
目标代码
,也就是机器语言。
链接
:
链接器
将编译生成的目标代码与
其他库代码
进行链接,生成
可重定位的目标代码
。
加载
:
加载器
将可重定位的目标代码
加载到内存中
,生成
可执行代码
。
地址绑定和内存保护
地址绑定
将程序中的
逻辑地址
转换为
物理地址
的过程。
在编译和链接阶段,程序中的地址是
逻辑地址
,也就是
相对于程序的偏移地址
。
在加载阶段,逻辑地址被转换为物理地址,也就是在内存中的实际地址。
内存保护
为了防止一个程序访问其他程序的内存空间,从而保证系统的稳定和安全。操作系统通过设置内存保护位,限制程序对内存的访问。
程序的装入
绝对
—适用于
单道程序
环境
如果计算机系统很小,仅能运行单道程序,完全可以事先知道程序将存入内存的什么位置。此时编译过程中可以直接产生
绝对地址
的目标代码,不需要对程序和数据的地址进行修改。
优点:装入过程简单
缺点:不适用多道程序系统
可重定位
—适用于
多道程序
环境
在多道程序的环境下,编译程序
不可能预知
目标模块放入内存的地址,因此编译后形成的若干个目标模块的起始地址通常都是 0。
装入程序会将模块中的相对地址与程序在内存中的起始地址相加,得到程序的物理地址再装入程序。
这种方法通常在装入程序后便不再对程序的地址进行修改,因此也称为静态重定位方式
优点:不适用多道程序系统,无需硬件支持
缺点:不允许程序运行时在内存中移动位置
动态运行时
解决静态重定位方式的缺点,无法不允许程序在运行时移动位置。
动态运行时的装入程序在把装入模块装入内存后,并不立即把装入模块中的逻辑地址转换为物理地址,而是把这种地址转换推迟到程序真正要执行时才进行。装入内存后的所有地址都仍是逻辑地址。为使地址转换不影响指令的执行速度,这种方式需要一个重定位寄存器的支持。
优点:允许程序运行时在内存中移动位置
缺点:需要硬件支持
程序的链接
含义
源程序经过编译后,可得到一组目标模块。链接程序将这组目标模块以及它们所需要的库函数装配成一个完整的装入模块,并且将个目标模块中的相对地址和外部调用符号转换成装入模块中的相对地址。
分类
静态链接
在程序运行之前,先将各目标模块以及它们所需的库函数链接成一个完整的装配模块,以后便不再拆开
装入时动态链接
优点:① 便于修改和更新 ② 便于实现对目标模块的共享
链接在装入时进行,即在装入一个目标时,若发生一个外部模块的调用事件,则由装入程序去找出相应的外部模块,将它装入内存,并把它链接到调用者模块上。在装入或运行时进行链接。通常被链接的共享代码称为动态链接库(DLL,Dynamic-Link Library)或共享库(shared library)
运行时动态链接
链接在运行时进行,即在执行过程中,当发现一个被调用模块还没装入内存时,立即由 OS 找出该模块,将它装入内存,并把它链接到调用者模块上。在执行过程中未被用到的目标模块,都不会被调入内存和链接。
?优点:加快程序的装入过程,节省内存空间
3 对换与覆盖
对换
含义
对换是指将内存中暂时不能运行的
进程
或者暂时不用的
程序
和
数据
换出到外存上,以使腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据换入内存。
引入
对换主要是为了
解决资源浪费
的问题。在内存中有进程因为某些事件导致被阻塞,它占了大量的内存空间,甚至导致其它进程也都被阻塞。引入对换就是为了腾出足够的空间,给其它可以运行的程序运行
2
。
类型
整体对换
:以
进程
作为对换单位,用于多道程序系统中,并作为处理机的中级调度
3
。
部分对换
:以
页面
或
分段
作为对换单位,是请求分页与请求分段式存储管理的基础
3
。
作用
提高
系统的吞吐量,
减少
资源浪费,使得更多的进程可以
同时
在内存中运行
3
。
对换区的管理
对换区管理的主要目标
文件区
管理的主要目标
文件区占用磁盘空间的大部分,用于存放各类文件。由于通常的文件都是较长时间地驻留在外存上,对它访问的频率是较低的,故对文件区管理的主要目标是
提高
文件存储空间的
利用率
,然后才是
提高
对文件的
访问速度
。
对换区
管理的主要目标
对换空间只占用磁盘空间的小部分,用于存放从内存换出的进程。由于这些进程在对换区中驻留的时间是短暂的,并且对换操作的频率很高,故对对换空间管理的主要目标,是
提高
进程换入和换出的速度
,然后才是
提高
文件存储空间的利用率
。
对换区空闲盘块管理中的
数据结构
为了实现对对换区中的空闲盘块的管理,在系统中应配置相应的数据结构,用于记录外存对换区中的空闲盘块的使用情况。其数据结构的形式与内存在动态分区分配方式中所用数据结构相似,即同样可以用
空闲分区表
或
空闲分区链
。
对换区的分配与回收
由于对换分区的分配采用的是
连续分配方式
,因而对换空间的分配与回收与动态分区方式时的内存分配与回收方法雷同。其分配算法可以是
首次
适应算法、
循环首次
适应算法或
最佳
适应算法等。
进程的换出与换入
进程的换出
原因
????- 阻塞式系统调用、虚拟地址异常,导致被中断进程进入等待态。
????- 终止用系统调用、不能继续执行的异常,导致被中断进程进入终止态。
????- 时间片中断、I/O中断后发现更改优先级进程,导致被中断进程进入就绪态。
过程
????- 保存之前运行的进程上下文,包括PC寄存器(指向当前运行时的进程)、PSW(程序状态寄存器,记录计算的结果以及一些控制信息)以及处理器的堆栈指针SP(用来记录当前运行进程的PCB控制信息)。
????- 将PC寄存器,PSW以及其他相关寄存器的数据存入进程的私有堆栈中,以及SP存入PCB中。
进程的换入
原因
????- 当操作系统完成了进程创建的必要操作,并且当前系统的性能和虚拟内存的容量均允许,新建态进程会变为就绪态。
????- 当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,运行态进程会变为终止态。
????- 运行时间片到或出现有更高优先权进程,运行态进程会变为就绪态。
????- 等待使用资源,如等待外设传输或等待人工干预,运行态进程会变为等待态。
过程
????- 调用准备运行的进程的上下文,将PCB信息存入SP中。
????- 从即将运行的进程的私有堆栈中恢复各个处理器寄存器的数据。
????- CPU使用权交接,即从正在运行的进程中收回CPU的使用权利,交给下一个要运行的进程。
覆盖
含义
覆盖是一种技术,它要求程序员必须把一个程序划分成
不同的程序段
,并规定好它们的
执行
和
覆盖
顺序,操作系统根据程序员提供的覆盖结构来完成程序段之间的覆盖。
作用
在内存有限的情况下,使得更大的程序可以运行。通过将程序划分为
多个段
,并在运行时只加载
需要的段
,可以使得程序的总体大小超过物理内存的大小。
优点
可以有效地
利用
有限的内存资源,使得更大的程序可以在有限的内存中运行。此外,覆盖技术还可以
提高
内存的利用率,因为在任何时候,内存中只需要存储正在使用的程序段。
缺点
增加了程序的
复杂性
。程序员需要明确地指定程序的覆盖结构,这可能会使得程序的编写和维护变得更加困难。此外,覆盖技术还可能导致程序的执行速度降低,因为在运行时需要频繁地加载和卸载程序段。
4 连续分配
含义
是一种内存管理方式,它要求每个进程在内存中占用
一块连续
的空间。
分类
1
单一连续
分配
在早期的
单道程序环境
下,存储器管理将内存分为两个部分:
系统区
和
用户区
。系统区仅供
操作系统
使用,通常放在内存的
低地址
部分。用户区是系统区以外的全部内存空间,提供给
用户
使用。在这种方式下,内存中只能装入
一道用户程序
。
2
固定分区
分配
将用户空间划分为若干个固定大小的区域,在每个分区中只装入一道作业。这样可以在内存中装入多道程序,并且程序之间互不干扰,可以并发运行。分区的大小可以相等,也可以不等。
相等的分区大小缺乏灵活性,可能会造成空间浪费或无法装入大程序。
不等的分区大小可以根据程序大小划分区域,增加存储器的分配灵活性。
为了方便内存分配,通常将分区按大小进行排队,并为之建立一张分区使用表。
3
动态分区
分配
允许分区的大小在
运行时动态改变
。当一个进程需要更多的内存时,可以从空闲内存中分配;当一个进程释放内存时,可以将其归还给系统。这种方式可以更有效地利用内存,但需要复杂的内存管理算法来避免内存碎片问题。
4
动态重定位分区
分配
是一种特殊的动态分区分配方式,它允许进程在运行时移动位置。这种方式需要硬件的支持,例如内存管理单元(MMU)和地址转换硬件。
文章来源:https://blog.csdn.net/weixin_54727590/article/details/135305743
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!
最新文章
Python教程
深入理解 MySQL 中的 HAVING 关键字和聚合函数
Qt之QChar编码(1)
MyBatis入门基础篇
用Python脚本实现FFmpeg批量转换
python中tkinter/gui可视化界面
二分查找法(java版)
RabbitMQ:概念和安装,简单模式,工作,发布确认,交换机,死信队列,延迟队列,发布确认高级,其它知识,集群
linux tty驱动实例
EDG浏览器:解决问题的全新选择
3rd 库(x86, linux)的编译,源码目录
如何把视频转换成gif动图?
imazing 2.17.16中文版怎么备份iPhone手机照片
行为型设计模式—观察者模式
Unity中URP下获取额外灯数量