【操作系统复习】第5章 存储器管理
存储器的层次结构
存储层次
➢ CPU寄存器
➢ 主存:高速缓存、主存储器、磁盘缓存
➢ 辅存:固定磁盘、可移动介质
层次越高,访问速度越快,价格也越高,存储容量也最小
寄存器和主存掉电后存储的信息不再存在(易失性存储器)
辅存的信息长期保存(非易失性存储器)
可执行存储器:寄存器和主存储器。
主存储器:内存或主存。
寄存器:访问速度最快,与CPU协调工作,价格贵。
高速缓存:介于寄存器和存储器之间。
磁盘缓存
➢暂时存放频繁使用的一部分磁盘数据和信息;
➢缓和主存和I/O设备在速度上的不匹配;
➢利用主存的部分空间,主存可看成辅存的高速缓存。
内存又分为ROM和RAM,ROM为固化只读的。因此操作系统的存储管理模块管理的是内存中的RAM
内存可以看作是以字或字节为单位的存储单元组成的数组,每个存储单元都有自己的地址
内存的作用:存储指令和数据。程序执行时,先加载到内存。CPU执行时,从内存取指令,分析指令,如需要则从内存取操作数。执行完毕后,存储运算结果到内存
1. 内存分配和回收:为每个进程分配内存空间,并在它们不需要时回收其占据的空间。方式:①静态分配:作业运行前一次性完成;②动态分配:作业运行前和运行中逐步完成
2. 内存保护:为防止内存中程序相互干扰,要设置地址空间访问权限(读、写、执行)和越界检查机制。
3. 地址映射:将地址空间中的逻辑地址转化为内存空间中与之对应的物理地址。
4. 内存扩充(逻辑扩充):即在不改变实际内存容量情况下,借助大容量外存解决内存不足问题。
地址的概念
1. 物理地址(内存地址,绝对地址,实地址,physical address):把内存分成若干个大小相等的存储单元,每个单元给一个编号,这个编号称为物理地址。物理地址可直接寻址。
物理地址空间:物理地址的集合称为物理地址空间(内存空间),它是一个一维的线性空间。
2. 逻辑地址(相对地址,虚地址,logical address):一个源程序经编译、链接而形成可装入程序,其地址是从“0”开始的,程序中的其它地址都是相对于起始地址计算的,故称相对地址。
逻辑地址空间:由逻辑地址所形成的地址范围。可能是线性的,也可能是多维的。
1. 地址映射(address mapping):将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址。有时也称为地址变换、地址重定位。
2. 当程序装入内存时,操作系统要为该程序分配一个合适的内存空间,由于程序的逻辑地址与分配到内存物理地址不一致,而CPU执行指令时,是按物理地址进行的,所以要进行地址转换。
程序的装入和链接
程序的运行步骤
编译:由编译程序(Compiler)对源程序进行编译,形成若干个目标模块
链接:由链接程序(Linker)将目标模块和它们所需要的库函数链接在一 起,形成一个完整的装入模块(Load Module)
装入:由装入程序(Loader)将装入模块装入内存
物理地址(绝对地址)
➢ 物理内存的地址,内存以字节为单位编址
➢ 物理地址空间:所有物理地址的集合
逻辑地址(虚拟地址、相对地址)
➢ 由CPU产生的地址,即程序编译后使用的相对于0字节的地址
➢ 逻辑地址空间:由程序所生成的所有逻辑地址的集合
内存保护的实现:硬件
➢ 基地址寄存器:保存最小的合法物理内存地址(基地址)
➢ 界限寄存器:保存合法的地址范围大小(界限地址)
➢ 内存空间保护的实现
⚫ 判断“基地址≤物理地址<(基地址+界限地址)”是否成立。
程序的装入
绝对装入方式
➢ 编译时产生的地址使用绝对地址
➢ 程序或数据被修改时,需要重新编译程序
可重定位装入方式
➢ 编译后的目标模块使用相对地址
➢ 在装入时,完成重定位(静态重定位)
➢ 不需硬件支持
动态运行时装入方式
➢ 编译后的目标模块使用相对地址
➢ 在运行时,完成重定位(动态重定位)
1. 绝对装入(absolute loading)
单道程序中,由编译程序或程序员指定内存地址,装入时直接定位在上述(即文件中记录的地址)内存地址。逻辑地址和物理地址完全相同。(单一装入模块装入)
2. 优点:装入过程简单,实现容易
3. 缺点:需要有连续的空间,不适于多道程序系统
1. 可重定位装入(relocation loading)
多道程序环境中,单一装入模块中采用逻辑地址,根据当前内存情况,将装入模块装入到适当位置。操作系统装入模块进行地址映射。地址映射(地址转换)是在装入模块装入内存时一次性进行的,即采用静态重定位。以后不能更改
2. 优点:不需硬件支持,可以装入有限多道程序
3. 缺点:程序装入内存后不能移动,不易实现共享
动态运行时装入(dynamic run-time loading)
在运行过程中,程序在内存中的位置可能经常要改变!
将装入模块原样装入内存,而地址映射工作推迟到程序真正执行时才进行,即采用动态重定位。
⚫ 动态重定位:地址变换过程是在程序执行期间,随着对每条指令和数据的访问而自动进行的。
⚫ 重定位寄存器:须获得硬件地址变换机构的支持。
⚫ 程序移动特点:允许程序在运行期间在内存中移动
⚫ 优点:
– OS可以将一个程序分散存放于不连续的内存空间,可以移动程序,有利用实现共享。
– 能够支持程序执行中产生的地址引用,如指针变量(而不仅是生成可执行文件时的地址引用)。
⚫ 缺点:需要硬件支持,OS实现较复杂。
程序的链接
静态链接
➢ 在程序运行前,将各目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开
➢ 对相对地址进行修改;变换外部调用符号
链接时间:
静态链接是在生成可执行文件时进行的。
链接地址类型:
在目标模块中记录符号地址(symbolic address),而在可执行文件中改写为指令直接使用的逻辑地址。
装入时动态链接
➢ 在装入内存时,采用边装入边链接的链接方式
➢ 便于修改和更新
➢ 便于实现对目标模块的共享
1. 链接对象:程序由多个文件(模块)组成,在装入或运行时临时进行链接。通常被链接的共享代码称为动态链接库(DLL, DynamicLink Library)或共享库(shared library)
2. 时间:根据链接发生时机的不同,又分为了装入时链接(Loadtime Dynamic Linking)和运行时动态链接(Run-time Dynamic Linking)
3. 优点:由于运行时动态链接具有更高的灵活、有效性,所以成为目前流行的方式
运行时动态链接
➢ 将某些目标模块的链接推迟到执行时才执行。即在执行过程中,若发现一个被调用模块尚未装入内存时,立即由OS去找到该模块并将它装入内存,并把它链接到调用者模块上
➢ 加快装入过程,节省大量的内存空间
对换:把内存中暂时不能运行的进程或者暂时不用的程序和数据,调出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需的程序或数据,调入内存。
整体对换:对换以整个进程为单位,也称为进程对换
➢ 被广泛应用于多道程序系统,也称为处理机中级调度
页面(分段)对换:对换是以“页”或“段”为单位进行的,又统称为“部分对换”
➢ 目的是为了支持虚拟存储系统
为了实现进程对换,系统必须能实现三方面的功能
➢ 对换空间的管理
➢ 进程的换出
➢ 进程的换入
覆盖
1 解决问题→程序大小超过物理内存总和
2 程序执行时:
➢ 只在内存中保留那些在任何时间都需要的指令和数据;
➢ 程序的不同部分在内存中相互替换。
3由程序员声明覆盖结构,不需要操作系统的特别支持
4覆盖结构的程序设计很复杂
5应用于早期的操作系统
连续分配方式(简称:连续分配):是指为一个用户程序分配空间的时候,将所有程序装入到一段连续的物理内存中。在早期(20世纪60-70年代)的操作系统中,这种分配内存的方式曾经被广泛的使用。
单一连续分配
固定分区分配
固定分区主存利用率不高,使用不灵活,所以出现了可变分区
1. 改变“呆板”的分区固定为对进程特性的自适应
2. 按进程的大小动态划分分区大小(分区大小、数目可变)
空闲分区表
–每个空闲分区占用一个表项
–分区表的表项中包含分区号、分区始址及分区大小等表目
–表长不易确定
–占用额外内存
空闲分区链表
–利用各空闲分区自身的单元组成双向链表
–操作速度较慢
–克服了空闲分区表(表长不确定)的缺点
分区分配操作-内存回收
1. 合并:当一个进程(或程序)释放其所占内存区时,系统将首先检查回收区是否与其它空闲区相邻,若相邻则合并成一个空闲区,否则,将回收区插入空闲分区表(或空闲分区链)中的适当位置
2. 回收情况:
A. 只有前邻空闲区
B. 只有后邻空闲区
C. 既有前邻空闲区又有后邻空闲区
D. 没有邻接空闲区
根据不同情况,A、B、C有不同的合并策略
➢ 顺序搜索:依次搜索空闲分区链上的空闲分区,去找满足需要的空闲分区
➢ 常用到的分配算法有:
⚫ 首次适应算法(first-fit)
⚫ 下次适应算法(next-fit) 即循环首次适应法
⚫ 最佳适应算法(best-fit)
⚫ 最坏适应算法(worst-fit)
为提高空闲分区搜索速度,大中型系统往往采用基于索引搜索的动态分区分配算法:
1. 快速适应算法
2. 伙伴系统
3. 哈希算法
快速适应算法
1. 别名:分类搜索法
2. 按容量大小进行分类。将空闲分区按容量大小进行分类,每一类具有相同容量,每一类单独设立一个空闲分区链表(空闲分区的分类根据进程常用的空间大小进行划分)
3. 多个空闲分区链表。系统有多个空闲分区链表
4. 管理索引表。在内存中设立一张管理索引表,每个表项对应一类空闲分区,并记录该类空闲分区链表表头指针
优点:查找效率高;空闲分区分配时,不产生分割,能保留大分区,也不产生内存碎片
缺点:为有效合并分区,分区归还主存算法复杂,系统开销大;分配分区以进程为单位,存在浪费;以空间换取时间
伙伴系统
1. 固定分区限制了活动进程的数目,当进程大小与空闲分区大小不匹配时,内存空间利用率很低
2. 动态分区算法复杂,回收空闲分区系统开销大
3. 伙伴系统是一种折衷:
➢ 分区大小为2的k次幂,k为整数,1<=k<=m,2m是整个可分配内存的大小
➢ 将空闲分区按大小进行分类,每一类单独设立一个空闲分区双向链表
➢ 性能:分配和回收的性能取决于查找空闲分区的位置和分割、合并空闲分区的时间
➢ 时间性能:时间性能比分类搜索算法差,比顺序搜索算法好
➢ 空间性能:空间性能远优于分类搜索算法,但比顺序搜索算法略差
➢ 主要用于多处理机系统中(Linux早期版本)
连续分配方式存在的问题
➢ 碎片:不能被利用的小分区
➢ 解决方案:紧凑,要求代码和数据可以在内存中移动
➢ 紧凑:通过移动内存中的作业位置,以把原来多个分散的小分区拼接成一个大分区的方法,也叫“拼接”
动态重定位:在指令运行时,实现地址转换(相对地址转换为绝对地址)
分配算法:类似于动态分区分配算法,增加了紧凑的功能
1. 零头问题:可变式分区也有零头问题。在系统不断地分配和回收中,必定会出现一些不连续的小的空闲区,称为外零头。虽然可能所有零头的总和超过某一个作业的要求,但是由于不连续而无法分配
2. 拼接:解决零头的方法是拼接(或称紧凑),即向一个方向(例如向低地址端)移动已分配的作业,使那些零散的小空闲区在另一方向连成一片
3. 时间开销:分区的拼接技术,一方面是要求能够对作业进行重定位,另一方面系统在拼接时要耗费较多的时间
动态可重定位分区分配
1. 需硬件(重定位寄存器R)支持 ,该R中放程序在内存始址。
执行时,访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的
2. 地址变换过程是在程序执行期间,随着对每条指令和数据的访问而自动进行的,故称动态重定位
3. 进行“紧凑”处理时,不需对程序进行改动,只要修改重定位寄存器的值,即程序在内存中新的起始地址就可以
动态重定位示意图
分区的存储保护:采用保护键
按块分配,一个作业各块相连,并给该作业分配一个键号,填入该作业的各块的保护键中(这个保护键相当于锁);并把该键号置入PSW的保护键字段(相当于钥匙)。当程序执行时,如所访问的保护键与钥匙不匹配,则产生保护键违例中断
相关文章:

