操作系统—内存管理

news2024/9/27 5:43:40
  • 单片机是没有操作系统的,每次写完代码都是通过一些工具将程序直接烧录进去,这样程序才能跑起来。单片机的CPU是直接操作内存的物理地址。在这种情况下,要想在内存中同时运行两个程序是不可能的,程序会崩溃。那么操作系统为了解决这个问题,就引入了虚拟内存的概念。可以将进程所使用的地址隔离开来,操作系统为每个进程分配独立的一套虚拟地址。
  • 进程持有的虚拟地址会通过CPU芯片中的内存管理单元MMU的映射关系来转换变成物理地址,然后通过物理地址访问内存。
  • 操作系统主要通过内存分段和内存分页来管理虚拟地址和物理地址的关系

内存

理解的内存

内存是用于存放数据的硬件。程序执行之前需要先放到内存中才能被CPU处理

操作系统对于内存的管理

  • 负责空间分配和回收
  • 需要提供某种技术从逻辑上对内存空间进行扩充
  • 提供地址转换功能,负责程序的逻辑地址与物理地址的转换
  • 提供内存保护功能,保证各个进程在各自存储空间运行,互不干扰。

常见的内存分配方式

静态存储区域分配

内存在程序编译的时候就已经分配好,这块内存在程序整个运行期间都存在。例如全局变量,static变量。

在栈上创建

执行函数的时候,函数内局部变量的存储单元都可以在栈上创建,函数执行结束的时候被释放。栈分配运算内置于处理器的指令集中,效率很高,分配的内存容量有限。

堆上分配

malloc和new

常见的内存分配内存错误

分配未成功却使用了它

检查是否为NULL

分配成功但是尚未初始化就使用

需要赋初值

操作越过内存界限

数组操作越界

忘记释放内存

会出现内存耗尽的情况

释放内存却继续使用它
  • 不清楚是否已经释放内存
  • 返回了栈内存的指针或者引用
  • 产生野指针,也就是在使用free或者delete释放内存之后,没有将指针设置为NULL

内存交换

内存空间紧张的时候,系统将内存中的某些进程暂时换出内存,把外存中某些已具备运行条件的进程换入内存。

内存交换换出的进程保存在哪里

保存在磁盘中。具有兑换功能的操作系统中,通常把磁盘空间分为文件区和对换区:文件区存放文件,主要追求存储空间利用率,因此采用离散分配方式;对换区空间只占磁盘空间的小部分,被换出的进程数据放在对换区,主要追求换入换出速度,所以采用连续分配方式,I/O速度比文件区快。

哪些进程被优先考虑

优先换出阻塞进程,优先级低的进程并且考虑进程在内存的驻留时间。

PCB常驻内存,不会被换出。

什么时候进行内存交换

许多进程运行且内存吃紧时进行内存交换,系统负荷降低就暂停。

内存交换和覆盖有什么区别

内存覆盖

可以把用户空间分成一个固定去和若干个覆盖区。将经常活跃的部分放在固定区,其余部分按照调用关系分段,首先将那些即将访问的段放入覆盖区,其他段放在外存中,在需要调用之前,系统将其调入覆盖区,替换覆盖区中原有的段。

注意:内存中能够更新的地方只有覆盖区的段,不在覆盖区的段会常驻内存。

区别

交换主要是在不同进程或者作业之间进行,而覆盖是用于同一程序或者进程中。

抖动

刚换出的页面马上又要换入内存,刚换入的页面马上又要换出外存,这种频繁的页面调度成为抖动或者颠簸。产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)

为了研究应该为每个进程分配多少个物理块,提出了就”进程工作集“的概念。

内存交换需要注意哪些

  • 交换需要备份存储,通常是快速磁盘,必须足够大,并且提供对这些内存映像的直接访问。
  • 为了有效使用CPU,需要每个进程的执行时间比交换时间长
  • 交换空间通常作为磁盘的一整块
  • 交换通常在有许多进程运行且内存吃紧的时候开始启动

动态分区算法

在这里插入图片描述

虚拟技术

虚拟技术就是把一个物理实体转换成多个逻辑实体

主要有两种虚拟技术:时间复用和空间复用。

  • 多进程和多线程:多个进程能在同一个处理器上并发执行使用了时分复用技术,让每个进程轮流占用处理器,每次只执行一个小时间片并快速切换。
  • 虚拟内存使用了空分复用技术:将物理内存抽象为地址空间,每个进程都有各自的地址空间。地址空间的页被映射到物理内存,地址空间的页不需要全部在物理内存中,当使用到一个没有在物理内存的页时,执行页面置换算法,将该页置换到内存中。

虚拟内存

虚拟内存目的

为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。
操作系统将内存抽象成地址空间,每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一个页。这些页被映射到物理内存,但是不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中

程序从堆中动态分配内存的时候,虚拟内存上如何操作

