2019备考[嵌入式系统设计师]之“存储管理篇”

Wesley13
• 阅读 635

通过分析历年考题发现,在存储管理方面的题目蛮多的,应该是一个重要考点。无论是概念、理论、分析和计算都相当容易出题。这里就先拿这个点说说吧,其他的以后有时间再写了。

1、存储器系统的层次架构

  • 计算机系统的存储器被组织成一个金字塔的层次结构。自上而下为:CPU内部寄存器、芯片内部高速缓存(cache)、芯片外部高速缓存(SRAM、SDRAM、DRAM)、主存储器(NAND FLASH、NOR FLASH、EEPROM)、外部存储器(磁盘、光盘、CF卡、SD卡)和远程二级存储器(分布式文件系统、WEB服务器),6个层次的结构。上述设备从上而下,依次速度更慢、容量更大、访问频率更小,造价更便宜。

2、高速缓存(cache)

  • **工作原理:**主要利用了程序的局部性特点。地址映象是指把主存地址空间映象到cache的地址空间。地址变换是指当程序或数据已经装入到cache后,在实际运行过程中,把主存地址如何编程cache空间的地址。

  • 常用的地址映象和地址变换的方式有:
    直接映象和变换:速度快,造价低,但有局限性,不能充分利用cache的好处。
    组相联地址映象和变换:速度稍慢但是命中率高。
    全相联地址映象和变换:可以任意映射。

  • 常用的cache替换算法:轮转法和随机替换算法。

  • 高速缓存的分类:
    **A.**统一cache和独立的数据/指令cache
    **B.**写通cache和写回cache
    **C.**读操作分配cache和写操作分配cache

3、存储管理单元(MMU)

  • MMU在CPU和物理内存之间进行地址转换,将地址从逻辑空间映射到物理空间,这个过程称为内存映射。MMU主要完成下面的工作:
    **A.**虚拟存储空间到物理空间的映射。
    **B.**存储器访问权限的控制。
    **C.**设置虚拟存储空间的缓冲特性。

  • 嵌入式系统中常常采用页式存储管理。为了管理这些页引入了页表的概念。页表是位于内存中的表,它的每一行对应虚拟存储空间的一个页,该行包含了该虚拟内存页对应的物理内存页的地址、该页的访问权限和该页的缓冲特性等。从虚拟地址到物理地址的变换过程就是查询页表的过程。

  • 由于页表存储在内存中的,整个查询过程需要付出很大的代价。根据程序局部性的特点,增加了一个小容量、高速度的存储部件来存放当前访问需要的地址变换条目,这个存储部件称为:**地址转换后备缓冲器(TLB)**。

  • 当CPU访问内存时,首先在TLB中查找需要的地址变换条目,如果该条目不存在,CPU再从内存中的页表中查询,并把相应的结果添加到TLB中,更新它的内容。

  • 嵌入式系统中虚拟存储空间到物理空间的映射以内存块为单位进行。即虚拟存储空间中一块连续的存储空间被映射到物理存储空间中同样大小的一块连续存储空间。

  • 在页表和TLB中,每一个地址变换条目实际上记录了一个虚拟存储空间的内存块的基地址与物理存储空间相对应的一个内存块的基地址之间的对应关系。

  • 在MMU中实现虚拟地址到物理地址的映射是通过两级页表来实现的。禁止MMU时,所有物理地址和虚拟地址相等,即使用平板存储模式。

4、内存保护

  • 操作系统通常利用MMU来实现操作系统内核与应用程序之间的隔离,以及应用程序与应用程序之间的隔离。
    内存保护包含两个方面的内容:
    A.防止地址越界,每个应用程序都有自己独立的地址空间。
    B.防止越权操作,每个应用程序都有自己的访问权限。

5、实模式与保护模式

  • 在嵌入式系统中,常见的存储管理方案可以分为两大类:实模式保护模式

  • 实模式:内存的平面使用模式。
    特点:
    **A.**不划分“系统空间”与“用户空间”,无须进行地址映射。
    **B.**操作系统与应用程序之间不再有物理的边界。
    **C.**系统中的“任务”或“进程”,实际上全是内核线程。
    内存布局:
    A.代码段:包含操作系统和应用程序的所有代码。
    B.数据段:所有带有初始值的全局变量。
    C.BSS段:所有未带初始值的全局变量。
    D.堆空间:动态分配的内存空间。
    E.栈空间:保存上下文以及函数调用时的局部变量和形参。
    在实模式存储管理方案下,主要的工作在于堆空间的管理,即如何来管理空闲的堆空间、如何来分配内存、如何来回收内存等等。

  • 保护模式:处理器中必须有MMU硬件并启用。
    特点:
    **A.**系统内核和用户程序都有各自独立的地址空间。
    **B.**每个应用程序只能访问自己的地址空间,不能去破坏操作系统和其他应用程序的代码和数据。

6、分区存储管理

为了实现多道程序系统而采用的内存管理。

  • 基本思路:把整个内存划分为两大区域,即系统区和用户区,然后再把用户区划分为若干个分区,每个任务占有其中的一个分区。这样,在内存当中就同时保留多个任务,让他们共享整个用户区,从而实现多个任务的并发运行。
  • 分区存储管理又可以分为两类:固定分区和可变分区。
    固定分区:各个用户分区的个数、位置和大小一旦确定后,就固定不变,不能再修改。
    优点:易于实现,系统开销较小。
    缺点:内存利用率不高,分区总数固定。
    可变分区:动态创建,在装入一个程序时,系统将根据它的需求和内存空间的使用情况来决定是否分配。
    优点:动态变化,非常灵活。
    缺点:可能存在外碎片。
  • 在实现可变存储管理技术的时候,需要考虑三个方面的问题:
    A.内存管理的数据结构
    B.内存的分配算法
    C.内存的回收算法

