操作系统:内存管理策略

外部碎片

当应用程序启动时,由操作系统负责给该应用程序分配其内存空间,假设此时启动了三个应用程序,操作系统分别给其分配了100m,10m和50m的内存,内存情况如下图

此时如果程序B下线,程序A和程序C之间便会空出10m内存,此时如果没有10m以下的应用启动来填充这部分内存,那么这部分内存资源便会被浪费。

 

这便是内存的外部碎片问题,为了解决内存的外部碎片问题,操作系统使用页式内存管理方式,尽可能减少外部碎片的大小(无法完全清除),通过将内存分为大小一致的内存页,将一个应用程序拆开,存储在不同页中,当下电脑64位和32位就是根据分页大小不同定义的(分别时8k和4k)。

页式存储

操作系统将内存分配8k或4k大小的内存页,我们这里称其位物理内存页,当一个应用程序启动时,操作系统将不会在刻意的给其分配连续的内存空间,而是随机分配给应用程序不一定是连续的内存页。

通过这样操作,外部碎片的问题是解决了,不过散落在内存各处的应用程序碎片,cpu执行时该如何寻找呢?操作系统提供了页表结构。

首先,应用程序内部使用一种虚拟地址。虚拟地址是连续的,其中高位表示当前物理内存页的页号,而低位则表示当前物理内存也中,当前地址距离当前物理内存页的物理页框号(物理内存页的第一行的真实物理地址)的偏移量。而页表内部则是记录页号和物理页框号的位置。

当cpu执行当前应用程序的机器码时,首先它会根据连续的虚拟地址去页表中查找真实的物理内存页,再通过低位去找到物理内存页的对应偏移量的真实物理地址。

 通过这种方式,将应用程序所需内存拆分为8k大小,分配给内存中8k大小的页,然后通过页表记录虚拟地址和真实物理地址之见的映射关系,可以很好的解决外部碎片问题,外部碎片最大不会超过8k。不过内存可以分为大量8k大小的物理内存页,通过页表记录这些大量的内存页,也需要大量的内存控制,这些内存空间也注定会超过8k,所以即使是页表,也需要进行分页,这就是多级页表。

多级页表将页表拆分为多个8k大小,分配8k物理内存页,在由另一个页表记录当前页表的虚拟地址和真实物理地址的关系,通过一个操作系统,需要三四级页表,才能记录全部页表信息。

动态内存分配及页表生成

操作系统会分配给一个应用程序固定的内存大小,即使是页式内存管理下也不例外。但一个应用程序通常不会完全使用操作系统分配的内存,当操作系统为应用程序没有使用的内存分配物理内存页时,便会造成内存浪费。

为了解决这个问题,操作系统采用不给应用程序未使用的空间分配物理内存页,甚至页表的初始状态只有第一级的页表,页表内部也只有虚拟地址没有与其映射的页框地址,以及程序的第一行物理地址等,其余大部分页表信息都是在访问程序时才对页表进行填充。

当cpu需要执行应用程序的机器码时,需要通过页表查询真实物理地址,第一次访问时页表并没有记录相关信息,此时会触发页面错误。操作系统在捕捉到这个错误后,会跳转到应用程序的内核态,获取对应的页框填充页表信息,也就是说只有当页面虚拟地址被访问时,其页表中的虚拟地址映射的页框才会被填充。

其中空闲区域的虚拟地址也会在页表中体现,不过多级页表中,记录虚拟地址的页表也是动态生成的,所以连续的空闲区域的虚拟地址实际上并不会访问,也就不会生成对应页表,对应页表的内存资源也会被节省。

TLB缓存

一个应用程序所占使用的物理地址极多,每次执行对应地址的机器码,都需要区页表中查找,页表保存在内存中,虽然内存的访问速度较快,不过在执行程序过程中,需要大量的访问页表,内存的访问速度也无法保证程序的快速运行,所以我们需要一个IO速度更快的存储单位。

TLB缓存是CPU上的硬件单元,TLB缓存的IO速度极快,是内存的几十倍到一百倍,访问速度接进于寄存器,不过其存储空间仍然有限,不足以存下整个页表,所以他只能存储部分页表,当CPU访问页表时,会首先访问TLB缓存,如果存在虚拟地址和页框的对应关系,则直接使用,如果没有则取访问页表,并将本次访问的虚拟地址和页框关系记录在TLB中,替换掉旧的记录。

所以我们在日常写代码应该尽量连续访问连续内存数据,这样可以尽量使两个机器码在同一物理内存页中,提高TLB的命中率,进而提高程序性能。

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

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

相关文章

【css】伪元素实现图片个悬停文字聚焦效果

实现重点: 文字覆盖在图片上: 通过使用 position: absolute 将 .box 文字盒子定位在图片上方。父容器 .img-wrap 使用了 position: relative 确保子元素的绝对定位在父容器的边界内生效。 创建悬停效果: 通过使用 &::before 和 &::…

国富基金入股的关联性与奇瑞依赖症,大昌科技业务独立性引关注

《港湾商业观察》廖紫雯 日前,安徽大昌科技有限公司(以下简称:大昌科技)更新招股书并完成三轮问询,公司冲刺深交所创业板得到进一步进展。此前,2023年6月,大昌科技IPO获深交所受理,…

【微信小程序】自定义组件 - 数据、方法和属性

1. data 数据 2. methods 方法 在小程序组件中,事件处理函数和自定义方法需要定义到 methods 节点中,示例代码如下: 3. properties 属性 在小程序组件中,properties 是组件的对外属性,用来接收外界传递到组件中的数…

杰发科技AC7840——CAN通信简介(8)_通过波特率和时钟计算SEG_1/SEG_2/SJW/PRESC

