嵌入式基础知识-存储管理

news2024/11/28 4:51:27

上篇介绍了存储器的相关知识,偏重的是硬件结构,本篇介绍存储管理的相关知识,偏重的是软件管理。

1 存储管理概念

操作系统,包括嵌入式系统,通常利用存储管理单元MMU(Memory Management Unit)来提供内存保护机制,实现系统内核与应用程序,应用程序与应用程序之间的隔离。

内存保护包括两个方面:

  • 防止地址越界:对于多个应用程序,每个应用程序都有自己独立的地址空间。
  • 防止操作越界:对于多个应用程序共享的内存区域,每个应用程序都有自己的访问权限。

存储管理的方式,通常可以分为一下几类:

  • 分区存储
  • 页式存储
  • 段式存储

2 分区存储

分区存储又可分为两类:

  • 固定分区存储:分区大小是固定的
  • 可变分区存储:分区大小是可变的

2.1 固定分区存储

固定分区,是指分区的个数、位置、大小一旦确定后,就不再变化了。另外,分区的大小可以是相等的,也可以是不相等的。

对于新任务到来后的内存分配原则,有两种:

  • 多个输入队列:对于每一个用户分区,都有一个相应的输入队列。当一个新任务到来时,就把它加入到对应的队列中,要求这个队列对应的分区,是能够装得下该任务的最小分区。
  • 单个输入队列:所有的用户分区只设置一个输入队列。当一个新任务到来时,就把它加入到对应的队列中,当某个分区空闲时,就从队列中选择合适的任务去占用这个分区,在任务选择时,可以有两种分配方法:
    • 方式一:选择离对首最近的且能够装入这个分区的任务。当选中的是较小的任务时,则会浪费大量内存空间。
    • 方式二:先搜索整个队列,选择能够装入这个分区的最大任务,尽可能减小空间浪费。

对于固定分区:

  • 优点:易于实现,系统开销较小(空闲空间管理、内存分配与回收算法复杂度低)
  • 缺点:内存利用率不高,产生内存碎片;分区总数固定,限制了并发程序的个数

2.2 可变分区存储

可变分区,是指分区不是预先划分的,而实动态创建的,在装入一个程序时,系统根据它的需求和内存空间的使用情况来决定是否分配。

当一个程序开始运行,要求装入内存时,系统就会从空闲区划出一块进行分配;当程序运行完则释放存储区域,变为空闲区。

在具体实现可变分区管理时,需考虑三个方面问题:

  • 内存管理的数据结构:系统会维护一个分区链表,记录每个内存分区的情况(分配状态、起始地址、长度等)
  • 内存的分配算法:当新任务到来时,需决策分配到哪个空闲分区,通常有4种分配法 :
    • 最先匹配法:从链表头,按顺序找到第一个能装入新任务的空闲分区。接着把该空闲分区中按照任务大小分割,剩余的部分仍是一个空闲分区,将任务装入,并更新分区链表
    • 下次匹配法:与最优匹配法类似,区别是每次分配后记录位置,下次再分区时从此位置开始查找,而不是从固定的链表头开始查找
    • 最佳匹配法:将新任务状态与其大小最接近的空闲分区中。这种方法最大的缺点是产生的空闲分区可能很小而无法使用
    • 最坏匹配法:每次都选用最大的分区进行分配,避免出现不可用的极小分区,但较大的空闲分区也不被保留
  • 内存的回收算法:当任务运行结束释放内存时,若有相邻的空闲分区,则需要合并为一个大的空闲分区,并更新分区链表

对于内存的分配算法,可以看下如下实例:某计算机系统内存大小128k,采用可变分区分配方式进行内存分配,当前系统的内存分块情况如下图左图,现有一个作业4要分配9k的内存,这这种分配算法的分区情况如下图右边4个子图所示

可变分区改善了固定分区的一些缺点,但作为分区存储本身,仍有一些无法解决的问题:

  • 当进程运行所需的内存大于系统内存时,则无法将整个进程一起调入内存,从而无法运行该程序

3 页式存储

页式存储,将进程空间分配为一个个页,同时将系统内存也分配为一个个页,例如都是4K的大小。

这样,运行程序时,每次将需要运行的逻辑页状态内存中,运行完再装入下一个要运行的页,这样就解决了空间极大的进程运行的问题。

对于逻辑页,可以用页号和页内地址表示:

  • 页号:与内存中的物理块号并不是对应的,需要通过查询“页表”得到对应的物理块号
  • 业内地址:或称页内偏移量,与内存中的物理偏移地址是一致的

比如上图中,其地址长度32位,页号占用20位,页内地址占用12位,则页面总数为220=1024K=1M个,页面大小为212=4K

