【操作系统】内存管理

文章目录

  • 内存的基础知识
    • 什么是内存
    • 进程的工作原理
      • 指令的工作原理
      • 逻辑地址(相对地址)vs物理地址(绝对地址)
      • 从写程序到程序运行—编译、链接、装入
      • 装入的三种方式
      • 链接的三种方式
  • 什么是内存管理?
    • 内存空间的分配与回收
    • 内存空间的扩展(实现虚拟性)
    • 地址转换
    • 内存保护
  • 覆盖与交换技术
    • 覆盖技术
    • 交换技术
  • 内存的分配与回收
    • 单一连续分配
    • 固定分区分配
    • 动态分区分配(可变分区分配)
    • 内部碎片与外部碎片
  • 动态分区分配算法
    • 首次适应算法
    • 最佳适应算法
    • 最坏(大)适应算法
    • 临近适应算法
    • 四种算法归纳比较
  • 分页存储
    • 基本分页存储管理的思想
    • 分页存储管理的重要概念
    • 如何实现地址的转换
      • 如何计算页号和页偏移量
      • 分页存储的逻辑结构
      • 如何知道页面在内存中的起始地址?
  • 分页存储管理的基本地址变换结构
    • 页表寄存器
    • 对页表项大小的进一步讨论
  • 快表的地址变换结构
    • 什么是快表
    • 局部性原理引入快表机制
    • 引入快表后,地址的变换过程
    • 基本地址变换与快表地址变换的比较
  • 二级页表
    • 为什么引入二级页表?
    • 二级页表的原理和地址结构
    • 如何实现二级页表的地址变换?
    • 几个小细节
  • 基本分段存储管理
    • 什么是分段?
    • 分段的逻辑地址结构
    • 段表
    • 地址变换
    • 分段、分页管理的对比
      • 分段实现信息共享共享
      • 为什么分页不方便实现信息共享和保护?
  • 段页式存储管理
    • 分页、分段的优缺点分析
    • 分段+分页=段页式管理
      • 段页式管理的逻辑地址结构
      • 段页式存储的段表、页表
    • 段页式管理的地址转换过程
  • 虚拟内存
    • 传统存储管理的特征、缺点
    • 局部性原理
    • 虚拟内存的定义和特征
    • 如何实现虚拟内存技术
  • 请求分页管理方式
    • 页表机制—请求页表与基本页表的区别
    • 缺页中断机构
    • 地址变换机构
  • 页面置换算法
    • 最佳置换算法—OPT
    • 先进先出置换算法—FIFO
    • 最近最久未使用置换算法—LRU
    • 时钟置换算法—CLOCK
    • 改造型时钟置换算法
  • 页面分配策略
    • 驻留集
    • 页面分配、置换策略
      • 固定分配局部置换、可变分配局部置换、可变分配全局置换
    • 何时调入页面?
    • 从何处调页?
    • 抖动(颠簸)现象
    • 工作集

本系列参考王道考研-操作系统以及博主@BitHachi

内存的基础知识

什么是内存

在这里插入图片描述
在这里插入图片描述

因为cpu的处理速度很快,而外存的读取速度又很慢,所以我们就需要先加载到内存中,内存的读取速度比外存要快得多,如此实现更高效的处理

在这里插入图片描述

进程的工作原理

指令的工作原理

从X=X+1大致看一下指令的执行过程

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

指令的工作基于地址。每个地址对应一个数据的存储单元。

逻辑地址(相对地址)vs物理地址(绝对地址)

在这里插入图片描述

从写程序到程序运行—编译、链接、装入

在这里插入图片描述

不修改装入模块中的指令地址就直接装入内存的话:

在这里插入图片描述
在这里插入图片描述

也就是说只有当装入模块使用的内存从#0开始时,不修改装入模块中的指令地址才能行得通

装入的三种方式

  • 绝对装入 在这里插入图片描述

    这也叫就意味着这个程序换一台就不能运行了,此方式灵活性较低

  • 静态重定位
    在这里插入图片描述

  • 动态重定位
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

链接的三种方式

首先我们了解一下什么是链接:

程序的链接阶段主要做了以下几件事:

  1. 符号解析:将各个模块中使用的符号(函数名、全局变量名等)替换为实际的地址。例如如果模块A调用模块B的函数foo(),那么链接器会找到模块B中foo()的实际地址,并在模块A的调用指令中填入那个地址。
  2. 重定位:修改程序中用到的地址,以适应最终的加载地址。例如模块A中有一个data段从0x1000开始,模块B有一个data段从0x2000开始。那么链接器可能决定模块A加载到0x5000,模块B加载到0x6000。这时候链接器需要修改模块A中所有0x1000的地址为0x5000,修改模块B中的0x2000为0x6000。
  3. 解决外部符号:如果有模块调用了未定义的外部符号(例如调用了标准库函数),那么链接器需要链接适当的库来满足这些外部需求。
  4. 重复符号处理:如果有多个模块定义了相同的符号,链接器需要决定使用哪一个,并可能报错。
  5. 生成输出文件:链接的最后,链接器会将所有输入的目标文件组合成一个输出文件(可执行文件或共享库)。这个输出文件就包含了所有符号解析、重定位等处理的结果。

所以简单来说,链接的作用是将多个目标模块组合为一个连贯的程序,使其可以顺利执行或被其他程序使用。它解决了跨模块的符号引用和地址变化等问题,并生成最终的输出文件。

  • 静态链接
    在这里插入图片描述

  • 装入时动态链接在这里插入图片描述

  • 运行时动态链接
    在这里插入图片描述

我们总结一下这一章:
在这里插入图片描述

什么是内存管理?

内存空间的分配与回收

在这里插入图片描述

内存空间的扩展(实现虚拟性)

在这里插入图片描述

地址转换

在这里插入图片描述

地址转换三种方式

在这里插入图片描述

内存保护

在这里插入图片描述
内存保护的两种方式

在这里插入图片描述
在这里插入图片描述

最后我们总结一下这一章:
在这里插入图片描述

覆盖与交换技术

在这里插入图片描述

覆盖技术

在这里插入图片描述
在这里插入图片描述

交换技术

在这里插入图片描述

复习一下进程调度
在这里插入图片描述

在这里插入图片描述

最后我们总结一下这一章:
在这里插入图片描述

内存的分配与回收

在这里插入图片描述

单一连续分配

在这里插入图片描述

固定分区分配

在这里插入图片描述

分区说明表
在这里插入图片描述

动态分区分配(可变分区分配)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
系统要用怎样的数据结构记录内存的使用情况呢?

在这里插入图片描述
当多个空闲分区都能满足要求时,应该选择哪个分区进行分配?

在这里插入图片描述
如何进行分区的分配?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如何进行分区的回收?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

内部碎片与外部碎片

在这里插入图片描述
在这里插入图片描述

最后总结一下本章内容:

在这里插入图片描述

动态分区分配算法

在这里插入图片描述

首次适应算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最佳适应算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最坏(大)适应算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

临近适应算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四种算法归纳比较

在这里插入图片描述

分页存储

在这里插入图片描述
在这里插入图片描述

基本分页存储管理的思想

在这里插入图片描述

分页存储管理的重要概念

在这里插入图片描述

如何实现地址的转换

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如何计算页号和页偏移量

在这里插入图片描述
为什么页面大小一般设为2的整数次幂?

在这里插入图片描述

在这里插入图片描述

分页存储的逻辑结构

在这里插入图片描述

如何知道页面在内存中的起始地址?

在这里插入图片描述
在这里插入图片描述

最后我们总结一下这一章的内容:
在这里插入图片描述

分页存储管理的基本地址变换结构

在这里插入图片描述

页表寄存器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例题:
在这里插入图片描述

对页表项大小的进一步讨论

在这里插入图片描述

总结一下:
在这里插入图片描述

快表的地址变换结构

我们前面说了分页存储管理的基本地址变换结构,这一章是对基本地址变换结构的改进版。

在这里插入图片描述

什么是快表

在这里插入图片描述

能否把整个页表都放在TLB中?
在这里插入图片描述

局部性原理引入快表机制

在这里插入图片描述

引入快表后,地址的变换过程

一个例图了解基于快表的地址变换结构

在这里插入图片描述
引入快表后,地址变换的过程的文字描述:
在这里插入图片描述
在这里插入图片描述

基本地址变换与快表地址变换的比较

在这里插入图片描述

二级页表

为什么引入二级页表?