通过公式计算 * 波特率和采样点计算公式:* tSeg1 (S_SEG_1 2); tSeg2 (S_SEG_2 1).* BandRate (SCR_CLK / (S_PRESC 1) / ((S_SEG_1 2) (S_SEG_2 1))), SCR_CLK 为CAN 模块源时钟* SamplePoint (tSeg1 / (tSeg1 tSeg2)). {0x0D, 0x04, 0x04, 0x3B},…

数据结构——链式队列和循环队列

目录 引言 队列的定义 队列的分类 1.单链表实现 2.数组实现 队列的功能 队列的声明 1.链式队列 2.循环队列 队列的功能实现 1.队列初始化 (1)链式队列 (2)循环队列 (3)复杂度分析 2.判断队列是否为空 (1)链式队列 (2)循环队列 (3)复杂度分析 3.判断队列是否…

26.删除有序数组中的重复项---力扣

题目链接: . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/remove-duplicates-from-sorted-array/descript…

仿Muduo库实现高并发服务器——Server.hpp框架的简单描述

EventLoop模块在本项目中的简单使用: 下面这张图 是channel模块,poller模块,TimerWheel模块,EventLoop模块,LoopThreadPool模块进行组合。便于大家对这个项目的理解,因为代码看起来挺复杂的。 下面这个图&…

招募活动投稿展示 | 感受科技温度,从一个 LLM 应用开始

活动介绍 谷歌开发者招募活动是专为 Google 技术的爱好者及开发者们开展的活动,旨在鼓励大家通过多种形式 (文章/视频/coding 等) 创作与 Google 技术相关的讲解分享、实践案例或活动感受等内容,展示代码、框架、平台在真实世界中的生动表现,…

详解Spring Bean的生命周期

详解Bean的生命周期 前言 在我们没有使用Spring框架之前,创建对象一般都是使用new关键字进行创建,当然除了new关键字外,还有 运用反射手段,使用Class类的newInstance方法 或者 Constructor类中的newInstance方法使用clone方法使…

JavaScript语法基础之DOM基础

目录 1. DOM 基础 1.1. DOM 是什么? 1.1.1. DOM 对象 1.1.2. DOM 结构 1.2. 节点类型 1.3. 获取元素 1.3.1. getElementById() 1.3.2. getElementsByTagName() 1.3.3. getElementsByClassName() 1.3.4. getElementsByName() 1.4.如何去操作对象 修改属性…

IP SSL证书的未来趋势:适应不断变化的安全挑战

随着网络攻击手段的不断进化和用户对隐私保护意识的增强,IP SSL证书作为保障网络安全的关键组件之一,也在不断地发展和完善。本文将探讨IP SSL证书的未来趋势,以及如何适应这些不断变化的安全挑战。 当前状况与挑战 网络安全意识提升&#…

ARM 裸机与 Linux 驱动对比及 Linux 内核入门

目录 ARM裸机代码和驱动的区别 Linux系统组成 内核五大功能 设备驱动分类 内核类型 驱动模块 驱动模块示例 Makefile配置 命令 编码辅助工具 内核中的打印函数 printk 函数 修改打印级别 ​编辑 打印级别含义 驱动多文件编译 示例 模块传递参数 命令行传递参数…

python-docx 实现 Word 办公自动化

前言:当我们需要批量生成一些合同文件或者简历等。如果手工处理对于我们来说不仅工作量巨大,而且难免会出现一些问题。这个时候运用python处理word实现自动生成文件可极大的提高工作效率。 python-docx是python的第三方插件,用来处理word文件…

Kubectl命令、初识pod、namespace

文章目录 一、Kubectl简介基础命令1.基本信息命令2.创建和更新资源命令3.删除资源命令4. 查看日志和调试命令5. 端口转发和复制文件命令6. 部署管理命令7. 伸缩命令8. 配置和上下文管理命令9.常用命令 二、Pod简介核心概念pod常见状态调度和初始化阶段容器创建和运行阶段异常状…

Qt网络通信——TCP和UDP

一、TCP通信 TCP通信必须先建立 TCP 连接,通信端分为客户端和服务器端。 Qt 为服务器端提供了 QTcpServer 类用于实现端口监听,QTcpSocket 类则用于服务器和客户端之间建立连接。大致流程如下图所示: 1. 服务器端建立 1.1 监听——listen() …

PPP简介

介绍PPP特性的定义和目的。 定义 PPP(Point-to-Point Protocol)协议是一种点到点链路层协议,主要用于在全双工的同异步链路上进行点到点的数据传输。 目的 PPP协议是在串行线IP协议SLIP(Serial Line Internet Protocol&#x…

代码随想录:动态规划6-10

62、不同路径 题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径…

史上最全的软件工厂考试简答题教程

软件工程考试简答题 1. 有人认为软件开发时,一个错误发现得越晚,为改正它所付出的代价越大。提出你的观点并解释原因? (1)在软件开发的不同阶段进行修改付出的代价是很不相同的,在早期引入变动&#xff0c…

openai whisper使用

whisper使用 介绍 Whisper是一种通用的语音识别模型。它是在大量不同音频数据集上训练的,也是一个多任务模型,可以执行多语言语音识别、语音翻译和语言识别。 GitHub:https://github.com/openai/whisper 论文链接:https://arx…

注册Github账号详细过程

目录 一、准备工作 二、注册步骤 一、准备工作 在注册GitHub账号之前,请确保您已经准备好以下信息: 一个有效的电子邮箱地址:用于接收验证邮件和GitHub的后续通知。 用户名:确保该用户名在GitHub上是唯一的,且符合…