计算机基础--->操作系统(3)【内存管理】

news2024/11/24 11:24:54

文章目录

  • 内存管理
    • 内存管理主要做什么?
    • 什么是内存碎片?
    • 常见内存管理方式
    • 虚拟内存
      • 什么是虚拟内存?
      • 虚拟内存的作用?
      • 没有虚拟内存的问题
      • 什么是虚拟地址和物理地址?
    • 分段机制
    • 分页机制
      • 转址旁路缓存(TLB、快表)
      • 换页机制作用?
      • 什么是页缺失?
      • 常见的页面置换算法
    • 分页机制和分段机制的共同点和不同点
    • 段页机制
    • 局部性原理

内存管理

内存管理主要做什么?

  • 内存的分配与回收:对进程所需的内存进行分配和释放,malloc 函数:申请内存,free 函数:释放内存。
  • 地址转换:将程序中的虚拟地址转换成内存中的物理地址。
  • 内存扩充:当系统没有足够的内存时,利用虚拟内存技术或自动覆盖技术,从逻辑上扩充内存。
  • 内存映射:将一个文件直接映射到进程的进程空间中,这样可以通过内存指针用读写内存的办法直接存取文件内容,速度更快。
  • 内存优化:通过调整内存分配策略和回收算法来优化内存使用效率。
  • 内存安全:保证进程之间使用内存互不干扰,避免一些恶意程序通过修改内存来破坏系统的安全性。

什么是内存碎片?

  • 内部内存碎片(Internal Memory Fragmentation,简称为内存碎片):已分配并被进程使用的内存空间,但因为该内存空间的大小超过了进程需要的大小,导致一部分内存空间未被使用,成为内存碎片。
  • 外部内存碎片(External Memory Fragmentation,简称为外部碎片):已被分配但未被使用的内存空间,由于空间是不连续的,所以无法再使用该内存空间。

常见内存管理方式

连续内存管理:即将系统中的内存划分为一个完整的连续地址空间,进程在执行时申请一整块连续的内存来存储程序和数据。

非连续内存管理: 允许一个程序使用的内存分布在离散或者说不相邻的内存中,相对更加灵活一些。

非连续内存管理存在三种方式:

  • 段式管理:将进程的地址空间分成多个逻辑段,例如代码段、数据段和栈段等,根据不同的需求分别进行分配内存空间,并且每个段的大小可以动态变化,更加灵活。
  • 页式管理:把物理内存分为连续等长的物理页,应用程序的虚拟地址空间划也被分为连续等长的虚拟页,现代操作系统广泛使用的一种内存管理方式。
  • 段页式管理机制:结合了段式管理和页式管理的一种内存管理机制,把物理内存先分成若干段,每个段又继续分成若干大小相等的页。

虚拟内存

什么是虚拟内存?

虚拟内存(Virtual Memory) 是计算机系统内存管理非常重要的一个技术,本质上来说它只是逻辑存在的,是一个假想出来的内存空间,主要作用是作为进程访问主存(物理内存)的桥梁并简化内存管理。

在这里插入图片描述

虚拟内存的作用?

总结来说,虚拟内存主要提供了下面这些能力:

  • 隔离进程:物理内存通过虚拟地址空间访问,虚拟地址空间与进程一一对应。每个进程都认为自己拥有了整个物理内存,进程之间彼此隔离,一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。
  • 提升物理内存利用率:有了虚拟地址空间后,操作系统只需要将进程当前正在使用的部分数据或指令加载入物理内存。
  • 简化内存管理:进程都有一个一致且私有的虚拟地址空间,程序员不用和真正的物理内存打交道,而是借助虚拟地址空间访问物理内存,从而简化了内存管理。
  • 多个进程共享物理内存:进程在运行过程中,会加载许多操作系统的动态库。这些库对于每个进程而言都是公用的,它们在内存中实际只会加载一份,这部分称为共享内存。
  • 提高内存使用安全性:控制进程对物理内存的访问,隔离不同进程的访问权限,提高系统的安全性。
  • 提供更大的可使用内存空间:可以让程序拥有超过系统物理内存大小的可用内存空间。这是因为当物理内存不够用时,可以利用磁盘充当,将物理内存页(通常大小为 4 KB)保存到磁盘文件(会影响读写速度),数据或代码页会根据需要在物理内存与磁盘之间移动。