因为单级页表存在一些问题,所以引入二级页表和多级页表,有两个问题:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二级页表的原理和地址结构

  • 对页表再次分组
    在这里插入图片描述

  • 二级页表的地址结构及对应关系
    在这里插入图片描述

如何实现二级页表的地址变换?

在这里插入图片描述
上面的部分我们解决了问题一,接下来是问题二,这里简单叙述一下,后面的文章会继续深入剖析。

在这里插入图片描述

几个小细节

在这里插入图片描述

最后总结一下:
在这里插入图片描述

基本分段存储管理

在这里插入图片描述

什么是分段?

在这里插入图片描述

分段的逻辑地址结构

在这里插入图片描述

段表

在这里插入图片描述

地址变换

在这里插入图片描述
在这里插入图片描述

分段、分页管理的对比

在这里插入图片描述
在这里插入图片描述

分段实现信息共享共享

在这里插入图片描述

为什么分页不方便实现信息共享和保护?

在这里插入图片描述

分段比分页更容易实现信息共享的原因主要有:

  1. 分段的地址空间是逻辑地址空间,与物理地址空间分离。每个段都有一个段表,映射逻辑地址到物理地址。这个映射可以在不同的进程中共享,所以多个进程可以共享同一个段。
  2. 分段允许段重叠,不同进程可以共享某些段。而分页的页映射通常是唯一的,不允许重叠,所以难以直接在地址空间中共享页面。
  3. 分段的粒度较大,通常是一个函数、数据结构等,更适合作为共享单元。而分页的页大小较小,不太方便作为共享信息的基本单元。
  4. 分段可以实现共享只读段,多个进程只读访问同一段,而分页实现只读共享页较为困难。

具体例子:

  • 共享程序代码段:多个进程可以共享只读的代码段,从而减少内存占用。
  • 共享库段:多个进程可以共享动态链接库的代码和数据段。
  • 共享数据段:多个进程共享只读数据段,如常量数据。
  • 堆栈段不共享:每个进程有自己的唯一堆栈段。

相比而言,分页实现共享信息较为困难,通常需要更复杂的机制,如复制现有的共享页等,比较低效。所以,总体来说,分段更容易高效实现信息共享。

最后总结一下:
在这里插入图片描述

段页式存储管理

在这里插入图片描述

分页、分段的优缺点分析

在这里插入图片描述
在这里插入图片描述

分段+分页=段页式管理

在这里插入图片描述

段页式管理的逻辑地址结构

在这里插入图片描述

段页式存储的段表、页表

在这里插入图片描述

段页式管理的地址转换过程

在这里插入图片描述

最后总结一下:
在这里插入图片描述

虚拟内存

在这里插入图片描述
在这里插入图片描述

传统存储管理的特征、缺点

在这里插入图片描述

局部性原理

在这里插入图片描述

虚拟内存的定义和特征

在这里插入图片描述
在这里插入图片描述

如何实现虚拟内存技术

在这里插入图片描述

最后总结一下:
在这里插入图片描述

请求分页管理方式

在这里插入图片描述

页表机制—请求页表与基本页表的区别

在这里插入图片描述

缺页中断机构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

地址变换机构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后总结一下:
在这里插入图片描述

页面置换算法

在这里插入图片描述

最佳置换算法—OPT

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

先进先出置换算法—FIFO

在这里插入图片描述
在这里插入图片描述

最近最久未使用置换算法—LRU

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

时钟置换算法—CLOCK

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

改造型时钟置换算法

  • 只需一轮
    在这里插入图片描述

  • 需要两轮
    在这里插入图片描述

  • 需要三轮:
    在这里插入图片描述
    在这里插入图片描述

  • 需要四轮
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

总结:
在这里插入图片描述

页面分配策略

在这里插入图片描述

驻留集

在这里插入图片描述

驻留集(Resident Set)是操作系统管理内存的一个重要概念。它指的是一个进程当前占用的内存页面集合

当一个进程运行时,它需要从辅助存储器(如硬盘)将代码和数据读入内存。不可能将整个进程的所有代码和数据都读入内存,因为内存有限。所以,操作系统会根据一定的页面置换算法(如LRU),选择将一些页面驻留在内存中,这些驻留在内存中的页面集合就是驻留集。

驻留集是描述一个进程运行时实际占用内存的页面集合,它的大小和内容随着进程的运行而动态变化,密切相关到操作系统的内存管理和进程调度。

