【操作系统】内存的非连续分配管理

文章目录

  • 前言
  • 非连续分配管理
    • 基本分页存储管理方式
      • 基本地址变换机构
      • 具有快表的地址变换机构
      • 两级页表
    • 基本分段存储管理方式
    • 段页式管理方式

前言

在了解完内存的连续分配管理的三种方式后,可以看到它们之所以称之为连续分配是因为都有一个共同特点:每个进程所分配的内存都是一个连续分区(一个分区内部)。那么会导致什么问题呢?

由于每个进程的内存空间都是连续分配,而进程所需要的内存空间并不会完全与分配的内存分区大小一致,也就导致了内存的“碎片化”。对于固定分区分配而言,“碎片”来自于每个进程的分区内部;对于动态分区分配而言,每次都要从用户区寻找一块符合条件的分区,导致整个用户区在进程的各个内存分区之间夹杂很多“外部碎片”。

而“碎片化”直接将会导致内存的利用率降低。

非连续分配管理

所谓的非连续分配,即一个用户进程所分配的内存分区不是连续的,由多个分区组成。

非连续分配管理的方式有三种:

  • 基本分页存储管理方式(其实本质还是固定分区);
  • 基本分段存储管理方式;
  • 段页式管理方式;

基本分页存储管理方式

基本分页存储方式,将内存分为了大小相等的分区(这个分区是明显小于连续分配的固定分配方式的)。每个分区可以称为页/页框,通常1页的大小为4K,页号从0开始,操作系统在分配内存时将会以页为基本单位进行内存的分配。

由于进程所需的内存大小不一定刚好就是4K的倍数,因此还是会产生一定的“碎片”,称之为“页内碎片”。
在这里插入图片描述

内存地址在物理上进行了分页,且进程分配的内存是不连续的,为了便于对进程的内存进行管理,我们需要对物理地址进行转换。操作系统通过页表记录了进程的逻辑地址空间与物理地址空间的映射关系。每个进程的PCB中都会存放页表的内容。
在这里插入图片描述
按照这个逻辑,假如要对逻辑地址1024空间的值加1,处理流程是怎样的?

首先,在页表中找到逻辑地址1024,查看对应的物理地址后,将实际保存在物理地址空间的值取出来,CPU计算完成后,再通过逻辑地址1024找到物理地址,并将计算完成的值存放

在逻辑地址与物理地址的转换过程中,操作系统使用的方式称为基本地址变换机构

基本地址变换机构

针对上面的地址转换过程,我们来详细看看。

首先,物理地址的计算表达式可以用如下方法表示:

物理地址=(页号–>块号)+偏移量

其中:

页号P = 逻辑地址A / 页面长度L
偏移量W = 逻辑地址A % 页面长度L

也就是说对逻辑地址1024空间的值加1过程如下:

  • 计算页号:1024 / 4K = 0(注意,这里的4K是1024比特)
  • 计算偏移量:1024 % 4K = 1024

因此先找到页号0对应的块号1,然后在块号1对应的物理地址空间页框1中偏移量1024处取值计算即可。

由于计算机通过2进制进行运算,因此在计算页号P和偏移量W的时候,可以将表达式写为:

P = A >> 12; (4K是2的12次方,除法相当于二进制的右移操作)
W = A & 4095;(取模相当于二进制的与操作)

在这里插入图片描述
流程图如下:
在这里插入图片描述
上面的过程是否存在问题呢?

当我们需要将逻辑地址1024的值加一的过程中,首先CPU要先计算出页号(访问一次内存),然后再根据页号去找到内存的物理地址(第二次访问内存),最后计算完成,将值更新(第三次访问内存)。可以看到,在计算之前就访问了两次内存,由于通常页表较大,这样无疑会降低系统的效率。

为了优化上面的问题,提出了快表的概念。

具有快表的地址变换机构

在这里插入图片描述
快表结构存放在计算机的高速缓存中,读写效率明显高于内存,但是高速缓存的空间更小。

快表的存储信息与页表一致(页号与块号),不过在数据结构上是不同的。之所以数据结构不同是因为内存中存放完整页表(现在称为慢表),页号是连续的且与块号一一对应,因此页号和块号可以保存至同一结构中从而形成一个一维数组结构。但是快表并不存放完整的页表内容,CPU在读取物理地址空间前会优先访问快表,如果快表中存在计算出的页号则可以直接获取到对应的块号。但是假如快表中不存在当前页号,CPU还是要去内存中访问慢表进行全表的查询。在进行慢表查询后把当前结果保存一份到快表中,这也就导致了快表中存放的页表信息不是连续的,因此页号与块号是一个二维结构。

