当前位置: 首页 > news >正文

软考笔记--操作系统-内存管理

任何程序和数据都必须占用内存空间后才能执行,因此,内存管理的好坏直接影响整个操作系统的性能。操作系统的任务之一是尽可能地方便用户使用和提高内存的利用率。同时,内存管理也是多道程序设计系统的关键支撑。内存管理的功能主要包括以下几个方面:

  1. 内存空间的分配与回收。
  2. 配合硬件进行地址转换工作,把用户使用的逻辑地址转换成处理器能访问的物理地址。
  3. 内存空间的共享与保护,使得若干个进程能够同时访问公共程序所占的内存区,同时能够防止多个程序在执行中互相干扰,并保护区域内的信息不被破坏。
  4. 当内存容量不足时,操作系统要采取某种措施,在不改变实际内存容量的前提下,借助大容量的外存来解决内存不够用的问题。

一.地址变换 

 用户的程序通常使用高级语言编写的,这个称为源程序。源程序不能被计算机直接执行,而是需要通过编译程序或汇编程序编译获得目标程序。目标程序的地址不是内存的实际地址,一般将目标程序的地址单元称为逻辑地址。程序运行的时候,它将被装入内存地址空间的某些部分,此时程序和数据的实际地址一般不可能与原来的逻辑地址一样,将内存中的实际存储单元称为物理地址。物理地址的总体构成了用户实际程序运行的物理地址空间,它是由存储器地址总线扫描出来的空间,其大小取决于实际安装的内存容量。

为了保证程序的正确运行,必须将程序和数据的逻辑地址转换为物理地址,这一工作称为地址转换。地址转换的公式表示为:物理地址=起始的物理地址+逻辑地址。

地址转换通常有两种方式,静态转换和动态转换

静态转换是指在作业装入时由作业装入程序实现地址转换。其特点是容易实现,无需增加硬件地址变化机构,缺点是:它要求为每一个程序分配一个连续的存储区,在程序执行期间不能移动,难以做到程序和数据的共享,内存利用率低。

动态转换是指在程序执行过程中,CPU访问程序和数据之前实现地址转换。在多道程序系统中,可以用的内存空间常常被许多进程共享,程序员编程时事先不可能知道程序执行时的位置,而且必须允许程序因对换或空间搜集而被移动,这些现象都需要程序的动态重定位。动态转换的优点是程序可以在内存中移动,程序移动后,只要将新的内存区域的首地址放进基址寄存器就可以了,动态转换方式容易实现程序的共享,有可能提供虚拟存储空间。

二.分区存储管理

分区管理是支持多道程序运行的最简单的一种内存管理方式,主要有固定分区,可变分区,可重定位分区和多重分区四种方式。

1.固定分区

固定分区也称为静态分区,是在作业装入之前,内存就被划分为若干个分区。划分工作可以由系统管理员完成,也可以由操作系统完成。一旦划分完成,在系统运行期间不再重新划分。

固定分区的主要优点是实现技术简单,适用于作业的大小和多少事先都比较清楚的系统中,其缺点是由于每个分区只能存放一个作业,所以内存的利用率不高,内存碎片多。

2.可变分区

可变分区也称为动态分区,是指在作业装入内存时,从可用的内存中划出一块连续的区域分配给它,形成一个新的分区,且分区大小正好等于该作业的大小。可变分区中分区的大小和分区的个数都是可边的,而且是根据作业的大小动态划分的。这种内存管理技术是固定分区的改进,可以获得较大的灵活性,提高了内存利用率。

可变分区在分配时,首先找到一个足够大的空闲分区(自由分区),即这个空闲区的大小比作业要求的要大,系统则将这个空闲分区分成两个部分,一部分成为己分配的分区,剩余的部分仍作为空闲区。

几种可变分区选择自由分区的分配策略

(1)首次适应算法。从空闲区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法的目的在于减少查找时间。

(2)最佳适应算法。它从全部空闲区中找出能满足作业要求的,且最小的空闲区,这种方法能是碎片尽量小。

(3)最坏适应算法。从所有未分配的分区中挑选最大的且大于和等于作业大小的分区给要求的作业,空闲区按由大到小排序,每次查找从链头开始。

在针对存储空间利用情况的三种策略中,首次适应算法可能比最佳适应算法好,而首次适应算法和最佳适应算法一定比最坏适应算法好。

1.可重定位分区

