[操作系统]3.内存管理

2023-11-09

和前面两篇是差不多的思路,仅为快速复习操作i系统基础知识点,例题暂无,考试不要参考,知识点来自王道操作系统

1.内存管理的基本要求和设定

内存管理主要完成的功能有

  • 内存空间的分配和回收
  • 地址转换(把逻辑地址转化为内存物理地址)
  • 内存空间的扩充(覆盖,交换,虚拟化)
  • 存储保护

因为一个进程如果想要执行,就必须从外存装入内存中,所以我们必须要对有限的内存进行一定的管理.

(1)程序运行的步骤:编译,链接,装载

程序如果想要运行,最重要的就是这三步骤

编译指的是把源代码编译成模块

链接:把模块以及所需的库函数连接起来形成一个整体,在这个阶段会生成逻辑地址

装入:把模块整体装入内存中,同时把逻辑地址转化为真实的物理内存地址

其中;链接有三种方式

静态链接:在程序运行之前,就完全装入链接

装入时动态链接:在装入内存的时候才开始链接

运行时动态链接:运行的时候才开始链接

装入也有三种方式,对于不同的地址转化方案

绝对装入:在编译的时候,就知道模块要放在内存的某个位置了,这种情况下地址不用转换,逻辑地址就算绝对地址

可重定位装入(静态重定位):在装入的时候完成地址变换,这种变换方法主要适用于一整块存入,只需要一个起始地址即可

动态重定位: 在运行的时候才进行地址变换,这种适用于分块存储进程的方式,但是需要一个重定向寄存器来协助

(2)关于内存保护

内存保护一共有两种可用的实现方式

(1)设置上下限寄存器,每次存入进程到内存中的时候,都会比较这两个寄存器的数值

(2)基址寄存器和界地址寄存器:分别给出起始地点,以及可用的大小

(3)覆盖和交换技术

在虚拟化技术没有诞生之前,我们常常使用这两种技术来扩充逻辑上的内存,营造出内存非常够用的假象.

1.覆盖技术:

覆盖技术指的是,把内存分成一个固定区,和多个覆盖区,覆盖区中的内容可以变化

举个例子,我们进行递归求解的时候通常可以画出一个递归树

递归树的同一层都不是同时发生的,彼此也没有依赖需求,这个时候,这些工作就可以共用一个覆盖区

而固定区是根节点,也就是main函数

2.交换技术

交换技术其实就算我们在第二章讲的调度部分的中级调度/内存调度

覆盖技术常用在同一个程序和进程中,而交换主要用于不同的进程之间

覆盖技术已经被虚拟化取代了

2.关于内存的管理方式(重点)

内存的管理方式是绝对的终点,内存管理主要有两种思路,第一种是连续内存管理,另一种是非连续内存管理

连续分配

(1)单一连续分配

在单一连续分配方式中,内存分为系统区和用户区,用户区一次只存入一个任务,这种分配模式适合单一用户和任务

(2)固定分区分配

固定分区分配指的是,把内存划分为固定大小的分区(可以相同,也可以不一样),然后每个分区只能存入一个任务,使用分区说明表这种数据结构对每个分区进行管理

但是这种容易产生内部碎片

内部碎片:指的是分给某个进程的空间没有被完全利用的部分
外部碎片:指的是没有分配给进程的空闲部分

 (3)动态分区分配

和上面不同,这次我们不在把内存认为的分割大小,而是直接动态地装入内存中.

一共有四种装入算法

首次适应算法:从高到低遍历所有空闲分区,然后选择第一个合适的

最佳适应算法:将分区按容量从高到低的顺序进行遍历,选择第一个合适的

最坏适应算法:将分区按容量从低到高的顺序进行遍历,然后第一个最合适的

邻近适应算法:在第一种的方法演变而来,遍历的起始节点是上一次的终点

但是这种分配无论使用何种算法,都会带来一定的外部碎片问题

非连续分配

(这个稍微恶心一点)非连续分配允许我们把一个进程拆分成多个部分,然后填入不同的位置

(1)基本分页管理:

基本分页管理的核心思想类似连续分配中的非连续固定分区,将内存划分为多个大小一致的分区,称之为页,然后按照这个分区的大小划分内存,称之为块

在进程中,逻辑地址的格式如下

块号P 块内地址W

 另外我们有一个名为页表的数据结构,每个对应的块号都可以指定式在内存中的第几个页

并且PW不需要明确给出,可以根据逻辑地址A和块大小L计算出来

假设存在一个逻辑地址A,页面大小为L

P=A/L    W=A%L   

P对应的内存中的块为b(这个依靠页表直接提供)

则内存地址为 E=W

(2)基本分段管理

分段管理和分页管理最大的区别就是,分段管理是按照程序的逻辑自然分成大小不一的段落