页面分配、置换策略

在这里插入图片描述

固定分配局部置换、可变分配局部置换、可变分配全局置换

在这里插入图片描述
在这里插入图片描述

何时调入页面?

在这里插入图片描述

从何处调页?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

抖动(颠簸)现象

在这里插入图片描述

工作集

工作集(Working Set)是操作系统内存管理的一个重要概念,与驻留集相类似,但有一定区别。

工作集指的是进程在最近一段时间内实际访问的页面集合。它表示进程近期的内存访问局部性,通过工作集的大小可以反映出进程最近一段时间的内存使用情况和访问模式。

操作系统通过定期统计每个进程的工作集,来发现进程的内存访问模式的变化。当工作集大小发生较大变化时,说明进程的内存访问模式可能已发生改变,这时操作系统会相应地调整进程的驻留集,以适应新的工作集大小和访问模式。

工作集与驻留集的主要区别在于:

  1. 工作集反映的是进程最近一段时间的内存访问情况,它是短期的和动态变化的。而驻留集表示进程当前占用的内存,它由工作集演变而来,相对而言是较长期和稳定的。
  2. 工作集的页面可能没有全部驻留在内存,而驻留集中的页面全部在内存中。工作集只是访问的页面集合,不代表这些页面实际驻留在内存。
  3. 操作系统不直接管理工作集的大小,它通过STATISTICS得到工作集信息,并据此调整驻留集。而驻留集的大小由操作系统的页面置换算法直接管理。
  4. 工作集用于发现进程内存访问模式的变化,指导驻留集的调整,而驻留集直接影响进程的运行效率。

总之,工作集和驻留集都描述进程占用和访问的内存,但工作集更注重内存访问模式,用于发现进程内存模式的变化;而驻留集直接影响进程运行,由操作系统根据工作集信息加以管理。两者互为依存,共同服务于操作系统的内存管理。
在这里插入图片描述

总结:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/19772.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机的简易电子秤

首先看看题目要求: 1.方案论证 (1)压力传感器的论证与选择 方案一:采用惠更斯电桥,当电阻应变片承受载荷产生变形时,其阻值将发生变化。从而使电桥失去平衡,产生相应的差动信号,但…

Java中线程的状态

Java中线程的状态分为6种。 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。 线程对象创建…

gateway的使用

什么是Spring Cloud Gateway 网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等。 Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架,定位于取代 Netflix Zuul。相比 Zuul 来说,Spring Cloud …

ADV7391BCPZ-ASEMI代理亚德诺ADV7391BCPZ原厂芯片

编辑-Z ADV7391BCPZ参数描述: 型号:ADV7391BCPZ VDD:1.8V VAA:3.3V 全驱动输出电流:34.6 mA 低驱动输出电流:4.3 mA 输出电容:10 pF 模拟输出延迟:6 ns DAC模拟输出倾斜&am…

文件一直处于修改状态 git checkout 无法还原的问题解决方法

问题描述 最近在 RT-Thread 时,使用 Git 回退版本验证问题,后来 git pull 拉取最新代码后,发现里面有几个文件,一直为【修改】状态,并且无法还原,git checkout xxx git reset --hard 都用了,依旧…

简单两步创建nVisual建筑场景

nVisual是一款网络基础设施可视化管理软件,通过模型可规划即将建设的机房效果,或者将已有的机房场景复刻至系统中,便于运维管理者清晰的了解机房设备及线缆路由连接关系。 数据初始我们需要将数据中心场景复刻至系统中,建筑场景也…

【Java】抽象类与接口

文章目录 1.抽象类1.1抽象方法 2.接口3.抽象类和接口的区别3.1代码中区分:3.2设计层面区分 在面向对象编程中,抽象是非常重要的一个特征。在Java中可以通过抽象类或接口的形式实现这一特性。 1.抽象类 Java关键字 abstract对应抽象类的使用 1.1抽象方法…

Calico的BGP打通Kubernetes网络和局域网

1、项目背景 随着云原生技术的不断发展,容器化应用已成为企业构建云原生架构的重要方式。而随着集群规模不断扩大,跨主机通信的需求也越来越重要。在 Kubernetes 集群中,Pod 是最小的调度和管理单位,而网络也是 Kubernetes 中最重…