可重定位分区分配是解决存储器碎片问题的简单有效的方法,基本思想是在适当的时候,把零散的空白区合并为一个大的空白分区,称为拼接,其实现方式是移动某些已分配区域中的信息,使所有的分配都紧挨着存储器的一端,而空白区在另一端。

2.多重分区

多重分区的思想是为一个作业分配一个以上的分区,允许一个作业在其运行过程中动态地申请附加存储空间,该空间不必和已有的作业分区相连接。多重分区的有点是便于使用共享子程序或者数据,缺点是需要较多的硬件支持,管理也比较复杂。

3.存储器保护

分区方式允许多道程序在内存中同时允许,因此,必须解决存储器保护问题。常用的方法有界地址保护和设置存储键保护。

 三.段页式存储管理

1.页式存储管理

在分页存储管理中,页帧可以是连续的,也可以是不连续的。系统为每道作业建立一张页映射表(称为页表),记录相应页在内存中对应的页帧号。这种管理方式消除了可变分区中紧致存储空间所带来的开销,同时,又能实现内存信息共享和虚拟存储技术。

在分页存储管理中,地址结构由两部分组成,分别是页号和页内位移(页内地址)。地址变换机构的基本任务是利用页表把用户程序中的逻辑地址变换成内存中的物理地址。

2.段式存储管理

段式存储管理按用户作业中的自然段来划分逻辑空间,每段占用连续的地址空间,其逻辑地址是二维的,由段号和段内地址组成。系统为每个作业建立一张段表,记录该段在内存中的起始地址和段长,各段可以存放在内存不同的分区中,段的分配与回收与可变分区存储管理相同。段式存储管理的地址转换采用动态重定位方式,地址转换机构取出逻辑地址的段号和段内地址,根据段号检索段表,找到该段对应的表目,将该段的起始地址与段内地址相加得到绝对地址。段式存储管理也存在二次访存问题,可以通过增设快表来解决。

段式存储管理和分页存储管理相似之处与区别

相同点:都采用离散分配方式来提高内存利用率,都要通过地址变换机构来实现地址变换。不同点: ( 1 ) 分页是一个单一的线性地址空间,分段作业地址空间是二维的。 ( 2 ) 页是信息的物理单位,大小固定,分页活动是用户看不见的,分页的目的是为了提高内存的利用率;段是信息的逻辑单位,其长度不定,分段是用户可见的活动,分段的目的是为了更好地满足用户的需要。( 3 ) 分页存储管理实现单段式虚拟存储系统,而段式存储管理实现多段式虚拟存储系统。

3.段页式存储管理

段页式存储管理的基本思想是将段式存储管理与分页存储管理结合起来,正好克服了各自存在的一些问题。段页式存储管理将作业分成若干段,每个段分成若干页,每段赋给一个段名,为了实现地址转换,必须为每个作业配置一张段表和若干页表。内存的分配与回收以页为单位进行。作业的逻辑是二维的,包括段号和段内地址,其中段内地址又包含页号和页内地址两部分。

四.虚拟存储管理

虚拟存储管理基本原理:应用程序在运行之前不必全部装入内存,仅需当前运行到的那部分程序和数据装入便可启动程序的运行,其余部分仍然驻留在外存储上。当要执行的指令或访问的数据不在内存时,再由操作系统通过请求调入功能将它们调入内存。这样可以使一个大的用户程序能够在较小的内存空间中运行,从用户的角度看,该系统具有的内存容量比实际的内存容量要大的多。将这种具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的存储器系统称为虚拟存储系统。

1.局部性原理

虚拟存储管理能够在作业信息不全部装入内存的情况下保证作业正确运行,是利用了程序执行时的局部性原理。局限性原理是指程序在执行时呈现局部性规律,即在一个较短的时间内,程序的执行仅仅局限于某个部分。响应地,它所访问的存储空间也仅仅局限于某个区域。

2.工作集

在虚拟存储管理中,可能会出现这种情况,即对于刚被替换出去的页,立即又要被访问,需要将它调入,因无空闲内存又要替换另一页,而后者是即将被访问的页,于是造成了系统需花费大量的时间忙于进行这种频繁的页面交换,致使系统的实际效率很低,严重时导致系统瘫痪,这种现象称为抖动现象。防止抖动现象有多种办法,例如,采取局部替换策略、引入工作集算法和挂起若干进程等。工作集是指在某段时间间隔内,进程实际要访问的页面的集合。引入虚拟内存后,程序只需有少量的内存就可运行,但为了使程序有效地运行,较少产生缺页,必须使程序的工作集全部在内存中。

