嵌入式软件开发,非科班专业必须掌握的基本计算机知识
核心知识点:数据表示和运算、存储系统、指令系统、总线系统、中央处理器、输入输出系统
这一部分主要讲解了CPU的组成和扩容、CPU与存储器(主存、辅存、缓存)的连接
一 存储器以及其与CPU的连接
1)存储器的扩容
一块存储芯片的内部结构
1k×4位存储矩阵结构
由1k×4位构建一个1k×8位存储矩阵(位扩展)——芯片扩容
右边存储低四位、左边存储高四位
由1k×4位构建一个2k×4位存储矩阵(字扩展)多了一条地址线A10
A10 = 1,CS1处得到高电平而不被选中,CS2处得到低电平而被选中
若再增加一条地址线A11
由1k×4位构建一个2k×8位存储矩阵(位扩展+字扩展)
2)存储器与CPU的连接
存储器与CPU连接示意图
例:
存储芯片
译码器与门电路(圆圈的意思是将当前信号 取反)
地址分配
实现MREQ作为访存控制信号(低电平有效)、WR作为读/写控制信号(低电平为读、高电平为写)
二 缓存Cache
存储器与CPU连接时会发现,CPU很快,主存很慢,因此需要一种更快的存储器——缓存Cache
缓存(Cache)是指在计算机系统中临时存储数据的一种机制。它可以将频繁访问的数据暂时保存在高速存储器中,以便增加对这些数据的访问速度。
在计算机系统中,数据的读写通常会涉及到内存和CPU之间的数据交换,如果每次数据访问都要通过总线来获取,就会造成较长的等待时间,从而影响系统的响应速度和效率。而缓存的引入可以解决这个问题。缓存中存储着部分经常使用的数据,当程序需要读取或写入这些数据时,可以直接从缓存中获取,省去了从内存中进行读写操作的时间,从而大大提高了程序的执行效率。
在现代计算机中,缓存通常分为三级:一级缓存、二级缓存和三级缓存。一级缓存位于CPU内部,速度最快,容量最小;二级缓存位于CPU与内存之间,速度较快,容量较大;三级缓存则是位于内存与磁盘之间,速度较慢,容量较大。不同层级的缓存之间的数据交换也有一定的规律和策略,例如多级缓存、缓存行、预取等技术,以提高缓存的效率和减少缓存的失效率。
程序的局部性访问原理
程序的局部性访问原理(Locality of Reference)是指在特定的时间段内,程序对存储器的访问存在着一定的空间局部性和时间局部性。
空间局部性指程序在一段时间内主要访问某些特定的存储单元,
时间局部性则指程序在一定时间内多次访问同一个存储单元的可能性较大。
这种局部性访问原理对于计算机系统设计非常重要,因为它可以被用来优化计算机系统的性能。例如,计算机中的缓存系统就是利用了局部性访问原理来提高访问速度。由于程序经常访问同一组数据或代码块,这些数据和代码会被存储在缓存中,并且在下一次访问时可以直接从缓存中获取。这样就可以大幅减少从主存中读取数据时的延迟,提高程序的执行效率。
除了缓存之外,还有一些其他优化技术也利用了局部性访问原理。例如,磁盘预读技术可以在读取磁盘数据时,预先把连续的数据块读取到缓存中,以减少后续读取的延迟;局部性编码技术可以将经常一起访问的数据进行压缩,以进一步提高数据的访问速度。总而言之,程序的局部性访问原理对于计算机系统的性能优化具有非常重要的意义,开发人员需要在程序设计中充分考虑这一原理。
基本工作原理
把缓存和主存以块为单位,
读时,判断地址是否在缓存中,常用则备份至缓存中,缓存满时需要按照一定规则清理已有的块
写时,考虑保持数据一致性的办法,
主存-Cache地址映射
地址分两块 地址分四块
分2的m次方块
图中主存中两个地址映射缓存一个地址,因此需要加标志位(黄色字体)
直接映射
例:
全相联映射
更好的方法是,将缓存Cache组内分组,然后组外进行直接映射、组内进行全相联映射。
粉色是组地址段(缓存有多少组),红色为组内块的地址,黄色为标记位来区分主存究竟映射至缓存组内的哪一个。
这种方法名为 组相联映射
组相联映射
Cache缓存中只有主存部分的块,因此CPU查询主存地址时,不一定能够在缓存中找到,因此涉及命中率问题
前面提及缓存中的数据需要被及时替换,因此需要算法
直接映射无需考虑替换算法,直接替换
对于全相连和组相连,因为某一主存块可能映射到Cache中的多个块中,因此存在以下替换算法:
(1)先进先出算法(FIFO)
(2)近期最少使用算法(LRU)(设计计数器)
(3)最不经常使用算法(LFU)
(4)随机算法(RAND)
写策略(改写的时机)
三 虚拟存储器
之前是缓存与主存搭配,这部分是辅存与主存配合,扩大存储容量
虚地址(逻辑地址)——>映射 实地址(物理地址)
页式虚拟存储器
图中 虚页号要大于实页号,因此映射时需要其他操作,即页表起始地址
段式虚拟存储器
页式虚拟存储器(Paging Virtual Memory)和段式虚拟存储器(Segmentation Virtual Memory)都是常用的虚拟存储器管理方式,但它们有着不同的实现方式和特点。
1)实现方式
页式虚拟存储器将进程的地址空间划分为固定大小的页面(Page),相邻的页面是连续的,每个页面的大小通常为2的幂次方。物理内存也被分成相同大小的帧(Frame),每个页面可以映射到一个或多个帧中。当进程需要访问一个页面时,操作系统会根据页面号查找该页面所在的帧,然后通过内存管理单元把该页面加载到内存中。
段式虚拟存储器则将进程的地址空间划分为若干个逻辑段(Segment),每个逻辑段具有一定的长度、基址和保护属性。每个逻辑段可以动态地分配物理内存中的若干个连续区域,这些区域可以是不连续的,但必须满足逻辑地址空间中段的大小限制。当进程需要访问一个逻辑段时,操作系统会根据给定的段号和段内偏移量计算出对应的物理地址。
2)存储管理
在页式虚拟存储器中,操作系统把逻辑地址(由页号和页内偏移量组成)转换为物理地址(由帧号和页内偏移量组成)。这个过程叫做页面映射(Page Mapping),可以通过页表或者快表来实现。
在段式虚拟存储器中,操作系统把逻辑地址(由段号和段内偏移量组成)转换为物理地址(由物理地址和段内偏移量组成)。这个过程叫做段映射(Segment Mapping),可以通过描述符表来实现。
3)特点
页式虚拟存储器的最小存储单位是页面,其大小一般为4KB、8KB或者16KB。页式虚拟存储器将地址空间和物理内存都划分为等大小的块,因此易于管理和实现。但是,在进行页面映射时,由于可能存在不同页面映射到同一帧的情况,因此可能会产生页面置换和页面失效等问题。
段式虚拟存储器的最小存储单位是逻辑段,每个逻辑段的大小不定,根据需要动态调整。段式虚拟存储器更加灵活,可以为不同类型的数据分配不同大小的地址空间,但管理和实现相对复杂,需要占用更多的内存开销。
综上所述,页式虚拟存储器和段式虚拟存储器分别适用于不同的应用场景,开发人员需要根据具体情况选择合适的虚拟存储器管理方式。
段页式虚拟存储器
段页式虚拟存储器(Segmentation Paging Virtual Memory)是将段式虚拟存储器和页式虚拟存储器相结合的一种内存管理机制。在段页式虚拟存储器中,进程的地址空间被划分为多个逻辑段,每个逻辑段被进一步分成多个固定大小的页面。每个逻辑段的长度可以动态调整,而每个页面的大小通常固定为2的幂次方。
与普通的段式虚拟存储器不同的是,段页式虚拟存储器使用了分段和分页两级映射机制。进程访问一个地址时,首先根据该地址所在的逻辑段号进行段映射,然后再把段内偏移量转换为页面号和页内偏移量,进行页面映射。因此,段页式虚拟存储器既具有段式虚拟存储器的灵活性,又兼具页式虚拟存储器的管理效率。
在段页式虚拟存储器中,操作系统需要维护两级页表来完成地址转换。第一级页表用于映射逻辑段号到物理地址,称为段表(Segment Table);第二级页表用于映射页面号到物理帧号,称为页表(Page Table)。当进程需要访问一个地址时,操作系统首先查找该地址对应的段号的段表项,确定物理地址空间中该逻辑段的位置和大小。接着,根据偏移量计算出页面号,并在对应的页表项中查找物理帧号。最后,使用物理帧号和页内偏移量组合成最终的物理地址。
相较于纯粹的页式虚拟存储器和段式虚拟存储器,段页式虚拟存储器具有更好的灵活性和管理效率,但同时也带来了更多的复杂度和开销。在实际应用中,需要权衡不同方面的需求,选择适合的内存管理方式。