没有虚拟内存的问题

  1. 用户可以访问任意物理内存,可以会不小心操作到系统运行必须的内存,进而造成操作系统崩溃,严重影响了系统的安全。
  2. 同时运行多个程序容易崩溃,同时运行两个程序当给相同的内存地址赋值会造成覆盖,使得另一个程序崩溃。
  3. 程序运行中使用的所有数据或指令都要载入物理地址,根据局部性原理,其中很大一部分可能不会用到,浪费了内存资源。

什么是虚拟地址和物理地址?

物理地址(Physical Address) 是真正的物理内存中地址,更具体点来说是内存地址寄存器中的地址。程序中访问的内存地址不是物理地址,而是 虚拟地址(Virtual Address) 。也就是说,我们编程开发的时候就是在和虚拟地址打交道。

操作系统一般通过 CPU 芯片中的一个重要组件 MMU(Memory Management Unit,内存管理单元) 地址翻译/地址转换(Address Translation)。通过 MMU 将虚拟地址转换为物理地址后,再通过总线传到物理内存设备,进而完成相应的物理内存读写请求

MMU 将虚拟地址翻译为物理地址的主要机制有3种: 分段机制、分页机制和段页机制

现代操作系统广泛采用分页机制,重点关注!

在这里插入图片描述

虚拟地址空间和物理地址空间:

  • 虚拟地址空间是虚拟地址的集合,是虚拟内存的范围。每一个进程都有一个一致且私有的虚拟地址空间。
  • 物理地址空间是物理地址的集合,是物理内存的范围。

分段机制

​ 分段机制是一种计算机内存管理技术,将进程的逻辑地址空间划分为多个逻辑段,每个逻辑段都是一个连续的地址区间,它们分别包含不同类型的数据和代码,例如代码段、数据段和栈段等。

​ 在分段机制中,每个逻辑段都可以根据需要动态调整其大小,从而更好地适应进程的需求。与内存分页机制相比,分段机制更加灵活,能够更好地适应不同的进程需求。

​ 但分段机制也存在一些缺点,例如逻辑地址的转换开销大,需要额外的硬件支持,同时也容易发生外部碎片等问题。

分页机制

分页机制(Paging) 把主存(物理内存)分为连续等长的物理页,应用程序的虚拟地址空间划也被分为连续等长的虚拟页。现代操作系统广泛采用分页机制。

注意:这里的页是连续等长的,不同于分段机制下不同长度的段。

在分页机制下,应用程序虚拟地址空间中的任意虚拟页可以被映射到物理内存中的任意物理页上,因此可以实现物理内存资源的离散分配。分页机制按照固定页大小分配物理内存,使得物理内存资源易于管理,可有效避免分段机制中外部内存碎片的问题。

在这里插入图片描述

在分页机制下,每个应用程序都会有一个对应的页表。

分页机制下的虚拟地址由两部分组成:

  • 页号:通过虚拟页号可以从页表中取出对应的物理页号;
  • 页内偏移量:物理页起始地址+页内偏移量=物理内存地址。

具体的地址翻译过程如下:

  1. MMU 首先解析得到虚拟地址中的虚拟页号;
  2. 通过虚拟页号去该应用程序的页表中取出对应的物理页号(找到对应的页表项);
  3. 用该物理页号对应的物理页起始地址(物理地址)加上虚拟地址中的页内偏移量得到最终的物理地址。

在这里插入图片描述

页表中还存有诸如访问标志(标识该页面有没有被访问过)、页类型(该段的类型,例如代码段、数据段等)等信息。

通过虚拟页号一定要找到对应的物理页号吗?找到了物理页号得到最终的物理地址后对应的物理页一定存在吗?

不一定,可能会存在页缺失,为了解决这个问题,操作系统引入了 多级页表。多级页表属于时间换空间的典型场景,利用增加页表查询的次数减少页表占用的空间。

在这里插入图片描述

转址旁路缓存(TLB、快表)

为了提高虚拟地址到物理地址的转换速度,操作系统在 页表方案 基础之上引入了 转址旁路缓存(Translation Lookasjde Buffer,TLB,也被称为快表)

在这里插入图片描述

TLB属于内部的单元,本质上就是一块高速缓存,缓存了虚拟页号到物理页号的映射关系,可以将其简单看作是存储着键(虚拟页号)值(物理页号)对的哈希表。