3.页面置换算法

当内存中没有空闲页面,而又有程序和数据需要从外存中装入内存运行时,就需要从内存中选出一个或多个页面淘汰出去,以便新的程序和数据装入运行,良好的页面置换算法应该淘汰那些被访问概率最低的页,并将它移除内存。

(1)随机淘汰算法。无法确定那些页被访问的概率高低时,随机选择某个页面淘汰。

(2)轮转算法。按照内存页面的编号,循环换出内存中一个可以换出的页。

(3)先进先出FIFO。选择在内存驻留时间最长的一页淘汰。

(4)最近最久未使用算法LRU。当需要淘汰某一页时,选择离当前最近的一段时间内最久没有使用过的页先淘汰。

(5)最近没有使用页面責换算法(N U R )。在需要置换某一页时,从那些最近的一个时期内未被访问的页任选一页置换。

(6)最优置换算法。选择那些永久不使用的,或者在最长时间内不再被访问的页面置换出去。

(7)时钟页面替换算法(Clock)。使用页表中的引用位,将作业已调入内存的页面构成循环队列,用一个指针指向循环队列中的下一个将被替换的页面。

相关文章:

软考笔记--操作系统-内存管理

任何程序和数据都必须占用内存空间后才能执行,因此,内存管理的好坏直接影响整个操作系统的性能。操作系统的任务之一是尽可能地方便用户使用和提高内存的利用率。同时,内存管理也是多道程序设计系统的关键支撑。内存管理的功能主要包括以下几…...

Spring Boot整合日期转换器(Converter)和拦截器(HandlerInterceptor)

添加日期转换器&#xff08;Converter&#xff09; public class DataConverter implements Converter<String, Date> {Overridepublic Date convert(String s) {try {SimpleDateFormat simpleDateFormat new SimpleDateFormat("yyyy-MM-dd");return simpleD…...

100天精通Python(实用脚本篇)——第112天:图像处理批量给图片添加水印,防盗必备建议收藏!!!(附上脚本代码)

文章目录 专栏导读1. 图片设置水印的意义?2. 需求3. 实现效果4. 添加全屏水印4.1 单张图片添加全屏水印4.2 批量给多张图片添加全屏水印5. 添加指定位置水印5.1 模块介绍5.2 批量添加脚本实现专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零…...

SpringMVC(全局异常处理.动态接收Ajax请求)

1.全局异常处理 1 异常处理器 基于AOP 用户发起请求, SpringMVC接受请求, SpringMVC加载静态资源问题说明 请求过去了,但没有处理 规则说明:静态资源进入SpringMVC框架之后,没有找到要怎样处理静态资源的方法,所以他们就不解决,也就不显示 解决方法:SpringMVC基于Servlet处理…...

【FastAPI】P1 简单实现 a+b

目录 准备工作代码运行 说明&#xff1a;本文通过 FastAPI 实现返回两个参数 ab 的值&#xff1b; 准备工作 默认读者已准备完善 Python IDE工具以及包管理工具。 首先&#xff0c;需要安装 fastapi 和 uvicorn 库&#xff0c;如果没有请使用 pip 进行安装&#xff1a; pip…...

C#设计模式教程(4):单例模式

单例模式(Singleton Pattern)是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个访问它的全局访问点。在C#中实现单例模式通常有几种不同的方法,这里介绍几种典型的实现方式。 C# 单例模式的各种实现方式 1. 懒汉式(线程不安全) public class Singleton {p…...

常用的git diff命令用法汇总和示例

文章目录 1. 查看工作目录和暂存区的差异2. 查看暂存区和最后一次提交的差异3. 查看两个提交之间的差异4. 查看特定文件的更改5. 查看特定文件在两个提交之间的差异6. 查看分支之间的差异7. 查看某次提交的更改8. 限制diff输出的格式9. 查看一定时间范围内的更改 Git的diff命令…...

一键式Excel分词统计工具:如何轻松打包Python脚本为EXE

一键式Excel分词统计工具&#xff1a;如何轻松打包Python脚本为EXE 写在最前面需求分析直接用Python打包为什么大&#xff1f;为什么要使用conda环境&#xff1f; 将Python脚本打包为一个独立的应用程序1. 编写Python脚本&#xff1a;初步功能实现2. 初步图形用户界面&#xff…...

