操作系统-笔记-第三章-内存管理

目录

三、第三章——内存管理

1、内存的基础知识

(1.1)程序装入(三种)——绝对装入

(1.2)程序装入(三种)——可重定位装入

(1.3)程序装入(三种)——动态重定位

(2)程序——exe的由来

(3)程序——链接方法

(4)总结

2、内存管理的概念

(1)内存空间的分配和回收

(2)内存空间的拓展(比如:虚拟内存等)

(3)地址转换(逻辑地址-物理地址)

(4)内存保护

3、内存——覆盖与交换

(1)覆盖技术(已经out了)

(2)交换技术

(3)交换技术——对应的问题

(4)总结(考选择题)

4、连续分配管理方式

(1)单一连续分配

(2)固定分区分配

(3)动态分区分配

(4)总结

5、动态分区分配——算法(详细讲解)

(1)首次适应算法(第一次)

(2)最佳适应算法(从小到大)

(3)最坏适应算法(从大到小)

(4)临近适应算法(从大到小)

(5)总结(优缺点)

6、基本分页存储——概念

(1)页框——物理块——内存块——物理页面

(2)逻辑地址-结构【页号+页内偏移量】

(3)总结——概念

(4)重点——地址变换过程(五步)

(5)重点——例题

(6)重点——页表(如何存储在内存中)

(7)总结——地址变换

7、快表(TLB)

(1)查询过程——1(先快表,再慢表,最后内存)

(2)查询过程——2(同时查找-快表-慢表)

(3)局部性原理

(4)总结 (TLB和高速缓存有区别!!!)

8、两级页表(开始套娃啦)

(1)从一级—二级—偏移量(转到物理地址)

(2)单级页表

(3)细节重点

(4)总结

9、段页式管理方式

(1)段表

(2)查询段表——顺序

(3)分段 & 分页 【对比】

(4)总结

10、虚拟内存

(1)传统存储管理方式——特征、缺点

(2)虚拟内存——定义、特征

(3)如何实现——虚拟内存

(4)总结

11、请求页面——管理方式

(1)缺页中断(内中断)

(2)地址变换

(3)总结

12、页面置换算法

(1)最佳置换算法(无法实现)

(2)先进先出算法(绝对公平——Belady异常)

(3)最近最久未使用置换算法(LRU)

(4)时钟页面置换算法(CLOCK & NRU)

(5)时钟页面置换算法——改进型

(6)总结(要会手推——页面替换)

12、页面分配策略、抖动、工作集

(1)工作集模型(清华教程)

 (2)驻留集——分配策略【王道】

(3)何时调入页面(亡羊补牢 or 未雨绸缪)

(4)在哪里调入?(经典加一层)

(5)抖动现象

(6)工作集(拓展-考试貌似不考~)

(7)总结

13、内存映射文件

(1)方便程序员——访问文件数据

(2)共享数据——同时访问一个文件

(3)总结(关于磁盘的IO,操作系统是专业滴!)


三、第三章——内存管理

1、内存的基础知识

相关知识点

逻辑地址——相对地址

物理地址——绝对地址

 

(1.1)程序装入(三种)——绝对装入

灵活性差,已经被淘汰了~

 

(1.2)程序装入(三种)——可重定位装入

在装入时——会转换好地址~(写死了物理地址,不能移动咯!)

 

(1.3)程序装入(三种)——动态重定位

现在使用方法——可以动态修改,灵活移动,动态申请空间…

 

(2)程序——exe的由来

1.    编写源代码:首先,您需要使用文本编辑器编写C语言源代码文件,通常以.c为扩展名。

2.    编译源代码:接下来,您需要使用C编译器将源代码编译为机器可以执行的目标代码。这个过程称为编译。编译器会对源代码进行词法分析、语法分析和语义分析,并生成相应的目标代码文件(通常以.obj为扩展名)。

3.  链接目标代码:在生成目标代码后,您需要使用链接器将目标代码与所需的库文件进行链接,以创建最终的可执行文件。链接器会解决函数和变量引用之间的依赖关系,并将目标代码转换为可执行文件的格式。最终生成的可执行文件通常以.exe(对于Windows系统)或无扩展名(对于Linux系统)为扩展名。

4.    运行可执行文件:一旦可执行文件生成成功,您可以直接执行它。

 

 

(3)程序——链接方法

 

(4)总结

 

2、内存管理的概念

(1)内存空间的分配和回收

如何分配?如何回收?还有哪些空闲?这么多位置,应该分配哪一块?

(2)内存空间的拓展(比如:虚拟内存等)