使用 TLB 之后的地址翻译流程是这样的:

  1. 用虚拟地址中的虚拟页号作为 key 去 TLB 中查询;
  2. 如果能查到对应的物理页的话,就不用再查询页表了,这种情况称为 TLB 命中(TLB hit)。
  3. 如果不能查到对应的物理页的话,还是需要去查询主存中的页表,同时将页表中的该映射表项添加到 TLB 中,这种情况称为 TLB 未命中(TLB miss)。
  4. 当 TLB 填满后,又要登记新页时,就按照一定的淘汰策略淘汰掉快表中的一个页。

在这里插入图片描述

由于页表也在主存中,因此在没有 TLB 之前,每次读写内存数据时 CPU 要访问两次主存。有了 TLB 之后,对于存在于 TLB 中的页表数据只需要访问一次主存即可。

TLB 的设计思想非常简单,但命中率往往非常高,效果很好。这就是因为被频繁访问的页就是其中的很小一部分。

换页机制作用?

换页机制的思想是当物理内存不够用的时候,操作系统选择将一些物理页的内容放到磁盘上去,等要用到的时候再将它们读取到物理内存中。也就是说,换页机制利用磁盘这种较低廉的存储设备扩展的物理内存。

这也就解释了一个日常使用电脑常见的问题:为什么操作系统中所有进程运行所需的物理内存即使比真实的物理内存要大一些,这些进程也是可以正常运行的,只是运行速度会变慢。

这同样是一种时间换空间的策略,你用 CPU 的计算时间,页的调入调出花费的时间,换来了一个虚拟的更大的物理内存空间来支持程序的运行。

什么是页缺失?

页缺失(Page Fault,又名硬错误、硬中断、分页错误、寻页缺失、缺页中断、页故障等)指的是当软件试图访问已映射在虚拟地址空间中,但是目前并未被加载在物理内存中的一个分页时,由 MMU 所发出的中断.

常见的页缺失有下面两种:

  • 硬性页缺失(Hard Page Fault):物理内存中没有对应的物理页。于是,Page Fault Handler 会指示 CPU 从已经打开的磁盘文件中读取相应的内容到物理内存,而后交由 MMU 建立相应的虚拟页和物理页的映射关系。
  • 软性页缺失(Soft Page Fault):物理内存中有对应的物理页,但虚拟页还未和物理页建立映射。于是,Page Fault Handler 会指示 MMU 建立相应的虚拟页和物理页的映射关系。

发生上面这两种缺页错误的时候,应用程序访问的是有效的物理内存,只是出现了物理页缺失或者虚拟页和物理页的映射关系未建立的问题。如果应用程序访问的是无效的物理内存的话,还会出现 无效缺页错误(Invalid Page Fault)

常见的页面置换算法

常见的页面置换算法有:先进先出页面置换算法、最佳页面置换算法、时钟页面置换算法、最少使用页面置换算法、最近最久未使用页面置换算法。

  1. 最佳页面置换算法(OPT,Optimal):优先选择淘汰的页面是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们目前无法预知进程在内存下的若干页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现,只是理论最优的页面置换算法,可以作为衡量其他置换算法优劣的标准。
  2. 先进先出页面置换算法(FIFO,First In First Out) : 最简单的一种页面置换算法,总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。该算法易于实现和理解,一般只需要通过一个 FIFO 队列即可需求。不过,它的性能并不是很好。
  3. 最近最久未使用页面置换算法(LRU ,Least Recently Used):LRU 算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰。LRU 算法是根据各页之前的访问情况来实现,因此是易于实现的。OPT 算法是根据各页未来的访问情况来实现,因此是不可实现的。
  4. 最少使用页面置换算法(LFU,Least Frequently Used) : 和 LRU 算法比较像,不过该置换算法选择的是之前一段时间内使用最少的页面作为淘汰页。
  5. 时钟页面置换算法(Clock):可以认为是一种最近未使用算法,即逐出的页面都是最近没有使用的那个。

分页机制和分段机制的共同点和不同点

共同点:

  • 都是非连续内存管理的方式。
  • 都采用了地址映射的方法,将虚拟地址映射到物理地址,以实现对内存的管理和保护。