Windows系统字体尺寸学习

调用GetTextMetrics来获得字体尺寸信息, 函数返回设备描述表中当前选定的字体信息&#xff1b; 返回值到TEXTMETRIC类型的结构中&#xff1b; 返回字段值的单位取决于当前设备描述表映射方式&#xff1b;默认映射方式是MM_TEXT&#xff0c;值的单位是像素&#xff1b; 前7个字…...

SSH隧道技术

SSH隧道 简介 SSH隧道是一种通过SSH协议在两个网络节点之间建立安全通信的技术。它可以用于多种用途&#xff0c;包括加密和保护敏感数据传输、绕过防火墙限制、远程访问内部服务等。 应用&#xff1a; 端口转发&#xff1a;SSH隧道可以将本地端口转发到远程主机上&#xf…...

支付功能的实现

1.商户调用第三方支付服务的主要步骤流程&#xff1f; 1.1 表单跳转 前端点击提交支付&#xff0c;请求后端支付接口 支付接口通过阿里api生成表单信息返回给前端页面 同步回调&#xff0c;异步回调参数 请求参数&#xff1a;总金额&#xff0c;外部订单号 公共参数&#xff1…...

SpringMVC JSON数据处理见解6

6.JSON数据处理 6.1.添加json依赖 springmvc 默认使用jackson作为json类库,不需要修改applicationContext-servlet.xml任何配置&#xff0c;只需引入以下类库springmvc就可以处理json数据&#xff1a; <!--spring-json依赖--> <dependency><groupId>com.f…...

python 读写kafka

1. 安装pykafka pip install pykafka2. 生产者 from pykafka import KafkaClientdef get_kafka_producer(hosts, topics):client KafkaClient(hostshosts)print(client.topics)topic client.topics[topics]producer topic.get_producer()return producer 测试 hosts 19…...

VBA: 如何用VBA遍历文件夹(含子文件夹)里的所有文件

目录 0 原始文件 1 step1:遍历文件夹&#xff08;不包含子文件&#xff09;内的文件数 2 step2: 遍历文件夹内的所有子文件夹的名字 3 step3 遍历文件夹的&#xff08;含子文件&#xff09;内的所有文件 4 step4 遍历文件夹的&#xff08;含子文件&#xff09;内的所有文…...

又快又好! 基于Consistency Model的一步采样歌声转换模型CoMoSVC已开源

在2023年&#xff0c;AI虚拟歌手如AI孙燕姿等已经引起了广泛的关注&#xff0c;而大多数应用都是基于开源框架SoVITS。最近&#xff0c;香港科技大学和微软亚洲研究院推出了一种基于Consistency Model的歌声转换系统CoMoSVC&#xff0c;它在歌声转换速度上与基于Flow的SoVITS系…...

服务器——配置免密登录

一、生成本机的密钥文件 打开本机的终端&#xff0c;输入 ssh-keygen&#xff0c;默认一路点enter。 将生成的 id_rsa.pub 公钥文件&#xff0c;复制一份改一个名称&#xff0c;比如改名成 id_rsa_test.pub。 二、将生成的公钥文件发送到服务器对应账户的.ssh文件夹下 将改…...

GoZero微服务个人探索之路(三)Go-Zero官方rpc demo示例探究

官方网址&#xff1a;https://go-zero.dev/docs/tasks/cli/grpc-demo 项目结构 demo包 两个文件均为protoc-gen-go-grpc自动生成构成一个完整的 gRPC 服务的定义和实现 democlient包 demo.go goctl生成的客户端代码 Request 和 Response 别名&#xff1a; 定义了 Request 和…...

1月下半笔记(个人向)

最近才开始看d2l&#xff08;这种东西早该在两年前看的&#xff0c;拖到现在了&#xff09; 为了做项目还得学一手OpenGL&#xff08;被windows安装GLFW逼疯了&#xff09; 1.15 打完ICPC EC final回来&#xff0c;也许可以出一篇博客写下简单的题解。 对蛋白质相似空间子结…...

ChatGpt使用技巧

通用类技巧 角色扮演 比如让ChatGpt扮演500强营销专家 告诉ChatGpt你的身份。初学者、或是有一定能力、知识的学习者等 限制ChatGpt回答长度 100~200字之间 让ChatGpt一步一步思考 他会预测下一个单词&#xff0c;根据prompt进行生成 明确你的要求和目的 说清楚问题&#x…...