7、地址映射

  • **地址映射:**地址映射也叫地址重定位。逻辑地址和物理地址是完全不同的,不能用逻辑地址来直接访问内存单元。为了保证CPU在执行指令的时候,可以正确地访问内存单元,需要将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址。
  • 地址映射由存储管理单元MMU来完成。
  • 地址映射主要有两种方式:静态地址映射和动态地址映射。
    静态地址映射:当用户程序被装入内存时,直接对指令代码进行修改,一次性地实现逻辑地址到物理地址的转换。
    动态地址映射:当用户程序被装入内存时,不对指令代码做任何修改,而是在程序的运行过程中,当它需要访问内存单元的时候,再来进行地址转换。
  • 在具体实现时,这项转换工作一般是由硬件的地址映射机制来完成的。通常设置一个基地址寄存器,或者叫重定位寄存器。当一个任务被调度运行时,就把它所在分区的起始地址装入到整个寄存器中。然后,在程序运行的过程中,当需要访问某个内存单元时,硬件就会自动地将其中的逻辑地址加上基地址寄存器中的内容,从而得到实际的物理地址,并且按照这个物理地址区执行。这个基地址寄存器位于MMU的内部,整个地址映射过程是自动运行的。从理论上说,每访问一次内存都要进行一次地址映射。

8、页式存储管理(重点)

  • 基本思路:把物理内存划分为许多固定大小的内存块,称为物理页面;把逻辑地址空间也划分为大小相同的块,称为逻辑页面。当一个用户程序被装入内存时,不是以整个程序为单位,把它存放在一整块连续的区域,而是以页面为单位来进行分配的。对于一个大小为N的页面程序,需要有N个空闲的物理页面来把它装载。这些物理页面不一定是要连续的。
  • 在页式存储管理中需要解决三个问题:数据结构、内存分配与回收、地址映射。
  • 数据结构有两个:页表和物理页面表。
    A.页表:给出了任务逻辑页面号和内存中物理页面号之间的对应关系。
    B.物理页面表:描述内存空间中,各个物理页面的使用情况。
  • 内存的分配过程:
    **A.**对于一个新来的任务,计算它所需要的页面数N,然后查看位示图,看是否还有N个空闲的物理页面。
    **B.**如果有足够的空闲物理页面,就去申请一个页表,其长度为N,并把页表的起始地址填入到该任务的控制块中。
    **C.**分配N个空闲的物理页面,把他们的变换填到页表中,建立逻辑页面与物理页面直接的对应关系。
    **D.**修改位示图,对刚刚被占用的那些物理页面进行标记。
  • 地址映射的基本思路:
    A.逻辑地址分析:对逻辑地址,找到它所在的逻辑页面,以及它在页面内的偏移地址。
    B.页表查找:根据逻辑页面号,从页表中找出它对应的物理页面号。
    C.物理地址合成:根据物理页面号和页内偏移地址,最终确定物理地址。
  • 逻辑地址分析:
    页面的大小都是2的整数次幂。对于给定的一个逻辑地址,可以直接把它的高位部分作为逻辑页面号,把它的低位部分作为页内偏移地址。例如,假设页面的大小是4KB,即2的12次幂,逻辑地址为32为,那么在一个逻辑地址当中,最低12位为页内偏移地址,而剩下的20位就是逻辑页面号。
  • 计算方法:
    逻辑页面号=逻辑地址/页面大小
    页内偏移量=逻辑地址%页面大小
    页表查找:页表作为操作系统的一个数据结构,通常保存在内核的地址空间中。页表基地址寄存器用来指向页表的起始地址;页表长度寄存器用来指示页表的大小,即对于当前任务,它总共包含有多少个页面。
    物理地址合成:假设物理页面号为f,页内偏移地址为offset,每个页面大小为2n,那么相应的物理地址为:f×2n+offset。

9、虚拟存储管理

  • 程序局部性原理:时间局限性和空间局限性。
  • 虚拟页式存储管理:在页式管理的基础上,增加了请求调页和页面置换的功能。
  • 基本思路:当一个用户程序需要调入内存去运行时,不是将这个程序的所有页面都装入内存,而是只装载部分的页面,就可以启动这个程序运行。在运行过程中,如果发现要执行的指令或者访问的数据不在内存当中,就向系统发出缺页中断请求,然后系统在处理这个中断请求时,就会将保存在外存中的相应页面调入内存,从而使该程序能继续运行。
  • 在虚拟页式存储管理中,页表包含:逻辑页面号、物理页面号、驻留位、保护位、修改位和访问位。
    -常用的页面置换算法:
    A.最优页面置换算法:理想化算法。
    B.最近最久未使用算法:链表法和栈方法。寻找长时间没有被访问的页面。
    C.最不常用算法:每个页面设置一个访问计数器。
    D.先进先出算法:性能比较差。
    E.时钟页面置换算法:把页面组成环形链表,类似时钟面。
  • 一般来说,当一个任务刚刚启动的时候,它会不断去访问一些新的页面,然后逐步建立一个比较稳定的工作集。工作集是指当前任务正在使用的逻辑页面的集合。如果分配给一个任务的物理页面数太少,不能包含整个的工作集,任务将会造成很多缺页中断,需要频繁地进行页面置换,这种现象称为“抖动”。
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这