操作系统——内存管理(附带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://xiahunao.cn/news/2780030.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

第77讲用户管理功能实现

用户管理功能实现 前端&#xff1a; views/user/index.vue <template><el-card><el-row :gutter"20" class"header"><el-col :span"7"><el-input placeholder"请输入用户昵称..." clearable v-model"…

java学习(面向对象高级部分)

一、类变量 用一个例子引出类变量&#xff08;静态变量&#xff09; package object;public class temp {public static void main(String[] args) {child child1 new child("王");child1.count;child child2 new child("丽");child2.count;child child3…

python+flask+django医院预约挂号系统6nrhh

医院预约挂号系统主要有管理员、用户和医生三个功能模块。以下将对这三个功能的作用进行详细的剖析。 技术栈 后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django/flask Python版本&#xff1a;python3.7 数据库&#xff1a;mysql5.7 数据库工具…

备战蓝桥杯---数学基础3

本专题主要围绕同余来讲&#xff1a; 下面介绍一下基本概念与定理&#xff1a; 下面给出解这方程的一个例子&#xff1a; 下面是用代码实现扩展欧几里得算法&#xff1a; #include<bits/stdc.h> using namespace std; int gcd(int a,int b,int &x,int &y){if(b…

读千脑智能笔记11_保存人类遗产

1. 智能生物通常能延续多久 1.1. SETI和METI计划的可行性在很大程度上取决于智能生物通常能延续多久 1.1.1. 搜寻地外文明&#xff08;以下简称SETI&#xff09;计划的目标 1.1.1.1. 这是一个力图寻找宇宙其他地方智能生物存在证据的研究项目 1.1.1.2. SETI计划旨在寻找含有…

AI跟踪报道第28期-新加坡内哥谈技术-本周AI新闻:Gemini Ultra 来了

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【PWN · heap | Arbitrary Alloc】2015_9447ctf_search-engine

和【PWN heap | House Of Spirit】2014_hack.lu_oreo-CSDN博客略有区别&#xff0c;但都是通过malloc一块fake_chunk到指定区域&#xff0c;获得对该区域的写权限 目录 零、简单介绍 一、题目分析 1.主要功能 2.index_sentence(): 增添一条语句到“库”中 3.search_word(…

第四章 数学知识(一)(质数,质因子,)

一、数论 (一&#xff09;判断质数 1、质数合数都是针对>2的整数 2、质数的判断 一些因数的判断是不必要的。 #include<bits/stdc.h> //判断素数O&#xff08;n^0.5&#xff09; using namespace std; int n; bool is_Prime(int n) {if(n<2)return false;for(i…

pytorch常用激活函数笔记

1. relu函数&#xff1a; 公式&#xff1a; 深层网络内部激活函数常用这个 import matplotlib.pyplot as pltdef relu_fun(x):if x>0:return xelse:return 0x np.random.randn(10) y np.arange(10)plt.plot(y,x)for i ,t in enumerate(x):x[i] relu_fun(t) plt.p…

Acwing---839. 模拟堆

模拟堆 1.题目2.基本思想3.代码实现 1.题目 维护一个集合&#xff0c;初始时集合为空&#xff0c;支持如下几种操作&#xff1a; I x&#xff0c;插入一个数 x&#xff1b;PM&#xff0c;输出当前集合中的最小值&#xff1b;DM&#xff0c;删除当前集合中的最小值&#xff08…

Android:Cordova,JavaScript操作设备功能

Cordova学习 Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头、麦克风等。 Cordova还提供了一组统一的JavaScript类库,以及为这些类库所用的设备相关的原生后台代码。 Cordova是PhoneGap贡献给Apache后的开源项目,是从…

MATLAB知识点:isempty函数(★★★★☆)判断数组是否为空

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第…

HarmonyOS应用开发者高级认证解析 第二季

1. 判断题 云函数打包完成后&#xff0c;需要到APPGallery Connect创建对应函数的触发器才可以在端侧中调用。 【错】打包之前创建对应函数的触发器每一个自定义组件都有自己的生命周期。 【对】基于端云一体化开发&#xff0c;开发者需要精通前端&#xff0c;后端不同的开发语…

414. Third Maximum Number(第三大的数)

题目描述 给你一个非空数组&#xff0c;返回此数组中第三大的数 。如果不存在&#xff0c;则返回数组中最大的数。 问题分析 注意要查找的数是数组中第三大的数&#xff0c;相同大小的数算一个&#xff0c;对于此问题可以采用先将数组排序然后查找第三大的数采用排序的方式最…

【java基础题型】录入3位数,求每一位是?

\t 制表符&#xff0c;用于整到8个格子 Scanner类&#xff0c;导入Scanner包(1),代码里导入Scanner类写录入&#xff0c;调用录入的对象的方法 通用求个位数&#xff0c;%10即可&#xff0c;余数不会小于除数 package java录入3位数;import java.util.Scanner; …

unity学习案例总结

动态标签 GitHub - SarahMit/DynamicLabel3D: Simple dynamic labels for a 3D Unity scene

【Effective Objective - C 2.0】——读书笔记(三)

文章目录 十五、用前缀避免命名空间冲突十六、提供全能初始化方法十七、实现description方法十八、尽量使用不可变对象十九、使用清晰而协调的命名方式二十、为私有方法名加前缀二十一、理解Objective-C错误模型二十二、理解NSCopying协议 十五、用前缀避免命名空间冲突 OC语言…

mac卸载被锁定的app

sudo chflags -hv noschg /Applications/YunShu.app 参考&#xff1a;卸载云枢&#xff08;MacOS 版&#xff09;

《UE5_C++多人TPS完整教程》学习笔记1 ——《P2 关于本课程(About This Course)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P2 关于本课程&#xff08;About This Course&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

利用Python和pandas库进行股票技术分析:移动平均线和MACD指标

利用Python和pandas库进行股票技术分析&#xff1a;移动平均线和MACD指标 介绍准备工作数据准备计算移动平均线计算MACD指标结果展示完整代码演示 介绍 在股票市场中&#xff0c;技术分析是一种常用的方法&#xff0c;它通过对股票价格和交易量等历史数据的分析&#xff0c;来…