自动安装解压版mysql8的脚本

由于mysql 8的 MSI 安装包&#xff0c;自动把程序安装到了C盘&#xff0c;且没看到有可以更改安装位置的配置可以修改。 故自行写了一个脚本&#xff0c;用来安装mysql 8的压缩包。可以将 mysql 8 以及其 Data目录 安装到C盘以外的位置。第一次写 bat 脚本&#xff0c;希望各位…...

第二讲_HarmonyOS应用创建和运行

HarmonyOS应用创建和运行 1. 创建一个HarmonyOS应用2. 运行新项目2.1 创建本地模拟器2.2 启动本地模拟器2.3 在本地模拟器运行项目 1. 创建一个HarmonyOS应用 打开DevEco Studio&#xff0c;在欢迎页单击Create Project&#xff0c;创建一个新工程。 选择创建Application应用。…...

Android车载系统Car模块架构链路分析

一、模块主要成员 CarServiceHelperService SystemServer 中专门为 AAOS 设立的系统服务&#xff0c;用来管理车机的核心服务 CarService。该系统服务的具体实现在 CarServiceHelperServiceUpdatableImpl CarService Car模块核心服务APP&#xff0c;Android 13版本开始分为…...

C语言经典算法之顺序查找算法

目录 前言 A.建议 B.简介 一 代码实现 二 算法时空复杂度 A.时间复杂度&#xff1a; B.空间复杂度&#xff1a; 三 优点和缺点 A.优点&#xff1a; B.缺点&#xff1a; 四 现实中的应用 前言 A.建议 1.学习算法最重要的是理解算法的每一步&#xff0c;而不是记住算…...

c语言嵌套循环

c语言嵌套循环 c语言嵌套循环 c语言嵌套循环一、c语言嵌套循环格式二、嵌套循环案例九九惩罚口诀 一、c语言嵌套循环格式 for(初始值&#xff1b;表达式&#xff1b;表达式) {for&#xff08;初始值&#xff1b;表达式&#xff1b;表达式&#xff09;{代码} }int main() {for (…...

磁盘位置不可用怎么修复?

磁盘位置不可用是计算机使用中经常遇到的问题。造成磁盘位置不可用的原因有多种&#xff0c;其中最常见的是磁盘文件系统损坏。当文件系统损坏时&#xff0c;操作系统无法正常访问磁盘上的数据&#xff0c;导致磁盘位置不可用。 磁盘位置不可用怎么修复&#xff1f; 当磁盘位置…...

【总结】Linux命令中文帮助手册

1. 为什么要总结Linux命令中文帮助手册 Linux 官方并不提供中文的 help、man 帮助手册。网络上已有的前人翻译过的中文手册版本比较老&#xff0c;且翻译存在误差。从记忆角度来看&#xff0c;Linux 很多命令都不一定记得住详细的用法&#xff0c;易遗忘&#xff0c;缺少经验总…...

[贪心算法] 国王游戏

题目描述 ​ 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数&#xff0c;国王自己也在左、右手上各写一个整数。然后&#xff0c;让这 n 位大臣排成一排&#xff0c;国王站在队伍的最前面。排好队后&#xff0c;所有的大…...

meter报OOM错误,如何解决?

根据在之前的压测过程碰到的问题&#xff0c;今天稍微总结总结&#xff0c;以后方便自己查找。 一、单台Mac进行压测时候&#xff0c;压测客户端Jmeter启动超过2000个线程&#xff0c;Jmeter报OOM错误&#xff0c;如何解决&#xff1f; 解答&#xff1a;单台Mac配置内存为8G&…...

第二百六十九回

文章目录 概念介绍设置方法示例代码内容总结 我们在上一章回中介绍了Card Widget相关的内容&#xff0c;本章回中将介绍国际化设置.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的国际化设置是指在App设置相关操作&#xff0c;这样可以让不同国家的…...

未来能源转型之路:2023年第十三届中国国际储能大会启示录

在2023年第十三届中国国际储能大会上&#xff0c;全球各地的能源专家、学者和企业代表齐聚一堂&#xff0c;共同探讨了储能技术在推动能源转型中的重要作用。对于我们普通人来说&#xff0c;从这场大会中可以学到什么呢&#xff1f; 一、储能技术是未来能源发展的关键 随着可再…...