不同点:

  • 分页机制以页面为单位进行内存管理,而分段机制以段为单位进行内存管理
  • 也是物理单位,即操作系统将物理内存划分为固定大小的页面。而段则是逻辑单位,是为了满足程序对内存空间的逻辑需求而设计的。
  • 分段机制容易出现外部内存碎片。分页机制解决了外部内存碎片的问题,但仍然可能会出现内部内存碎片
  • 分页机制采用了页表来完成虚拟地址到物理地址的映射。而分段机制采用了段表来完成虚拟地址到物理地址的映射。
  • 分页机制对程序没有任何要求。二分段机制需要程序员将程序分为多个段,并且显式的使用段寄存器来访问不同的段。

段页机制

结合了段式管理和页式管理的一种内存管理机制,把物理内存先分成若干段,每个段又继续分成若干大小相等的页。

在段页式机制下,地址翻译的过程分为两个步骤:

  1. 段式地址映射。
  2. 页式地址映射。

局部性原理

局部性原理是指在程序执行过程中,数据和指令的访问存在一定的空间和时间上的局部性特点。其中,时间局部性是指一个数据项或指令在一段时间内被反复使用的特点,空间局部性是指一个数据项或指令在一段时间内与其相邻的数据项或指令被反复使用的特点。

在分页机制中,页表的作用是将虚拟地址转换为物理地址,从而完成内存访问。在这个过程中,局部性原理的作用体现在两个方面:

  • 时间局部性:由于程序中存在一定的循环或者重复操作,因此会反复访问同一个页或一些特定的页,这就体现了时间局部性的特点。为了利用时间局部性,分页机制中通常采用缓存机制来提高页面的命中率,即将最近访问过的一些页放入缓存中,如果下一次访问的页已经在缓存中,就不需要再次访问内存,而是直接从缓存中读取。
  • 空间局部性:由于程序中数据和指令的访问通常是具有一定的空间连续性的,因此当访问某个页时,往往会顺带访问其相邻的一些页。为了利用空间局部性,分页机制中通常采用预取技术来预先将相邻的一些页读入内存缓存中,以便在未来访问时能够直接使用,从而提高访问速度。

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

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

相关文章

MySQL唯一约束失效深度剖析

