操作系统——内存管理(附带Leetcode算法题LRU)

1.内存管理主要用来干什么?

操作系统的内存管理主要负责内存的分配与回收内存扩充(虚拟技术)地址转换(逻辑-物理)、内存保护(保证各进程在自己的内存空间运行,不会越界访问).....

2.什么是内存碎片?

内存碎片是内存的申请和释放产生的,内存碎片会导致内存利用率下降。内存碎片分为内部内存碎片和外部内存碎片。

  • 内部内存碎片:分配的内存比实际使用的内存大,哪些没有被使用的内存就被称为内部内存碎片。

 

  •  外部内存碎片:内存并没有紧挨着被分配,这些没有被分配的内存区域太小,不能满足任意进程的内存分配请求,这些小片段且不连续的内存空间被称为外部碎片。

 

3.虚拟内存

3.1传统存储管理方式的缺点?

作业数据必须一次全部调入内存,作业数据在整个运行期间都会常驻内存。

3.2局部性原理

  • 时间局部性:现在访问的指令、数据在不久后很可能会被再次访问。

  • 空间局部性:现在访问的内存单元周围的内存空间,很可能在不久后会被访问。

3.3什么是虚拟内存?有什么用?

虚拟内存本质上来说只是逻辑存在的,是一个假想出来的内存空间,若内存空间不够,由操作系统负责将内存中暂时不用到的信息换出到外存,在用户看来似乎有一个比实际内存大得多的内存,主要作用是作为进程访问主物理内存的桥梁并简化内存管理。

        当访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存(请求调页),内存空间不够时,将内存中暂时用不到的信息换出到外存(页面置换)。虚拟内存的实现是非连续的分配管理方式。

4.内存空间的分配与回收

4.1连续分配

连续分配管理的方法有单一连续分配、固定分区分配、动态分区分配。

  • 单一连续分配:会产生内部内存碎片。

  • 固定分区分配:会产生内部内存碎片。

  • 动态分区分配:会产生外部内存碎片

4.2非连续分配(离散式的)

非连续分配管理的方法有段式管理、页式管理、段页式管理。

  • 段式管理:将物理内存和虚拟内存分为不等长的段,通过段表映射虚拟地址和物理地址。虚拟地址中有两部分为段号段内偏移量,由段号去段表中查找,找到段号对应的起始地址,然后将起始地址替换虚拟地址的段号部分,得到的起始地址+段内偏移量就为物理地址。分段会产生外部内存碎片。

 

  • 页式管理:将物理内存和虚拟内存分为等长连续的页,可有效避免外部内存碎片的问题,但也可能出现内部内存碎片。分页管理通过多级页表映射虚拟地址和物理地址,虚拟地址中有两部分为页号页面偏移量,拿着页号去应用程序的页表中查找,找到物理页号,得到的物理页起始地址+页内偏移量就为最终的物理地址。  

注意:多级页表属于时间换空间的典型场景,利用增加页表查询的次数减少页表占用的空间!

为了提高虚拟地址到物理地址的转换速度,引入了快表TLB,类似Redis的作用,来做虚拟页号到物理页号的缓存。

 

4.2.1换页机制

换页机制:有时我们会发现一个有趣的现象,就是我们看起来一个进程运行所需的内存比我们电脑的内存要大,但是这个进程也是能正常运行,这就是换页机制带来的好处,操作系统选择一些不常用的物理页,将它们的内存先放入磁盘,等到需要使用时再从磁盘上加载,换页机制利用磁盘这种较低廉的存储设备扩展物理内存,以时间换空间的做法。

4.2.2页面置换算法

页面置换算法:常见的有先进先出页面置换算法、最近最久未使用页面置换算法(LRU)、最近最少使用页面置换算法(LFU)。

class LRUCache {static class  Node{int key;int value;Node preNode;Node nextNode;public Node(int key,int value){this.key = key;this.value = value;}} //自定义结点HashMap<Integer,Node> map; //mapint size; //map中存储的元素个数int capacity; //最大容量Node dummyHead; //虚拟头结点Node dummyTail; //虚拟尾结点public LRUCache(int capacity) {this.capacity = capacity;this.size = 0;dummyHead = new Node(-1,-1);dummyTail = new Node(-1,-1);map = new HashMap<>();dummyHead.nextNode = dummyTail;dummyTail.preNode = dummyHead;}public int get(int key) {Node node = map.get(key);if(node==null){ //说明没有这个键return -1;}//将这个结点移动到首部moveNodeToHead(node);return node.value;}public void put(int key, int value) {Node node = map.get(key);if(node==null){ //如果不存在,则证明要添加//创建结点Node curNode = new Node(key,value);//添加进map中map.put(key,curNode);//添加到头部,因为也算是访问了addNodeToHead(curNode);this.size++;if(this.size>capacity){//删除最久没被访问的结点Node tailNode = removeTailNode();map.remove(tailNode.key);this.size--;}}else{ //如果存在,则证明只需要修改元素值,以及移动到头部即可node.value = value;moveNodeToHead(node);}}private Node removeTailNode() { //删除尾部的结点并且返回Node resultNode = dummyTail.preNode;moveNode(resultNode);return resultNode;}private void addNodeToHead(Node node) { //将结点添加到头部node.preNode = dummyHead;node.nextNode = dummyHead.nextNode;dummyHead.nextNode.preNode = node;dummyHead.nextNode = node;}private void moveNodeToHead(Node node) { //失去前后的联系moveNode(node);//移动到头部addNodeToHead(node);}private void moveNode(Node node){ //删除结点node.preNode.nextNode = node.nextNode;node.nextNode.preNode = node.preNode;}
}

 

  • 段页式管理:结合了段式管理和页式管理,把物理内存先分成若干段,每个段又继续分成若干大小相等的页,先进行段式地址映射,再进行页式地址映射。