【操作系统复习】第5章 存储器管理
存储器的层次结构 存储层次 ➢ CPU寄存器 ➢ 主存:高速缓存、主存储器、磁盘缓存 ➢ 辅存:固定磁盘、可移动介质 层次越高,访问速度越快,价格也越高,存储容量也最小 寄存器和主存掉电后存储的信息不再存在&a…...

Python人工智能在气象中的实践技术应用
专题一 Python 和科学计算基础 1.1 Python 入门和安装 1.1.1 Python 背景及其在气象中的应用 1.1.2 Anaconda 解释和安装以及 Jupyter 配置1.1.3 Python 基础语法 1.2 科学数据处理基础库 1.2.1 Numpy 库1.2.2 Pandas 库1.2.3 Scipy 库 1.2.4 Matplotlib 和 Cartopy 库 …...

libcurl库的安装及使用说明
目录 一 libcurl库安装 ① 下载网址 ② libcurl库安装步骤 ③ libcurl等第三方库的通用编译方法 二 调用libcurl编程访问百度主页 ① 代码说明 ② 编译说明 ③ 执行说明 三 libcurl的使用说明 ① curl相关函数简介 ② curl_easy_setopt函数部分选项介绍 ③…...

【JAVAEE】手把手教学多线程,包教包会~
线程与进程为了实现多个任务并发执行的效果,人们引进了进程。何谓进程?我们电脑上跑起来的每个程序都是进程。每一个进程启动,系统会为其分配内存空间以及在文件描述符表上有所记录等。进程是操作系统进行资源分配的最小单位,这意…...