快表结构的引入之所以提高效率,一是因为高速缓存的读写效率更高;二是我们的程序中通常会存在大量的循环操作(称为局部性原理),所以遍历第二遍开始,由于快表中已经添加了需要访问的页表信息,结合第一点,使得操作系统的运行效率得到了提升。

以上的设计有一个明显的缺点:整个页表大概有4M,每次都要全部放入内存,且由于页表是一维数组,这部分内存必须是连续空间,导致了大量连续空间被占用。

在这里插入图片描述

两级页表

针对上面提出的问题,可以每次不完全生成整个页表,类似于动态装入,每次需要的时候再生成部分页表,称之为:分页离散存储,这就需要建立页目录表管理离散页表。如下图,再页表完全形成的状态下,将之前的页表分成了1024份(二级页表),每份1024哥页号。上图在经过此方法优化后,图下图所示:

在这里插入图片描述
之所以二级页表每个表具有1024个页号,是因为这样每个二级页表刚好是4K大小,刚好是一个页框的大小。

在采用了二级页表的设计后,一级页表总共1024个页号(相当于索引),二级页表可以分散在1024个页框中(是动态装入的),性能进一步得到了优化。

此时,逻辑地址(在PCB中)可以如下表示:

在这里插入图片描述
根据逻辑地址得到物理地址过程:

  • 从PCB中读取页目录表始址;
  • 根据一级页号查出二级页表的位置;
  • 根据二级页号查询出内存块号,再加上偏移量得到物理地址;

基本分段存储管理方式

分页存储管理的方式对于操作系统而言还是很方便了,但是对于人却不是。一个程序从功能上是可以拆分成多个模块(高级程序语言一般都通过编译器向开发人员屏蔽了这部分过程)的,因此在逻辑上假如可以将不同模块方便的在内存中进行管理,将会有效减轻程序开发的难度。

基本分段存储管理方式将进程从逻辑上进行了分段,将这些分段信息存储在段表中,段表中就包括了内存的逻辑地址,这些逻辑地址在地址变换机构的映射下得到内存的物理地址。示意图如下:

在这里插入图片描述
分段存储管理方式可以方便的实现段的共享与保护(颗粒度大,实现简单)。

段页式管理方式

首先对比下前面两种方式:
在这里插入图片描述
在结合分页与分段管理后,提出了段页式管理方式。其总结如下:

  • 先分段,再分页;
  • 一个进程对应一个段表;
  • 一个段表项对应一个页表;
  • 一个页表对应多个物理块;

如下图:
在这里插入图片描述
举例说明上图:

  • 以0号段为例,通过进程的段页表查询0号段,由于0号段总共7K,需要两页存储,因此页表长度为2;
  • 0号段在段页表中对应的页表存放块号为1(需要注意,段页表的块号对应的块中存放的是一个页表);
  • 找到1号块,因为段页表中页表长度为2,因此1号块中存放的页表总共两项数据:页号0与页号1;
  • 然后根据逻辑地址中的页号和页内地址查询物理地址即可(参考下方段页式的地址格式);

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式-适配器-笔记

适配器模式Adapter 动机(Motivation) 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是在这些现存对象所不满足的。 如何应对这种“迁移的变化”&#xff1…

QNX Typed memory介绍

文章目录 前言一、什么是 Typed memory二、查看系统已有Typed memory 的方法三、Typed memory 的使用方法1.定义一个packet memory并从系统内存中分出它1.1 as_add()1.2 as_add_containing()2. 从 Typed memory 中申请内存2.1 POSIX method 申请内存2.2 QNX Neutrino method 申…

redis设置密码

首先到redis的下载目录下:运行 redis-cli 查看redis密码: config get requirepass 设置redis密码为123456: config set requirepass 123456

GDS 命令的使用 srvctl service TAF application continuity

文档中prim and stdy在同一台机器上,不同机器需要添加address list TAF ENABLED GLOBAL SERVICE in GDS ENVIRONMNET 12C. (Doc ID 2283193.1)​编辑To Bottom In this Document Goal Solution APPLIES TO: Oracle Database - Enterprise Edition - Version 12.1.…

Windows系统中搭建docker (ubuntu,Docker-desktop)

一、docker安装前的准备工作 1. 开启CPU虚拟化,新电脑该默认是开启的,如果没开启可以根据自己电脑型号品牌搜索如克开启CPU虚拟化。当开启成功后可在设备管理器中看到。 2.开通Hyper-V 通过 Windows 控制面板 --> 程序和功能 -->启用或关闭…

系列五、JVM的内存结构【PC寄存器】

一、位置 CPU中 二、作用 每个线程都有一个程序计数器,是线程私有的,所谓PC寄存器其实就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,也即将要执行的指令代码),由执行引…