详细情况: 业务反馈:“用int查出来有两条数据,char类型查出来只有一条数据 ,这几个字段还是uk的 ”(版本MySQL 5.7.25) 表结构如下: CREATE TABLE test_table (id bigint(20) NOT NULL AUTO_IN…

构建方便残障人士使用的网站 web enhance the accessibility

文章目录 前言检测网站是否符合残障人士使用window版软件edge浏览器插件版 前端开发为残障人士的通用标准img标签a标签字体与颜色显示或隐藏的元素可交互的元素标记元素类别 总结 前言 网站的构建往往会忽略一群特殊的人群,在某些方便存在障碍的网民,比…

Docker镜像管理

Docker 概述 Docker是什么 Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移…

基于状态的维护(CBM)如何推动设备效率提高?

基于状态的维护(Condition-Based Maintenance,CBM)是一种先进的维护策略,通过实时监测和分析设备的状态数据,预测设备故障并采取相应的维护措施。CBM基于数据驱动的方法,能够提高设备的可用性、降低维修成本…

PDF怎么转成PPT文件免费?分享几个方法!

PDF文件和PPT文件是常见的两类文件,广泛应用于打工人和学生党之间。每种文件格式都有自己的优势,在不同的情况下使用。PDF格式具有出色的浏览效果,能有效保护文档内容免受随意篡改,而且在传输过程中不会出现乱码问题。然而&#x…

Apifox 发请求时如何自动获取Cookie 和 token

介绍 用户登录到网站或 App 是非常常见的的场景,登录成功后一般会返回登录凭证(一般为 Cookie 或者 token),后续其它接口发起请求时会携带 Cookie 或者 token 到服务器进行校验。校验通过,则返回相关的数据&#xff0…

【Linux网络编程】应用层HTTP协议篇

应用层 一、应用层1.1、再谈协议1.2、HTTP协议1.2.1、认识URL1.2.2、urlencode和urldecode1.2.3、HTTP协议格式1.2.4、HTTP的方法1.2.5、HTTP的状态码1.2.6、HTTP常见的Header 二、结合代码理解HTTP通信流程 一、应用层 程序员写的一个个解决我们实际问题, 满足我们日常需求的…

Stable Diffusion原理说明

本文参考:深入浅出讲解Stable Diffusion原理,新手也能看明白 - 知乎 目录 1、Stable Diffusion能做什么? 2、扩散模型(Diffusion model) (1)前向扩散(Forward Diffusion&#xff…

Simple-BEV:多传感器BEV感知中真正重要的是什么?

文章:Simple-BEV: What Really Matters for Multi-Sensor BEV Perception? 作者:Adam W. Harley , Zhaoyuan Fang,Jie Li,Rares Ambrus , Katerina Fragkiadaki 编辑:点云PCL 代码:…

华为OD机试之查找接口成功率最优时间段(Java源码)

查找接口成功率最优时间段 题目描述 服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,数组中每个元素都是单位时间内失败率数值,数组中的数值为0~100的整数,给定一个数值(minAverag…

【Web服务应用】Apache配置与应用

Apache配置与应用 一、构建虚拟Web主机1.1httpd服务支持的虚拟主机类型包括以下三种 二、基于域名的虚拟主机三、基于IP地址的虚拟主机四、基于端口的虚拟机五、Apache连接保持六、构建Web虚拟目录与用户授权限制七、日志分割 一、构建虚拟Web主机 虚拟Web主机指的是在同一台服…

手把手教你部署FreeYOLO

作者:Kissrabbit 原文链接: https://zhuanlan.zhihu.com/p/578830729 本章将讲解如何将torch训练好的权重文件转换为ONNX文件,并如何部署回到OpenVINO、TensorRT等框架下。笔者将以自己的FreeYOLO项目为例,来完成本章的内容讲解,相关代码如下…

企业数字化转型转什么?怎么转?这份攻略请收好...

数字化转型,转什么?怎么转?这些问题仍在困扰不少企业,也是每个企业转型升级不得不思考的重要问题。 对此,中关村数字经济产业联盟、元年研究院、《管理会计研究》联合发布了《成就数据驱动型企业 中国企业数字化转型白…

ROS订阅与发布话题

目录 一、新建一个ROS工作空间并创建功能包 二、创建一个msg消息 三、发布话题 四、订阅话题 前言 Ubuntu18.04 ROS Melodic 一、新建一个ROS工作空间并创建功能包 mkdir -p catkin_ws/src cd ~/catkin_ws/src/ catkin_init_workspace cd ~/catkin_ws/ catkin_make echo &…

USB接口的演变与升级

USB接口是计算机与外部设备之间传输数据的重要接口之一,它的演变和升级经历了多年的发展。本文将详细介绍USB接口的发展历程、应用领域、标准化进程以及未来趋势。 USB接口最早出现在1994年,当时是由英特尔公司、微软公司和惠普公司共同开发的。这个接口…

React中useEffect的源码解读

对源码的解读有利于搞清楚Hooks到底做了什么,如果您觉得useEffect很“魔法”,这篇文章也许对您有些帮助。 本篇博客篇幅有限,只看useEffect,力求简单明了,带您到React Hooks的深处看看 按图索骥找到Hook相关源码&…

JavaWeb之Servlet

1、什么是JavaWeb? Servlet 是 JavaEE 规范之一。规范就是接口 Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。 Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的…

Python plt; ax 设置tick

Python中绘图可以基于plt;也可基于ax 在 Matplotlib 中,Axes 对象(常简写为 ax)是在图(Figure)中进行大部分的绘图操作的地方。一个 Axes 对象代表了一个具体的绘图区域。 利用 plt 绘图 简单的图像测试…

继续探索Roop(单张图视频换脸)的各方面:比如喜闻乐见的“加速”

文章目录 (一)Roop项目的特点(二)Roop也能加速***(三)Roop更新和依赖(3.1)飞速更新(3.2)依赖问题(3.3)需要CUDA么 前两天写了&#x1…

如何修复vcruntime140.dll文件?多种解决vcruntime140.dll的方法分享

在使用Windows操作系统时,经常会遇到一些错误提示,比如缺少vcruntime140.dll文件。这个文件是Visual C Redistributable Package的一部分,它负责运行C程序。如果你在运行某些软件或游戏时收到了“缺少vcruntime140.dll文件”的错误提示&#…