基于ChatGPT API的PC端软件开发过程遇到的问题的分析
如果喜欢本文章,记得收藏哦! 关注我,一起学Java。 一、基于ChatGPT API的PC端软件开发过程遇到的问题的分析 最近这个OpenAI公司推出的GPT-4.0模型真是太火了。当然由于OpenAI目前还没有正式全面对外开放GPT-4.0 API,所以本次使用…...

啥是插入排序 ?
一、概述 排序是算法中的一部分。所以我们学习排序也是算法的入门,为了能让大家感受到排序是算法的一部分,我举个例子证明一下:比如麻将游戏,发完牌之后需要对手上的牌进行排序,大家想想,麻将排序如何排呢…...

华为OD机试题 Q2 押题【贪心的商人 or 最大利润】用 C++ 编码,速通
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:贪心的商人 or 最大利润 题目…...

spring框架注解
3.Spring有哪些常用注解呢? Spring常用注解 Web: Controller:组合注解(组合了Component注解),应用在MVC层(控制层)。 RestController:该注解为一个组合注解,相当于Con…...

前端如何处理文本溢出
前言 在现代网页设计中,文本是网页中最重要的内容之一。然而,当文本超出其容器的大小时,会发生文本溢出的问题。文本溢出不仅会影响网页的视觉效果,还会影响网页的可读性和可用性。在前端开发中,解决文本溢出的问题是…...