基于PHP的纺织用品商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的纺织用品商城系统 一 介绍 此纺织用品商城系统基于原生PHP开发,数据库mysql,前端bootstrap。用户可注册登录,购物下单,评论等。管理员登录后台可对纺织用品,用户&#xf…

一文浅入Springboot+mybatis-plus+actuator+Prometheus+Grafana+Swagger2.9.2开发运维一体化

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTFUL风格的Web服务,是非常流行的API表达工具。 Swagger能够自动生成完善的 RESTFUL AP文档,,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。 Prometheus 是一个开源的服务监控系统和时…

​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​

软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】 课本里章节里所有蓝色字体的思维导图

锂离子电池充电管理芯片应用

基本概述 TP4054是一个完善的单片锂离子电池恒流/恒压线性电源管理芯片。 更值得一提的是,TP4054专门设计适用于USB的供电规格。得益于内部的MOSFET结构,在应用上不需要外部电阻和阻塞二极管。在高能量运行和高外围温度时,热反馈可以控制充…

uniapp Android如何授权打开系统蓝牙Bluetooth?

uniapp Android如何授权打开系统蓝牙? 使用uniapp开发蓝牙项目过程中,涉及到检测手机系统蓝牙是否打开功能,这里介绍Android,iOS暂时没有找到优方法。朋友们如果有好的方案,欢迎评论分享~ 文章目录 uniapp Android如何…

SDL音视频渲染

01-SDL简介 官网:https://www.libsdl.org/ 文档:http://wiki.libsdl.org/Introduction SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函…

ESP32 Arduino实战基础篇-使用 ADC 读取模拟值

本文介绍如何使用 Arduino IDE 读取 ESP32 的模拟输入。模拟读数对于读取电位计或模拟传感器等可变电阻器的值非常有用。 使用 ESP32 读取模拟输入就像使用模拟读取(GPIO)函数,它接受您想要读取的 GPIO 作为参数。 模拟输入 (ADC) 使用 ESP32 读取模拟值意味着您可以测量 0 …

Anaconda的安装使用及pycharm设置conda虚拟环境

1.python和包以及anaconda的概念关系 python “工人” 包 “工具” 环境 “工具箱” anaconda “放很多工具箱的大箱子” python等于工人这个好理解,就是编程需要用python来实现对应功能,即工人完成某项工程。 包等于工具,就是工人…

使用VC++实现分段线性变换,直方图均衡化、锐化处理(使用拉普拉斯算子)

图像锐化1 实验要求 5.1实验目的、要求 实验目的: (1)掌握图像增强的原理与相关方法。 (2)能使用VC实现图像增强的一些相关功能。 实验要求: A部分: (1)对一幅256级灰度…

【vue2】前端如何播放rtsp 视频流,拿到rtsp视频流地址如何处理,海康视频rtsp h264 如何播放

文章目录 测试以vue2 为例新建 webrtcstreamer.js下载webrtc-streamervideo.vue页面中调用 最近在写vue2 项目其中有个需求是实时播放摄像头的视频,摄像头是 海康的设备,搞了很长时间终于监控视频出来了,记录一下,放置下次遇到。…

2023年首届天府杯数学建模国际大赛问题A思路详解与参考代码:大地测量数据中异常现象的特征和识别

地球变形观测是固体潮汐曲线分析和地震前体研究的重要手段,也是地球观测技术的重要组成部分。基于各种精密科学仪器的变形观测点主要集中在洞穴、地下井等易的自然灾害(雷暴、强降雨、降雪等),人工维护、人工爆破等外部条件&#…

类似于推箱子的小游戏 寻找 最短路径

实现效果如下 类似 推箱子小游戏 的变种 C/C版本 BFS最短路径 黑色代表墙壁 不能越过 蓝色代表HOME点 灰色代表要找的小箱子 绿色代表路径 最终目标是将灰色的小箱子移动到蓝色的HOME点 需要两次搜索 第一次是 出发点到灰色小箱子 第二次是灰色小箱子到蓝色HOME点 BF…

IntelliJ IDE 插件开发 |(一)快速入门

前言 IntelliJ IDEA 作为 Java 开发的首选 IDE,其强大、方便之处不必多说。不过,由于个人或者团队的个性化需求,我们或多或少会想对其功能进行拓展,这时就需要开发插件(在 IntelliJ 平台下的所有 IDE 均可运行&#x…

QtCreator13源码windows编译

1.下载QtCreator13源码: https://download.qt.io/snapshots/qtcreator/13.0/13.0.0-beta1/installer_source/latest/qt-creator-opensource-src-13.0.0-beta1.zip 2.下载并安装llvm Release LLVM 17.0.5 llvm/llvm-project GitHub 3.系统 要求: Windows 10 (64…