当前位置: 首页 > 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;希望各位…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

前端调试HTTP状态码

1xx&#xff08;信息类状态码&#xff09; 这类状态码表示临时响应&#xff0c;需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分&#xff0c;客户端应继续发送剩余部分。 2xx&#xff08;成功类状态码&#xff09; 表示请求已成功被服务器接收、理解并处…...

游戏开发中常见的战斗数值英文缩写对照表

游戏开发中常见的战斗数值英文缩写对照表 基础属性&#xff08;Basic Attributes&#xff09; 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...

信息收集:从图像元数据(隐藏信息收集)到用户身份的揭秘 --- 7000

目录 &#x1f310; 访问Web服务 &#x1f4bb; 分析源代码 ⬇️ 下载图片并保留元数据 &#x1f50d; 提取元数据&#xff08;重点&#xff09; &#x1f464; 生成用户名列表 &#x1f6e0;️ 技术原理 图片元数据&#xff08;EXIF 数据&#xff09; Username-Anarch…...

Docker 镜像上传到 AWS ECR:从构建到推送的全流程

一、在 EC2 实例中安装 Docker&#xff08;适用于 Amazon Linux 2&#xff09; 步骤 1&#xff1a;连接到 EC2 实例 ssh -i your-key.pem ec2-useryour-ec2-public-ip步骤 2&#xff1a;安装 Docker sudo yum update -y sudo amazon-linux-extras enable docker sudo yum in…...