页表:是一个存放在物理内存中的数据结构,记录了虚拟页与物理页的映射关系。
进行动态内存分配的时候,操作系统会在硬盘中创建或者申请一段虚拟内存空间,并更新到页表(分配一个页表条目PTE,使该PTE指向硬盘上这个新创建的虚拟页),通过PTE建立虚拟页和物理页的关系。

逻辑地址转换为物理地址

通常,在系统中设置一个页表寄存器PTR,存放页表在内存中的起始地址和页表长度。进程未执行的时候,页表的起始地址和页表的长度放在进程控制块中,进程被调度的时候,操作系统内核会把他们放到页表寄存器中。

  • 根据逻辑地址计算出页号、页内偏移量
  • 判断页号是否越界
  • 查询页表,找到页号对应的页表项,确定页面(内存块号)
  • 用内存块号×页面大小和页内偏移量相加而得到物理地址
  • 访问目标内存单元

而非你也存储管理中,只要确定每个页面大小,就可以确定逻辑地址结构。

快表

快表是一种高速缓冲存储器,又称为联想寄存器TLB,用来存放页表项。在没有快表的情况下,一个虚拟地址要转成一个物理地址至少需要两次访问物理内存,第一次是查询内存中的页表,第二次是访问物理页框。如果有暂存着目标页表项的快表,则通过快表访问页表会比在内存中访问页表快很多,有利于缩短从一个虚拟地址转换成一个物理地址的过程的时间。

交换空间与虚拟内存的关系

交换空间

Linux中的交换空间在物理内存RAM被充满时使用。如果系统需要更多的内存资源而物理内存已满,内存中不活跃的页就会被移到交换空间去。交换空间位于硬盘驱动器上,它比进入物理内存慢。交换空间可以是一个专用的交换分区、交换文件或者两者组合。

交换空间总大小应该相当于你计算机内存的两倍和32MB这两个值中较大的一个,但是不能超过2GB.

虚拟内存

是文件数据交叉连接的活动文件。是Windows目录下的一个“WIN386.SWP"文件,这个文件会不断扩大和自动缩小。而且虚拟内存使用的是硬盘的空间,因为硬盘空间大。

内存碎片

内部碎片

内部碎片是已经被分配出去而不能利用的空间。

外部碎片

外部碎片是没有被分配出去,但是由于太小了无法分配给新进程的内存空闲区域。

如何消除碎片文件

外部碎片
  • 紧凑技术,这需要动态重定位寄存器的支持。
  • 内存交换
    回收内存的时候要尽可能将相邻的空间合并。
内部碎片

优化应用程序中的内存管理方式,不要频繁申请、释放内存空间,减少外部碎片。

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

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

相关文章

LLM相关的一些调研

Prompt Engine 可以参考该项目,该项目提供关于提示词书写的规则。由openai以及吴恩达完成。 https://github.com/datawhalechina/prompt-engineering-for-developers由于目前chatgpt 无法直接在国内访问,推荐在claude on slack上尝试。关于claude api h…

Leetcode:1035. 不相交的线、53. 最大子数组和(C++)

目录 1035. 不相交的线 题目描述: 实现代码与解析: 动态规划 原理解析: 53. 最大子数组和 题目描述: 实现代码与解析: 动态规划 原理思路: 1035. 不相交的线 题目描述: 在两条独立的水…

移动端永不过时的高薪技术岗位,原来是它……

随着 Android 设备的普及和应用领域的不断扩大,Android Framework 开发需求量将会持续增长,并且会越来越多地向行业、企业级应用和系统优化等方向发展。以下是一些 Android Framework 开发相关的应用场景: 1. 特定垂直领域的智能设备&#x…

Jmeter性能测试

一、jmeter多并发 1.线程设置: 线程数——多少个虚拟用户 ramp_up时间(秒)——时间,设置时间内将线程都跑完 循环次数——勾选永远,就一直跑,直到手动停止;输入数字,就是循环多少次 2.jmeter逻辑分支控制…

关于MySQL性能优化方案,掌握这一篇就够了!

目录 前言 一、设置索引 1、索引的优缺点: 2、给表列创建索引 3、查看索引 4、删除索引: 5、索引原理: 二、分类讨论 三、针对偶尔很慢的情况 1、 数据库在刷新脏页(flush) 2. 拿不到锁我能怎么办 四、针对一直都这…

力扣题库刷题笔记16--最接近的三数之和

1、题目如下: 2、个人Python代码实现 本题的思路应该与很早之前刷的第15题三数之和是一个思路: 1、先将数组排序,然后进行遍历数组 2、确定左指针、右指针 3、判断三个数之和是否接近目标值 4、重点是,为确保左右指针不是同一个元…

Transformer回归预测