二叉树OJ

文章目录 二叉树OJ根据二叉树创建字符串思路示例代码 二叉树的层序遍历思路示例代码 二叉树的层序遍历 II思路示例代码 二叉树的最近公共祖先思路1示例代码1思路2示例代码2 二叉搜索树与双向链表思路1示例代码1思路2示例代码2 迭代实现二叉树的三种遍历前序遍历思路示例代码 中…

哪些蓝牙耳机戴久不疼?长时间佩戴不疼的蓝牙耳机推荐

现在的真无线耳机已经成为了人们的标配之一了,各个厂家也紧随其后,生产出了多种无线耳机,不少人的选购蓝牙耳机一般都是对音质、佩戴和连接,但通常人们佩戴蓝牙耳机都是在半天左右,小编专门整理了一期舒适度高的耳机&a…

ElasticSeach 集成 springboot

声明是ElasticSearch? ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎, 基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是 当前流行的企业级搜索引擎…

Unity 坐标系

一、左手坐标系与右手坐标系 常见的三维软件都采用笛卡尔坐标系,也就是常见的xyz轴坐标系。笛卡尔坐标系可以是左手坐标系也可以是右手坐标系,如下图所示 两种坐标系是镜像对称的。而Unity采用左手系,且xyz轴的默认方向与图中的左手系完全一…

便携式车用CAN分析仪

产品简介 USBCAN-C系列便携式车用CAN分析仪,通过USB接口快速扩展一路CAN通道,使接入CAN网络非常容易,它具有一体式和小巧紧凑的外形,特别适合于随身携带。CAN接口采用金升阳电源模块和信号隔离芯片实现2500V DC电气隔离&#xff0…

KVM存储池管理与磁盘格式

KVM存储池管理与磁盘格式 KVM必须配置一个目录作为存储磁盘镜像(存储卷)的目录,我们称这个目录为存储池 存储池管理 默认存储池 /var/lib/libvirt/images/ 创建基于文件夹的存储池(目录) mkdir -p /data/vmfs定义…

WhatsApp如何让客户参与变得更简单?

WhatsApp对你的品牌来说可能和Twitter和Facebook一样重要,你可能已经把它们纳入你的社交媒体战略。 是的,WhatsApp不仅仅可以用来给同事发短信或与远方的亲戚视频聊天,它也适用于商业。 在发展WhatsApp业务时,小企业主得到了最优…

【网络】Socket编程-UDP篇

文章目录 预备知识源IP地址和目的IP地址源MAC地址和目的MAC地址源端口号和目的端口号"端口号port" 和 "进程ID"认识TCP/UDP协议网络字节序 Socket编程sockaddr结构API接口 简单的UDP网络程序服务器server服务端创建套接字:socket函数**socket的底层原理** …

Unity学习笔记 关于Unity相机的FOV以及水平FOV和垂直FOV之间的转换

前言 关于FOV FOV 是在任何给定时间通过人眼、相机取景器或在显示屏上可见的可观察世界的范围。它指的是整个区域的覆盖范围,而不是单个固定焦点。FOV 还描述了一个人可以看到可见世界的角度。 FOV 越宽,可以看到的可观察世界就越多。它是水平、垂直和对…

使用 OpenCV 进行基于 ESP32 CAM 的目标检测和识别

概述:基于 ESP32 CAM 的目标检测和识别 本教程介绍了使用OpenCV基于 ESP32 CAM的目标检测和识别主题。OpenCV 是一个开源的图像处理库,不仅在工业界而且在研发领域都得到了非常广泛的应用。 这里对于对象检测,我们使用了cvlib 库。该库使用 COCO 数据集上的预训练 AI 模型…

JSON-框架的具体使用

JSON-框架的具体使用 非 SpringBoot 项目 Jackson Jackson 是另一个流行的JSON序列化和反序列化库,具有以下特点 速度快:Jackson 采用了高效的JSON解析算法和字节码生成技术,使得其序列化和反序列化速度非常快。支持全类型序列化&#xff1…

4年外包终于上岸,我只能说别去....

我大学学的是计算机专业,毕业的时候,对于找工作比较迷茫,也不知道当时怎么想的,一头就扎进了一家外包公司,一干就是4年。现在终于跳槽到了互联网公司了,我想说的是,但凡有点机会,千万…