对于页表的表示,如下图,左边是进程中的页号,通过查询页表,可以得到右边内存中对应的块号。

通过页表的方式,可以实现从逻辑地址到物理地址的转换。

  • 逻辑地址:页号+业内偏移
  • 物理地址:物理块号+页内偏移地址

两种地址的页内偏移是一样的,所以地址转换,只需要先计算出页号与物理块号的转换关系,即可进行地址转换。

页式存储的地址转换,可看如下实例:

题目:页面大小L为1k字节,页号2对应的内存块号b=8,将逻辑地址A=2500转换为物理地址E

由题目可得如下分析:

  • 页面大小1k,则页内地址占用10位
  • 逻辑地址2500转为16进制为0x09C4,取低10位为业内地址,即0x01C4,页号为0x02
  • 由题目知页号为0x02对应的内存块号为8,对应的16进制为0x08,将其与业内地址组合,可得物理地址为0x0x21C4,十进制即为8644。

或直接使用十进制计算:

  • 页号P=A/L=2500/1024=2,由题目知,其对应的内存块号为8

  • 业内偏移w=A%L=2500%1024=452

  • 则物理地址为:

    E=b*L+w=8*1024+452=8644
    

页式存储的优缺点:

  • 优点:内存利用率高,内存碎片小,分配与管理简单
  • 缺点:增加了系统的开销,可能产生抖动现象

4 段式存储

段式存储与页式存储比较相似,区别是段式存储不是按照固定的大小分割内存,而是根据进程的逻辑功能进行空间画法,这样便于内存共享,只是每段的空间大小不同。

4.1 基本原理

与页式存储类似,段式存储每段的表示,由段号和段内地址组成。

从逻辑地址到物理地址的转换,则是通过段表的查询来实现。

看一个实例,例如,某进程的段表内容如下,当访问段号2,段内地址400的逻辑地址时,进行地址转换则会出现越界异常

段号段长内存起始地址权限状态
01006000只读在内存
1200读写不在内存
23004000读写在内存

因为段号2对应的段长只有300,而段内地址400则超出了范围,地址4400为非法地址

4.2 段页式存储

段页式存储,则是将段式存储和页式存储结合起来使用,对进程空间先分段,再分页。

段页式存储优缺点:

  • 优点:空间浪费小,便于存储共享与存储保护,可以动态链接
  • 缺点:管理的复杂度与开销增大,需要的硬件增加,执行速度下降

5 总结

本篇介绍了存储管理的相关知识,包括存储管理的分类:分区存储、页式存储和段式存储,已经不同存储方式的地址转换方式与优缺点等。

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

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

相关文章

OB数据库基础知识(学习记录)

目录 OB业务场景 公司使用理由: 常见 bootstrap 失败原因 常见OBD 部署 失败原因 Grafana 查看集群资源由各个节点的聚合情况 OB创建租户 表分组的场景 mysqldump到处数据库schema,数据库数据,表数据 数据同步框架 DATAX obdumper…

支付总架构解析

一、支付全局分层 一笔支付以用户为起点,经过众多支付参与者之后,到达央行的清算账户,完成最终的资金清算。那么我们研究支付宏观,可以站在央行清算账户位置,俯视整个支付金字塔,如图1所示: 图…

Java课题笔记~6个重要注解参数含义

1、[掌握]Before 前置通知-方法有 JoinPoint 参数 在目标方法执行之前执行。被注解为前置通知的方法,可以包含一个 JoinPoint 类型参数。 该类型的对象本身就是切入点表达式。通过该参数,可获取切入点表达式、方法签名、目标对象等。 不光前置通知的方…

乍得ECTN(BESC)申请流程

根据TCHAD/CHAD乍得法令,自2013年4月1日起,所有运至乍得的货物都必须申请ECTN(BESC)电子货物跟踪单。如果没有申请,将被视为触犯乍得的条例,并在目的地受到严厉惩罚。ECTN是英语ELECTRONIC CARGO TRACKING NOTE的简称;…

EFLFK——ELK日志分析系统+kafka+filebeat架构

环境准备 node1节点192.168.40.16elasticsearch2c/4Gnode2节点192.168.40.17elasticsearch2c/4GApache节点192.168.40.170logstash/Apache/kibana2c/4Gfilebeat节点192.168.40.20filebeat2c/4G https://blog.csdn.net/m0_57554344/article/details/132059066?spm1001.2014.30…

oracle的管道函数

Oracle管道函数(Pipelined Table Function)oracle管道函数 1、管道函数即是可以返回行集合(可以使嵌套表nested table 或数组 varray)的函数,我们可以像查询物理表一样查询它或者将其赋值给集合变量。 2、管道函数为并行执行,在…

【数据结构与算法】十大经典排序算法-冒泡排序