内存不够用,如何临时拓展?

(3)地址转换(逻辑地址-物理地址)

地址转换功能

 

(4)内存保护

如何让各进程之间,拥有自己的地皮,互不影响!

 

 

3、内存——覆盖与交换

(1)覆盖技术(已经out了)

程序员来完成——编程麻烦(out)

 

(2)交换技术

把暂时不需要的进程——拿到外存

 

(3)交换技术——对应的问题

 

(4)总结(考选择题)

 

4、连续分配管理方式

 

(1)单一连续分配

无外部碎片——但:有内部碎片【内存利用率低】

 

(2)固定分区分配

把用户空间——划分多个分区~

无外部碎片——但又内部碎片,内存利用率低

 

 

(3)动态分区分配

没有内部碎片,但有外部碎片!

(不过可以通过【拼凑】等方式,来解决【外部碎片】)

 

(4)总结

 

5、动态分区分配——算法(详细讲解)

 

(1)首次适应算法(第一次)

从头到尾,按顺序扫描!

找到第一个满足的空间,就放进去~

 

(2)最佳适应算法(从小到大)

这个是强迫症!——必须安排连续的空间(产生难以利用的小碎片)

额外创建一个——空闲分区链表——用来记录空闲空间的大小(从小到大排序!)

每次安排完后,都需要【维护该表】(数据更新,重新排序)

 

(3)最坏适应算法(从大到小)

和最佳相反——空间排序【从大到小】

缺点——如果来个了“大进程”——可能没有足够大的连续空间给他!

 

(4)临近适应算法(从大到小)

从小到大的【循环链表】

开销小【空间换时间】——但是——大分区容易被用完~

 

(5)总结(优缺点)

 

6、基本分页存储——概念

 

(1)页框——物理块——内存块——物理页面

Page Frame —— 页框(标准点)

物理块号——页帧号——内存块号

页表——存储【逻辑地址】与【物理地址】的映射关系

 

如何计算——页表的大小(根据内存大小推算)【具体步骤——看左下角】

页号不占空间!!!——数组索引【这个页表——类似于一维数组~】

为了计算机计算——页面大小用2的【整数幂】

在计算机网络那里类似,计算也是这样,要方便得多~

 

(2)逻辑地址-结构【页号+页内偏移量】

 

(3)总结——概念

 

(4)重点——地址变换过程(五步)

 

文字说明版本——五步骤

 

(5)重点——例题

如何将【逻辑地址】——转为【物理地址】

(6)重点——页表(如何存储在内存中)

计算机组成原理——也有讲哟~~~

页表——存放在内存当中——也称为(慢表)

计算页表项——占多少位(最好是2的次方!)实际应用中——方便计算!

 

(7)总结——地址变换

 

7、快表(TLB)

查询快表——不需要访存(快表是高速缓存)

(1)查询过程——1(先快表,再慢表,最后内存)

 

(2)查询过程——2(同时查找-快表-慢表)

 

(3)局部性原理

 

(4)总结 (TLB和高速缓存有区别!!!)

普通的Cache会存放各种数据

但是——TLB——只存放页表项的副本!!!

8、两级页表(开始套娃啦)

记住——加一层的解决方式——可以多次套娃!!!(可以不止两层哟~)

 

(1)从一级—二级—偏移量(转到物理地址)

 

(2)单级页表

 

(3)细节重点

条件:40位逻辑地址——知道物理块的大小(4KB)——页表的每一项的大小(4B)

①地址偏移量需要多少位?

总共40位,一个物理块有4KB,(2^12位)——采用2进制表示偏移量:需12位

②还是剩下多少位——用来表示各级页表?40-12 = 28