内存中不在按照任何格式划分块,只按照某种逻辑or算法插入内存中

在分段的进程中,逻辑地址的格式如下

段号P 段内地址W

(注:由于各个段的长度不一致,所以段内地址的长度取决于大小最大的进程自然段)

另外存在一个名为段表的数据结构,负责对应每个段在进程中的段号,段的长度,以及段在内存中

段号P 段的长度 段的起始地址b

 这种就肥肠简单,因为该给出来的东西都给出来了

                                        E=b+W

(注2:仍然由于各个段的长度不一致,所以无法根据一个逻辑地址计算出P和W,所以这个数据结构必须明确地给出)

(3)段页式管理:

段页式管理方式集中了以上两种方式,先转化成多个段,然后段内进行分页

段号P1 页号P2 页内地址

3.关于虚拟内存

继交换和覆盖技术以后,虚拟内存式目前最常用的一种扩展内存的方式

交换和覆盖系统都有一个特征就是,想要执行的任务必须一次性完整的放入内存中,但是可能会遇到的就是一个任务消耗的内存过大,已经远远超过了真实内存

所以虚拟的核心就是,把一个任务分成多个部分,将要运行的部分放入内存中进行运行,例如gta5,当你进入某个建筑物的时候,整体的外部就可以暂时挂起,只运行建筑物有关的部分.

(1)局部性原理

局部性原理起始有两方面

(1)空间局部性:访问了内存的某个单元,则这个单元附近的地址近期也可能调用

(2)时间局部性:一条指令被执行过以后,大概率在短期内再次执行

这两条原理同时适用于数据结构,也就是goto语句有害的有力论证

(2)虚拟内存的特点

(1)多次:作业无需一次性插入内存中

(2)对换性:作业无需长期驻留在内存中

(3)虚拟性:用户能看到的容量,远大于实际容量

关于虚拟和实际容量的关系

虚拟容量的最大值是寻址的最大值

虚拟内存的最小值是min(最大值,内存+外存)

(3)

(4)交换算法

交换算法主要用来处理内存中任务块中的内存调入和调出

一共有四种算法,不过其中第四种算法clock使用方法过于抽象,这里就不适用了

(1)最佳算法OPT

核心思想就算找出未来不再使用的内存块,并且调出内存

这种算法最理想,但是8可能实现

(2)先进先出算法FIFO

最开始调入内存的块,第一个调出,和队列是类似的性质

(3)LRU最近最少使用算法

最近最少使用的内存块,调出内存

(4)clock算法,不怎么用就算

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[操作系统]3.内存管理 的相关文章

  • Ubuntu16.04下caffe安装编译全过程(CPU)

    caffe是深度学习最好用的框架之一 但caffe的安装编译过程相对较复杂 本人在安装编译时百度了好几个版本 都没有一次成功过 因此在此总结一下自己的编译过程 本文是在Ubuntu16 04下安装编译caffe 其他版本会略有不同 该教程本
  • com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl.

    问题 IDEA调试JDBC出错 com alibaba druid support logging JakartaCommonsLoggingImpl error create connection SQLException url jdb
  • 外包测试3年,离职后成功入职阿里,拿到offer的那天我泪目了...

    一提及外包测试 大部分人的第一印象就是 工作强度大 技术含量低 没有归属感 外包工作三年总体感受就是这份工作缺乏归属感 心里总有一种落差 进步空间不大 接触不到核心技术 公司没有针对你的技术培训与探究 工作简单 业务重复 通常是工具人的存在
  • QDockWidget布局方式

    上图为DockWidget多控件效果图 QDockWidget dock QLatin1String Last filters QWidget multiWidget new QWidget QVBoxLayout layout new Q