🌟个人博客:www.hellocode.top 🏰Java知识导航:Java-Navigate 🔥CSDN:HelloCode. 🌴掘金:HelloCode 🌞知乎:HelloCode ⚡如有问题,欢迎指正&#…

VSCode中如何修改代码字体

通过「File」→「Preferences」→「Settings」→「Text Editor」→「Font」→「Font Family」中,修改对应的字体即可。因为比较喜欢 JetBrains Mono,所以设置的字体是这个。 其中Jetbrains Mono字体需要自己在Jetbrains官网下载,然后中文字体…

09. Docker Compose

目录 1、前言 2、安装Docker Compose 2.1、Docker Compose版本 2.2、下载安装 3、初试Docker Compose 3.1、传统方案部署应用 3.2、使用编排部署应用 3.3、其他命令 3.3.1、ps 3.3.2、images 3.3.3、depends_on 3.3.4、scale 4、小结 1、前言 随着应用架构的不段…

Scala按天写入日志文件

如果希望把每天出错的信息写入日志文件,每天新建一个文件。 package test.scala import java.io.{File, FileWriter} import java.text.SimpleDateFormat import java.util.{Calendar, Date} import scala.concurrent.ExecutionContext.Implicits.global import sc…

Linux(CentOS7)系统磁盘分区及挂载

新购买的阿里云服务器,默认硬盘容量肯定不够用,需要额外购买硬盘,购买后需要对硬盘进行分区及挂载操作,下面是硬盘分区及挂载操作步骤: 1、查看未挂载的硬盘(名称为/dev/vdb), 执行命令 fdisk …

SpringBoot运行流程源码分析------阶段二(run方法核心流程)

run方法核心流程 在分析和学习整个run方法之前,我们可以通过以下流程图来看下SpringApplication调用的run方法处理的核心操作包含哪些。 从上面的流程图中可以看出,SpringApplication在run方法中重点做了以下几步操作 获取监听器和参数配置打印banner…

懒人的百宝箱,效率回归,工具库之美「GitHub 热点速览」

懒人的百宝箱,效率回归,工具库之美「GitHub 热点速览」。 刚开源就变成新星的 igl,不仅获得了 2k star,也能提高你开发游戏的效率,摆平一切和图形有关的问题。如果这个没有那么惊艳的话,还有 The-Art-of-L…

CTFshow web93-104关

这周要学习的是php代码审计 根据师兄的作业 来做web入门的93-104关 93关 看代码 进行分析 他的主函数 include("flag.php"); highlight_file(__FILE__); if(isset($_GET[num])){ $num $_GET[num]; if($num4476){ die("no no no!"); …

nuxt脚手架创建项目

在初始化时遇到一个依赖找不到的问题,记录一下,如有遇到同样问题的小伙伴,希望能给你们一点指引。 从安装脚手架开始,首先 一:安装nuxt脚手架 1. C盘全局安装: npm i -g create-nuxt-app 安装后可creat…

云迁移解决方案

云迁移是指将应用程序和数据从一个位置(通常是公司自有的现场(“本地”服务器)迁移到公有云提供商的服务器的过程,但也指在不同的云之间进行迁移的过程。云迁移的主要优势包括降低 IT 成本和提高性能,但也存在安全性、…

EVE-NG MPLS L2VPN LDP lsp

目录 1 拓扑 2 配置步骤 2.1 配置接口IP 和路由协议 2.2 配置MPLS LDP 2.3 配置L2VPN PW(LDP) 2.4 验证L2VPN 1 拓扑 2 配置步骤 2.1 配置接口IP 和路由协议 PE1 interface LoopBack 0ip address 1.1.1.9 32 quitinterface GigabitEthernet1/0ip address 10.1.1.1 25…

Docker-compose应用

Docker-compose Docker-compose 是Dcoker官方推出的Docker容器的一键编排工具,使用Docker-compose可以批量启动容器、停止容器等等。 安装 github地址 https://github.com/docker/compose/tree/v2.20.1 下载地址 https://github.com/docker/compose/releases …

pinctrl_desc函数操作集实现

pinctrl_desc函数操作集实现 文章目录 pinctrl_desc函数操作集实现groups和functionimx_pctrl_opsimx_get_groups_countimx_get_group_nameimx_get_group_pinsimx_pin_dbg_showimx_dt_free_map imx_pmx_opsimx_pmx_setimx_pmx_get_funcs_countimx_pmx_get_func_nameimx_pmx_get…

vue 列表|表格环境中的下拉菜单

elementui组件为vue提供了各式各样的ui组件,但均为各类最为基本的控件,没有提供业务级的使用案例,为此进行扩展补充。 vue-elementui 基本入门使用 一、下拉菜单 下拉菜单与html中的select控件有所差距,select为表单控件的一员页…