③怎么分各级页表?随便分?(题目限制:各级页表的大小不能超过一个内存块!

④那么请问一个物理块可以容纳多少页表项?——2^12 / 4 = 2^10

每一级页表的大小不能超过物理块的大小!——那么只能按照内存块最大位数来分咯~

28 分为 10 – 10 – 8 (3级,一级:2^10,二级:2^10,三级:2^8)

当然,可以再分多级也可以啦~(只不过会有更多碎片!)

比如: 28分为 ——7,7,7,7(4级,每级2^7这么大)

详细结题——如下图:

 

(4)总结

 

9、段页式管理方式

(1)段表

段号——也可以隐含【类似数组的索引,是隐含的~】

 

(2)查询段表——顺序

分段中——每个长度不一样!!!

一定要越界检查!!!(段号是否越界?段内地址是否合法?)

 

(3)分段 & 分页 【对比】

分页——用户不可见——提高利用率——地址空间【一维——映射的物理地址】

分段——用户可见——满足用户需求——地址空间【二维——段名+段内地址】

分页——长度固定——更容易共享&保护

分段——长度不固定——

(4)总结

段表和页表——都存储在内存中——可以成为慢表

他们都可以再往上封装一层——即为:【快表】——加快CPU的查询效率!!!

(注意:这些术语只是方便我们理解,是前人们的智慧结晶~不要被这些术语锁死!)

快表为什么叫快表?因为他快!他在Cache里面,造价高…等等原因!

 

10、虚拟内存

 

(1)传统存储管理方式——特征、缺点

一次性——全部放入内存(太大了,可不行!)

驻留性——暂时用不上的(留着内存中,消耗了资源)

 

(2)虚拟内存——定义、特征

多次性、对换性、虚拟性

 

(3)如何实现——虚拟内存

【内存的页面】的【换入换出】(怎么实现)?

 

(4)总结

虚拟内存——是高速缓存技术的拓展!

既然你内存查询,都分了多个级别(Cache里面有三级)(内存里面就再分个级别吧~)

注意:计算机组成原理——在Cache章节,说明Cache的换入和换出!

为什么计算机组成原理那里只介绍了Cache的替换算法呢?

因为,【Cache替换的实现是由【硬件】完成的!

在这里,【内存】由操作系统来管理,自然需要操作系统(系统软件)来实现啊!

 

虚拟内存是计算机系统中的一种技术,用于将磁盘空间作为辅助内存来扩展主存(RAM)的容量。

它允许操作系统将部分数据移动到磁盘上,并在需要时将其还原回主存。

虚拟内存的设计目的是提供比物理内存更大的地址空间,以及更灵活的内存管理。

虚拟内存与高速缓存是不同的概念。

高速缓存是一种位于处理器和主存之间的存储器层次结构,用于加快对常用数据的访问速度。

而虚拟内存是一种通过存储器映射技术实现的内存扩展机制,用于增加可用的地址空间。

关于计算机组成原理中只介绍了Cache的替换算法而没有涉及虚拟内存的解释,可能是因为计算机组成原理的重点是硬件层面的设计和实现。

因此,在讲解Cache时主要侧重于硬件层面的实现细节,如替换算法、缓存一致性、写策略等。

而虚拟内存的管理是由操作系统来完成的,属于系统软件的范畴,因此在计算机组成原理这门课程中可能没有过多介绍。

需要注意的是,虚拟内存和Cache是不同层次的存储器技术,各自有不同的设计原理和实现方法。虚拟内存的管理涉及到操作系统的内存管理模块,而Cache的管理则由硬件电路来完成。

11、请求页面——管理方式

 

(1)缺页中断(内中断)

没有需要的页——产生中断

如果有空闲块——直接占用(没有的话,使用页面置换算法~)

(2)地址变换

(3)总结

12、页面置换算法

(1)最佳置换算法(无法实现)

这个是——理想算法(实际应用中,无法实现)

因为——他需要提前知道后面需要访问的页面是什么!(很显然,不能做到)

 

(2)先进先出算法(绝对公平——Belady异常)

性能差——注意——Belady异常!(随着访问次数增多,缺页次数反而减少!)

 

(3)最近最久未使用置换算法(LRU)

适用于局部性好的(性能好)——需要硬件支持,开销大

 

(4)时钟页面置换算法(CLOCK & NRU)

扫描的过程——像一个时钟——不断计数(访问位为:0 / 1)

最近未用算法

最坏情况——扫两轮(一圈多一点)

 

(5)时钟页面置换算法——改进型

会筛选4轮!(最坏情况下,要转3圈多一点)

1、未访问、未修改

2、未访问、已修改

3、已访问、未修改

4、已访问、已修改

(注意:访问的权利大!排在最后!)

 

(6)总结(要会手推——页面替换)

 

PS:并不止这些算法,还有其他替换算法哟~

比如——随机替换算法(和猴子排序类似的有趣,哈哈哈~)

最不常用算法(LFU)——考虑的是访问次数 or 频率

 

12、页面分配策略、抖动、工作集

(1)工作集模型(清华教程)

工作集——内存的区间(大小)——我觉得成为【工作间还挺好~】

【你活动的空间太大了,不太好】

【你活动的空间太小了,也不太好~】

当你经常卡壳(说明你活动空间小,需要增多活动空间)

当你不卡壳(说明你活得很滋润,浪费了一些空间,需要给你减少空间!)

资本家看了都流泪(┭┮﹏┭┮)~

 

 

 

 

 

 (2)驻留集——分配策略【王道】

1、开始给你分配固定的大小工作空间

2、动态给你调整(调整又分为内部调整、外部调整)

内部调整(局部)——把你进程内部的物理块变为工作区间

外部调整(全局)——把外部空间(空闲)物理块给你

 

 

(3)何时调入页面(亡羊补牢 or 未雨绸缪)

先调入?还是缺了再调入?(具体场景,具体分析~)

 

(4)在哪里调入?(经典加一层)

在外存中,再套一层(对换区)

方便页面置换(换出来的页面就放到“对换区”)

 

(5)抖动现象

物理块不够时,频繁访问页面——导致(频繁出现“缺页中断”)

 

(6)工作集(拓展-考试貌似不考~)

工作集 ≠ 驻留集

驻留集——给定的工作空间

工作集——在工作空间里(加了一个窗口,也就是时间间隔)

因此——驻留集 > 工作集

 

(7)总结

 

13、内存映射文件

 

(1)方便程序员——访问文件数据

传统方式——程序员手动写read、write方法,很麻烦

优化方式——操作系统为我们完成对外存的读和写(相当于操作系统封装了一层~)

我们就可以像——操作C语言那样,完成指定的读入和写入啦~

(2)共享数据——同时访问一个文件

参考Windows上的.txt文件(并不是互斥的哟~)

  1. 我可以用【记事本】打开~
  2. 我还可以用【VsCode】打开~

 

 

(3)总结(关于磁盘的IO,操作系统是专业滴!)

什么时候读,什么时候写(可以让操作系统来完成~)这方面的性能可以让操作系统来优化

程序员就可以放开手脚做其他的事情啦~

(当然,对应强迫症的工程师,可以自己来控制和考虑啦~)

 

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

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

相关文章

WPF的CheckBox中的三个状态

WPF的CheckBox中的三个状态 CheckBox控件和RadioButton控件是继承自ToggleButton类,这意味着用户可切换他们的开关状态,其中IsChecked属性是可空的Boolean类型,这意味着该属性可以设置为true,false或null。 null值表示不确定状态…

《一个操作系统的实现》windows用vm安装CentOS——从bochs环境搭建到第一个demo跑通

vm安装CentOS虚拟机带有桌面的版本。su输入密码123456。更新yum -y update 。一般已经安装好后面这2个工具:yum install -y net-tools wget。看下ip地址ifconfig,然后本地终端连接ssh root192.168.249.132输入密码即可,主要是为了复制网址方便…

CW4-6A-S、CW4-10A-S、CW4-20A-S、CW4-30A-S螺栓式滤波器

CW3L2-3A-S、CW3L2-6A-S、CW3L2-10A-S、CW3L2-20A-S CW3-3A-S、CW3-6A-S、CW3-10A-S、CW3-20A-S、CW3-30A-S CW4EL2-3A-S、CW4EL2-6A-S、CW4EL2-10A-SCW4EL2-20A-S、CW4EL2-30A-S CW4E-3A-S、CW4E-6A-S、CW4E-10A-S、CW4E-20A-S、CW4E-30A-S CW4E-40A-S(001)、CW4E-50A-S(0…

小说作者分享:如何利用爱校对使我的作品更出彩?

在创作小说的过程中,校对和修改是至关重要的步骤。许多作家已经开始利用“爱校对”这一工具,有效地提高他们作品的质量。本篇文章将通过实际案例,展示一些小说作者是如何成功地利用爱校对来精雕细琢他们的文字,并将作品提升到一个…

vue 弹出框 引入另一个vue页面

为什么要这么做,适用于在一个页面逻辑比较多的时候,可以搞多个页面,防止出错 index页面点击解约按钮,弹出框 进入jieyue.vue 核心代码 <el-buttonsize"mini"type"text"icon"el-icon-edit"v-if"scope.row.delFlag 0"click"j…

Jenkins工具系列 —— 配置邮箱 每个job下动态设置临时发送人

文章目录 安装插件添加邮箱认证邮箱申请&#xff08;以QQ邮箱网页为例&#xff09;jenkins添加邮箱认证 jenkins设置邮箱相关信息配置全局邮件单个JOB邮箱配置 安装插件 点击 左侧的 Manage Jenkins —> Plugins ——> 左侧的 Available plugins 添加邮箱认证 邮箱申请…

vue3 tailwindcss的使用

首先安装依赖&#xff1a; npm install -D tailwindcsslatest postcsslatest autoprefixerlatestnpm i -D unocss 然后vite.config.ts中 引入 import Unocss from unocss/viteexport default defineConfig({plugins: [Unocss(),],})终端执行&#xff1a; npx tailwindcss in…

基于Java SpringBoot+vue+html 的地方美食系统(2.0版本)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,csdn、博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统流程的分析3.1 用户管理的流程3.2个人中心管理流程3.3登录流程 4系统设计…

Rides分布式缓存

分布式缓存 -- 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 1.Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化 AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#x…

网络安全--负载均衡

一、负载均衡配置 1.在全局的http下写下它&#xff1a; upstream nginx_boot{# 30s内检查心跳发送两次包&#xff0c;未回复就代表该机器宕机&#xff0c;请求分发权重比为1:2server 192.168.0.000:8080 weight100 max_fails2 fail_timeout30s; server 192.168.0.000:8090 we…

QT Quick之quick与C++混合编程

Qt quick能够生成非常绚丽界面&#xff0c;但有其局限性的&#xff0c;对于一些业务逻辑和复杂算法&#xff0c;比如低阶的网络编程如 QTcpSocket &#xff0c;多线程&#xff0c;又如 XML 文档处理类库 QXmlStreamReader / QXmlStreamWriter 等等&#xff0c;在 QML 中要么不可…

【Python爬虫案例】爬取大麦网任意城市的近期演出!

老规矩&#xff0c;先上结果&#xff1a; 含10个字段&#xff1a; 页码&#xff0c;演出标题&#xff0c;链接地址&#xff0c;演出时间&#xff0c;演出城市&#xff0c;演出地点&#xff0c;售价&#xff0c;演出类别&#xff0c;演出子类别&#xff0c;售票状态。 代码演示…

CodeSite for .NET Crack

CodeSite for .NET Crack CodeSite for.NET与Visual Studio集成&#xff0c;通过实时查看器日志记录系统提供对代码执行的更深入了解&#xff0c;该系统有助于在本地或远程执行代码时快速查找问题。超越传统的断点调试&#xff0c;在应用程序继续运行时记录应用程序的执行&…

03:TIM定时器

目录 一:TIM 1:介绍 2:定时器的分类 3:基本定时器 4:通用定时器 5:高级定时器 6:定时器的基本结构 二:定时中断功能 A:定时器定时器中断 1:连接图 ​编辑 2:步骤 3:函数介绍 4:代码 三:外部时钟功能 A:定时器外部时钟 1:连接图 2:函数介绍 3:外部时钟代码 一…

Python编程基础-文件的打开和读取

文件的访问 使用 open() 函数 打开文件 &#xff0c;返回一个 file 对象 使用 file 对象的读 / 写方法对文件进行读 / 写的 操作 使用 file 对象的 close() 方法关闭文件 打开文件 open()方法&#xff0c;需要一个字符串路径&#xff0c;并返回一个文件对象&#xff0c;默认是”…

C# OpenCvSharp DNN 二维码增强 超分辨率

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Dnn; using OpenCvSh…

数据结构 - 线性表的顺序存储

一、顺序存储定义&#xff1a; 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中。简言之&#xff0c;逻辑上相邻&#xff0c;物理上也相邻顺序表中&#xff0c;任一元素可以随机存取&#xff08;优点&#xff09; 二、顺序表中元素存储位置的计算 三、顺序表在算法中的实…

kubernetes--技术文档-真--集群搭建-三台服务器一主二从(非高可用)-三服务器位于同交换机中

在使用k8s之前如果不太熟悉k8s的可以先看这个文章&#xff1a; kubernetes--技术文档--基本概念--《10分钟快速了解》_一单成的博客-CSDN博客 三节点相同安装操作&#xff1a; 1、设置hosts解析 根据角色在三个服务器中运行&#xff0c;设置自己的hostname。 标识&#xf…

如何使用CSS实现一个拖拽排序效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现拖拽排序效果的CSS和JavaScript示例⭐ HTML 结构⭐ CSS 样式 (styles.css)⭐ JavaScript 代码 (script.js)⭐ 实现说明⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦…

shell和Python 两种方法分别画 iostat的监控图

在服务器存储的测试中,经常需要看performance的性能曲线&#xff0c;这样最能直接观察HDD或者SSD的性能曲线。 如下这是一个针对HDD跑Fio读写的iostat监控log,下面介绍一下分别用shell 和Python3 写画iostat图的方法 1 shell脚本 环境:linux OS gnuplot工具 第一步 :解析iosta…