随机推荐

  • oracle生成不同uuid,oracle生成uuid

    select sys guid from dual gt 78AE331ADB2B4CE7AB598B1317B39D58 但该函数如下问题 1 返回类型为RAW 2 没有 dash 分隔符 3 返回的字母大写 为了使产生的uuid符合rf
  • vue3之createApp分析

    函数定义 createApp函数定义在文件 packages runtime dom src index ts中 export const createApp args gt const app ensureRenderer createA
  • Python 贝叶斯在文本分类的应用案例

    关注微信公共号 小程在线 关注CSDN博客 程志伟的博客 1 1 文本编码技术简介 1 1 1 单词计数向量 在开始分类之前 我们必须先将文本编码成数字 一种常用的方法是单词计数向量 在这种技术中 一个样本可以包 含一段话或一篇文章 这个样
  • 10种排序算法总结(Python 版)

    文章目录 1 冒泡排序 O n 2 2 快速排序 O nlogn 3 简单插入排序 O n 2 4 希尔排序 O n log n 5 简单选择排序 O n 2 6 堆排序 O n log n 7 归并排序 O n log n 8 计数排序
  • 解决keil5编译报错 undefined symbol

    在编译keil5 工程时出现报错 xxx axf Error L6218E Undefined symbol xxx referred from xxxo 正常情况下遇到Undefined symbol问题根据经验有以下几种原因 1 c文件
  • pinia实现持久化存储

    pinia的作用是什么 Pinia 是 Vue 的存储库 它允许您跨组件 页面共享状态 如果您熟悉 Composition API 您可能会认为您已经可以通过一个简单的 export const state reactive 这对于单页应用
  • 论文笔记--Attention is all you need

    Attention is all you need transformer模型 摘要 当前的序列转录模型基于encoder和decoder的循环或卷积神经网络 较好的做法是在encoder和decoder中间加入一个注意力机制 我们提出了一
  • 使用Spyder,导入tensorflow以及相关库出现kernel died等问题的解决方法

    自从使用了Spyder之后 感觉腰不算了 腿不疼了 走路都带风了 呵呵 好吧 那是之前 使用Spyder给我的感觉就好像一台快报废的电脑重新装了系统一样 刚开始顺风顺水 可是后来就发现毕竟是老年机 容易出现个什么白内障 风湿病什么的 做一些
  • 离散数学:数学语言与证明方法(练习题)

    练习1 1 判断下列命题是真是假 1 x x 答 假 x 并不是 x 元素 2 x x 答 真 x 是 x 子集 3 x x 答 真 x 是 x 元素 4 x x 答 假 x 不是 x 子集 5 x 答 真 是 x 元素但不是任何集合元素
  • SpringBoot:构建一个SpringBoot项目

    文章目录 一 创建项目 1 点击 File gt Project 2 选择 Spring Initializr 3 填写项目基本信息 5 目录结果 6 pom xml 依赖 7 主函数入口 二 项目启动 测试 三 项目源码 SpringBo
  • MongoDB常见问题

    问题一 还原报错 root mongodb bin mongorestore h 127 0 0 1 27017 d runoob directoryperdb data db runoob 2022 12 19T19 47 23 909
  • [LeetCode-21]-Merge Two Sorted Lists(有序列表合并)

    文章目录 题目相关 Solution 不带头结点 增加头结点 使用递归 题目相关 题目解读 合并两个有序列表 并返回新列表 原题描述 原题链接 Merge two sorted linked lists and return it as a
  • 合并两个有序表到新的有序表

    系列目录 左右移动 旋转 数组元素 查找两个升序数组的中间数 判断数组的某一个元素的数量是否超过了整个数组数量的一半 文图介绍 将有序数组A和有序数组B合并得有序数组C A 1 2 3 4 5 B 2 3 4 5 6 C 1 2 2 3 3
  • java什么时候用异常_深入理解Java异常的使用场景

    最近在项目代码中 遇见异常滥用的情形 分析下会带来哪些后果 1 代码可读性变差 业务逻辑难以理解 异常流与业务状态流混在一起 无法从接口协议层面理解业务代码 只能深入到方法 Method 内部才能准确理解返回值的行为 可看一下代码 publ
  • 如何计算留存率(Hive Sql or Spark sql)

    在互联网行业中 用户在某段时间内开始使用应用 经过一段时间后 仍然继续使用该应用的用户 被认作是留存用户 这部分用户占当时新增用户的比例即是留存率 会按照每隔1单位时间 例日 周 月 来进行统计 顾名思义 留存指的就是 有多少用户留下来了
  • unistd.h文件

    转载地址 http baike baidu com link url nEyMMFYevs4yoHgQUs2bcfd5WApHUKx0b1ervi7ulR09YhtqC4txmvL1Ce3FS8xTKtWQuvmEBHC9xezMGpvGH
  • valgrind 在开发板上运行以及使用

    前言 bedug无处不在 今天花落我家 现象 一个月出现一次异常 难易复现排查 借助神器valgrind排查 1 下载及编译准备 下载地址 https www valgrind org tar jxvf valgrind 3 16 1 ta
  • java实用类之正则工具类

    正则工具类 public class PatternUtil 匹配邮箱正则 private static final Pattern VALID EMAIL ADDRESS REGEX Pattern compile A Z0 9 A Z0
  • EL文件上传

    一 通过时间修改与文件上传 weixin 43985399的博客 CSDN博客查询并添加相应的文件 二 编辑前端页面
  • [操作系统]3.内存管理

    和前面两篇是差不多的思路 仅为快速复习操作i系统基础知识点 例题暂无 考试不要参考 知识点来自王道操作系统 1 内存管理的基本要求和设定 内存管理主要完成的功能有 内存空间的分配和回收 地址转换 把逻辑地址转化为内存物理地址 内存空间的扩充