一、Attention is all you need——李沐论文精读Transformer 论文地址: https://arxiv.org/pdf/1706.03762.pdf Transformer论文逐段精读【论文精读】 卷积神经网络对较长的序列难以建模,因为他每次看一个比较小的窗口,如果两个像素隔得比较…

6.STM32时钟系统

1.时钟系统框图: HSI:高速的内部时钟->8MHz;HSE:外部高速时钟->8MHz;PLL: 锁相环->用于倍频(放大频率);CSS:时钟监控系统(一旦检测到HSE(外部晶振)失败,将会自动切换系统时钟源HSI);LS…

高等数学函数的性质

(本文内容为个人笔记分享) 牛顿二项公式 ( x y ) n ∑ k 0 n C n k ⋅ x n − k y k (xy)^n\stackrel{n}{\sum\limits_{k0}}C^k_n\sdot x^{n-k}y^k (xy)nk0∑​n​Cnk​⋅xn−kyk. 映射 f : X → Y f:X\rightarrow Y f:X→Y, f f f 为 …

成功解决RuntimeError:Unable to find a valid cuDNN algorithm to run convolution

该错误有可能是由于GPU不足导致的 有两种解决方法: 方法一:指定device 在指定device时,没有指定具体的卡 只用了如下代码 device torch.device("cuda" if torch.cuda.is_available() else "cpu")默认使用了index0的卡&#xff0…

CppUTest——【由JUnit移植过来的】C++单元测试框架——的下载安装

C单元测试框架CppUTest的下载与安装 简介下载地址单元测试框架下载单元测试被测工程下载 安装安装Cygwin下载地址安装步骤手动安装CMake 编译单元测试框架CppUTest 导入到Virtual Studio准备条件根据VS版本选择导入对应的.sln文件 简介 CppUnit是【由JUnit移植过来的】C测试框…

每日一练 | 华为认证真题练习Day65

1、如果一个以太网数据帧的Length/Type0x8100,那么这个数据帧的载荷不可能是?(多选) A. ARP应答报文 B. OSPF报文 C. RSTP数据帧 D. STP数据帧 2、路由器某接口配置信息如下,则此端口可以接收携带哪个VLAN的数据包…

《C++ Primer》--学习8

vector 对象是如何增长的 当不得不获取新的内存空间时,vector 和 string 的实现通常会分配比新的空间需求更大的内存空间,容器预留这些空间作为备用,这样就不用每次添加新元素都重新分配容器的内存空间了 管理容器的成员函数 capacity 和 …

高速电路设计系列分享-带宽和动态范围

目录 概要 整体架构流程 技术名词解释 1.带宽 2.动态范围 小结 概要 提示:这里可以添加技术概要 本文继续熟悉一些基本概念。 在许多技术领域,我们习惯于把技术进步与更高的速率关联起来:从以太网到无线局域网再到蜂窝移动网络,数据通信的实质就是不断…

MySQL8.0(Win)的安装步骤

MySQL8.0(Win)的安装步骤 MySql8.0 安装网址MySql8.0 安装界面界面一界面二界面三界面四界面五界面六界面七界面八界面十界面十一 查看 MySql8.0 安装结果配置MySql8.0的环境变量Path使用命令行访问MySQL的安装结果使用命令行操作MySQL数据库显示MySQL中…

Fiddler 简单抓包

文章目录 一、Fiddler 简介二、下载 Fiddler三、功能介绍1、Filters2、Inspectors3、Automatic BreakPoints4、TextWizard5、其他常用功能 一、Fiddler 简介 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设…

计算机由于找不到msvcr120.dll无法执行代码的解决方法分享

运行软件程序或游戏的时候,计算机提示由于找不到msvcr120.dll无法执行代码是怎么回事呢?msvcr120.dll是Microsoft Visual C的一部分,用于在Windows操作系统上运行C应用程序。它是一个动态链接库文件,包含了许多C运行时库&#xff…

【日志1】rsyslog,logrotate,post_code,journalctl

文章目录 1.rsyslog:rsyslogd一个进程 ,管理每个进程发来的log并往/var/log里写,syslog函数将log写给rsyslogd进程,rsyslogd -v2.logrotate:logrotate /etc/logrotate.rsyslog(bb中重命名)3.pos…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(6月 26 日论文合集)

文章目录 一、检测相关(4篇)1.1 Bridging the Performance Gap between DETR and R-CNN for Graphical Object Detection in Document Images1.2 Cascade Subspace Clustering for Outlier Detection1.3 Lesion Detection on Leaves using Class Activation Maps1.4 Deep Omni-…

UI还不错的视频播放器:GOMPlayerPlus

之前给各位小伙伴们测试过一款叫【完美解码】开源的播放器,今天给各位同学测试了一款小编认为不错的UI视频播放器,大家也可以测试学习下,顺便也可以对比下看看是【完美解码】好用还是【GOMPlayerPlus】好用。 一、简单介绍 这款影音播放器是…