vue elementUI select下拉框设置默认值(赋值)失败
vue elementUI select下拉框设置默认值 要为select下拉框设定默认值,只需要把 v-model 绑定的值和你想要选中 option 的 value 值设置一样即可。 下面上代码: html部分代码: <el-select v-model"valuetype" change"ch…...

TensorRT创建Engine并推理engine
1. 验证集数据集 Class Images Labels P R mAP.5 mAP.5:.95: 100%|██████████| 84/all 1000 28423 0.451 0.374 0.376 0.209pedestrians 1000 17833 0.737 0.855 0.88 …...

生成式人工智能所面临的问题有哪些?
在生成式人工智能中工作需要混合技术、创造性和协作技能。通过发展这些技能,您将能够在这个令人兴奋且快速发展的领域应对具有挑战性的问题。 生成式人工智能是指一类机器学习技术,旨在生成与训练数据相似但不完全相同的新数据。 换句话说,…...

代码随想录算法训练营第四十三天 | 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
打卡第43天,01背包应用。 今日任务 1049.最后一块石头的重量 II494.目标和474.一和零 1049. 最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头࿰…...

PostCSS 让js可以处理css
GitHub 中文readmie PostCSS 中文网(建设中) PostCSS 不是样式预处理器 是 CSS 语法转换的工具,但不严格遵循css规范,只要符合css语法规则就可以被处理。这也让提前实现新提案成为可能。 使用 webpack 中使用 postcss-loader …...

【C语言进阶:自定义类型详解】位段
本节重点内容: 什么是位段位段的内存分配位段的跨平台问题位段的应用⚡什么是位段 位段的声明和结构是非常类似的,但是有两个不同: 位段的成员必须是 int、unsigned int 或signed int 。位段的成员名后边有一个冒号和一个数字。 struct A…...

十三、RNN循环神经网络实战
因为我本人主要课题方向是处理图像的,RNN是基本的序列处理模型,主要应用于自然语言处理,故这里就简单的学习一下,了解为主 一、问题引入 已知以前的天气数据信息,进行预测当天(4-9)是否下雨 日期温度气压是否下雨4-…...