4.2.3页面抖动现象?

刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,页面频繁换入换出的现象,称为抖动,主要原因是分配给进程存储数据的物理区域不够

4.2.4说一下分段机制和分页机制的区别?

分页机制以页面为单位进行内存管理,而分段机制以段为单位进行内存管理;页的大小是固定的、而段的大小是不固定的;所以分段机制会产生外部内存碎片问题,分页机制没有外部内存碎片问题,但由于固定页,所以可能会产生内部内存碎片;页是物理单位、而段是逻辑单位;页表是通过一级页表和二级页表等多级页表来实现多级映射,而段表是单个的。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程基础铺垫(一)硬件基础:冯诺依曼体结构

冯诺依曼体结构 一、体系结构&#xff08;硬件上&#xff09;—— 冯诺依曼体系结构二、内存 的引入&#xff1a;为什么在体系结构中要存在内存? ?前言&#xff1a;内存背景 三、在体系结构中 存在内存的原因 以及 内存的意义 一、体系结构&#xff08;硬件上&#xff09;——…

【大厂AI课学习笔记】【1.6 人工智能基础知识】(2)机器学习

目录 必须理解的知识点&#xff1a; 举一个草莓的例子&#xff1a; 机器学习的三个类别&#xff1a; 监督学习&#xff1a; 无监督学习&#xff1a; 强化学习&#xff1a; 更多知识背景&#xff1a; 机器学习的诞生需求 监督学习的关键技术与实现步骤 无监督学习的关…

winprop二次开发

winprop二次开发 前言工具1——整合多个天线结果用途代码实现 未完待续 前言 工作需求&#xff0c;对该软件进行简单地二次开发&#xff0c;都是一些挺简单的代码&#xff0c;单纯是为了上传之后将其从本地删除 工具1——整合多个天线结果 用途 winprop最终的计算结果&…

机器学习之局部最优和全局最优

(1)局部最优&#xff0c;就是在函数值空间的一个有限区域内寻找最小值;而全局最优&#xff0c;是在函数值空间整个区域寻找最小值问题。 (2)函数局部最小点是它的函数值小于或等于附近点的点&#xff0c;但是有可能大于较远距离的点。 (3)全局最小点是那种它的函数值小于或等于…

家用小型洗地机好用吗?家用洗地机品牌

传统的清洁地面方式&#xff0c;不仅耗费时间、精力&#xff0c;还会造成人的腰酸背痛&#xff0c;带来一连串的家务后遗症&#xff0c;简直是苦不堪言。像洗地机、扫地机器人、吸尘器等电动清洁工具的诞生让人们的清洁更加轻松省事&#xff0c;也凭借着这些优势深受大众喜爱。…

第78讲 修改密码

系统管理实现 修改密码实现 前端 modifyPassword.vue&#xff1a; <template><el-card><el-formref"formRef":model"form":rules"rules"label-width"150px"><el-form-item label"用户名&#xff1a;&quo…

四.Linux实用操作 12-14.环境变量文件的上传和下载压缩和解压

目录 四.Linux实用操作 12.环境变量 环境变量 环境变量--PATH $ 符号 自行设置环境变量 自定义环境变量PATH 总结 四.Linux实用操作 13.文件的上传和下载 上传&#xff0c;下载 rz&#xff0c;sz命令 四.Linux实用操作 14.压缩和解压 压缩格式 tar命令 tar命令压缩…

龙年,大吉

&#xff08;1&#xff09; 没有成功的企业&#xff0c;只有时代的企业。这就是人们老说的&#xff1a;天道酬勤。虽然这句话被人说滥了&#xff0c;虽然这句话被人说到反感了&#xff0c;但事实就是这样。 得道者多助。 &#xff08;2&#xff09; 人有三大运、三小运。 三大运…

STM32 7-8

目录 ADC AD单通道 AD多通道 DMA DMA转运数据 DMAAD多通道 ADC AD单通道 AD.c #include "stm32f10x.h" // Device header/*** brief 初始化AD所需要的所有设备* param 无* retval 无*/ void AD_Init(void) {RCC_APB2PeriphClockCmd(RCC_AP…

SPI NOR FLASH和SPI NAND FLASH

SPI NOR FLASH和SPI NAND FLASH是两种不同的存储设备&#xff0c;它们在硬件接口和软件应用上都有所不同。以下是关于这两种存储设备更详细的介绍&#xff1a; 1.SPI NOR FLASH SPI NOR FLASH是一种非易失性存储器&#xff0c;它通过串行接口进行数据传输&#xff0c;具有读写…

【fortran】开源BLAS库矩阵乘法的简单Fortran示例

一、安装开源BLAS库OpenBLAS 安装 OpenBLAS 可以通过几个步骤来完成&#xff0c;这些步骤因操作系统的不同而有所变化。以下是为几种常见系统下的安装。 在 Ubuntu/Debian Linux 上安装 OpenBLAS 在基于 Debian 的系统&#xff08;如 Ubuntu&#xff09;上&#xff0c;可以使…

FAST角点检测算法

FAST&#xff08;Features from Accelerated Segment Test&#xff09;角点检测算法是一种快速且高效的角点检测方法。它通过检测每个像素周围的连续像素集合&#xff0c;确定是否为角点。以下是 FAST 角点检测算法的基本流程&#xff1a; FAST 角点检测算法的基本过程主要包括…