五子棋透明棋盘界面设计(C语言)
五子棋透明棋盘设计,漂亮的界面制作。程序设置双人对奕,人机模式,对战演示三种模式。设置悔棋,记录功能,有禁手设置。另有复盘功能设置。 本文主要介绍透明的玻璃板那样的五子棋棋盘的制作。作为界面设计,…...

Redis第六讲 Redis之List底层数据结构实现
List数据结构 List是一个有序(按加入的时序排序)的数据结构,Redis采用quicklist(双端链表) 和 ziplist 作为List的底层实现。可以通过设置每个ziplist的最大容量,quicklist的数据压缩范围,提升数据存取效率 list-max-ziplist-size -2 // 单个ziplist节点最大能存储 8kb ,…...

电子学会2023年3月青少年软件编程python等级考试试卷(四级)真题,含答案解析
目录 一、单选题(共25题,共50分) 二、判断题(共10题,共20分) 三、编程题(共3题,共30分)...

【MATLAB】一篇文章带你了解beatxbx工具箱使用
目录 一篇文章带你了解beatxbx工具箱使用 一篇文章带你了解beatxbx工具箱使用 clc;clear; tic; % step1 初始化 % 个体数量 NIND = 35; % 最大遗传代数 MAXGEN = 180; % 变量的维数 NVAR = 2; % 变量的二进制位数 % 上下界 bounds=[-10 10-10 10]; precision=0.0001; %运算精度…...

【LinuxC Sqlite数据库小项目】基于Sqlite的打卡系统------适合初学者练手的小项目
最近小哥老是想浪,不想好好学习,这不行啊,得想点办法,多少做点努力,于是就自己给自己写了个打卡程序; 该程序基于Sqlite数据库,实现一个简单的打卡功能,该函数具有自动初始化的功能…...

在掌握C#基础上再学习C语言
C#和C语言虽然名字相似,但它们在很多方面都有很大的区别。 首先,C#是一种面向对象的语言,而C语言是过程化的语言。这意味着C#具有更丰富的语言特性,如类、接口、继承和多态性等,而C语言则更侧重于直接对计算机硬件进行…...

HTML5 <body> 标签
HTML <body> 标签 实例 一个简单的 HTML 文档,包含尽可能少的必需的标签: <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>文档标题</title> </head><body> 文档内容…...

(链表)反转链表
文章目录前言:问题描述:解题思路:代码实现:总结:前言: 此篇是针对链表的经典练习。 问题描述: 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1…...

deb文件如何安装到iphone方法分享
Cydia或同类APT管理软件在线安装 Cydia或同类APT管理软件在线安装,这个是最佳的安装方式,因为通常无需考虑依赖关系,但缺点是对网络的要求比较高;命令行中以dpkg-iXXX.deb的形式安装,好处是可以以通配符一次性安装多个deb,而且也可以直接看到脚本的运行状况和安装成功/失…...

mongodb和mysql双写数据一致性问题
文章目录 我们是如何用MongoDB的如何保证双写一致性?先写数据库,再写MongoDB先写MongoDB,再写数据库用户修改操作如何保存数据如何清理新增的垃圾数据定时删除随机删除我们是如何用MongoDB的 MongoDB是一个高可用、分布式的文档数据库,用于大容量数据存储。文档存储一般用…...

Databend 开源周报第 88 期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.com 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 Support Eager…...

Vue3学习笔记(9.4)
Vue3自定义指令 除了默认设置的核心指令(v-model和v-show),Vue也允许注册自定义指令。 下面我们注册一个全局指令v-focus,该指令的功能是在页面加载时,元素获得焦点: <!--* Author: RealRoad10834252…...

导入 Excel 文件时,抛出 413 (Request Entity Too Large) 错误
Excel文件大小:8MB 异常信息:413 (Request Entity Too Large) 环境:IIS10PHP7.2.33 依次检查如下几项: 一、php.ini Maximum amount of memory a script may consume (128MB) 限制代码消耗的最大内存,默认128…...

Verilog学习笔记1——关键词、运算符、数据类型、function/task、initial/always、generate
文章目录前言一、关键词二、运算符三、数据类型1、基本类型:reg、wire、integer、parameter四、条件语句五、循环语句1、for2、generate六、function和task七、initial和always1、initial和always相同点和区别2、always和assign语句区别前言 2023.4.4 2023.4.7 补充…...