当前位置: 首页 > news >正文

软考-软件设计师学习总结-存储系统

校验方法

校验方法通常指的是用于验证数据完整性、准确性以及一致性的技术或过程。这些方法广泛应用于数据传输、存储、输入等多个领域,确保信息在处理过程中没有被篡改或者损坏。
以下是几种常见的校验方法:

  1. 奇偶校验(Parity Check):这是一种简单的错误检测方法,通过增加一个额外的位(奇校验位或偶校验位)来使得数据中1的数量为奇数或偶数。这种方法只能检测到单个位的错误。

  2. 循环冗余校验(Cyclic Redundancy Check, CRC):CRC是一种基于多项式编码的数据校验和算法,广泛应用于数字网络和存储设备中以检测错误。它比奇偶校验更强大,可以检测到更多的错误类型。
    采模式二除法运算的只有循环冗余校验CRC。

  3. 校验和(Checksum):校验和是将数据块的所有字节加起来得到的一个值,然后这个值被发送或存储在一起。接收端同样计算校验和,并与发送的校验和比较以检查数据是否出错。

  4. 哈希函数(Hash Function):哈希函数可以将任意长度的数据映射为固定长度的哈希值。即使原始数据有微小变化,哈希值也会显著不同。常用于数据完整性验证,如MD5、SHA系列等。

  5. 汉明码(Hamming Code):汉明码是一种能够纠正单个位错误同时检测两个位错误的编码方式。它通过在数据中加入额外的校验位来实现这一点。

  6. 区块链中的共识算法:虽然不是传统意义上的数据校验方法,但在分布式账本技术中,共识算法(如PoW、PoS等)扮演着验证交易有效性和维护系统安全的角色。

奇偶校验(Parity Check)是一种简单的错误检测方法,广泛应用于数据传输和存储系统中。它通过增加一个额外的位(称为奇偶校验位)来确保数据块中的1的数量是奇数或偶数,从而帮助检测数据在传输过程中是否发生了错误。

奇偶校验的基本原理
奇校验:如果一组数据中的1的个数为奇数,则奇校验位设置为0;如果1的个数为偶数,则奇校验位设置为1,使得整个数据(包括校验位)中1的总数保持为奇数。
偶校验:与奇校验相反,如果一组数据中的1的个数为偶数,则偶校验位设置为0;如果1的个数为奇数,则偶校验位设置为1,以保证整个数据(包括校验位)中1的总数保持为偶数。

原码、反码和补码

如果将位数扩展到 n 位,原码、反码和补码的取值范围可以根据位数的变化进行推导。以下是详细说明:


1. 原码

  • 定义
    • 最高位为符号位,0 表示正数,1 表示负数。
    • 其余 ( n-1 ) 位表示数值的绝对值。
  • 取值范围
    • 正数:0 到 ( 2^{n-1} - 1 )。
    • 负数:-1 到 ( -(2^{n-1} - 1) )。
    • 特殊情况:0 存在两种表示形式:
      • +0:所有位为 0。
      • -0:符号位为 1,其余位为 0。
    • 总结
      原码的取值范围为:
      [
      -(2^{n-1} - 1) \text{ 到 } +(2^{n-1} - 1)
      ]

2. 反码

  • 定义
    • 正数的反码与原码相同。
    • 负数的反码是对原码的数值位按位取反(符号位保持不变)。
  • 取值范围
    • 正数:0 到 ( 2^{n-1} - 1 )。
    • 负数:-1 到 ( -(2^{n-1} - 1) )。
    • 特殊情况:0 存在两种表示形式:
      • +0:所有位为 0。
      • -0:符号位为 1,其余位全为 1。
    • 总结
      反码的取值范围为:
      [
      -(2^{n-1} - 1) \text{ 到 } +(2^{n-1} - 1)
      ]

3. 补码

  • 定义
    • 正数的补码与原码相同。
    • 负数的补码是在反码的基础上加 1。
  • 取值范围
    • 正数:0 到 ( 2^{n-1} - 1 )。
    • 负数:( -2^{n-1} ) 到 -1
    • 特殊情况:0 的表示唯一:
      • 0:所有位为 0。
      • 最小负数 ( -2^{n-1} ):符号位为 1,其余位全为 0。
    • 总结
      补码的取值范围为:
      [
      -2^{n-1} \text{ 到 } +(2^{n-1} - 1)
      ]

总结对比

编码方式正数范围负数范围总范围
原码0 到 ( 2^{n-1} - 1 )-1 到 ( -(2^{n-1} - 1) )( -(2^{n-1} - 1) ) 到 ( +(2^{n-1} - 1) )
反码0 到 ( 2^{n-1} - 1 )-1 到 ( -(2^{n-1} - 1) )( -(2^{n-1} - 1) ) 到 ( +(2^{n-1} - 1) )
补码0 到 ( 2^{n-1} - 1 )( -2^{n-1} ) 到 -1( -2^{n-1} ) 到 ( +(2^{n-1} - 1) )

关键点

  1. 原码和反码

    • 都存在正零(+0)和负零(-0)的问题。
    • 范围对称,但比补码少一个数值。
  2. 补码

    • 解决了正零和负零的问题,0 的表示唯一。
    • 能多表示一个最小负数(( -2^{n-1} )),因此范围更大。
  3. 实际应用

    • 现代计算机普遍使用补码来表示有符号整数,因为它简化了加减法运算,并避免了正负零的歧义。

举例说明

假设 ( n = 4 )(4 位二进制数):

  • 原码

    • 正数:0 到 ( 2^{4-1} - 1 = 7 )。
    • 负数:-1 到 ( -(2^{4-1} - 1) = -7 )。
    • 总范围:-7+7
  • 反码

    • 正数:0 到 ( 2^{4-1} - 1 = 7 )。
    • 负数:-1 到 ( -(2^{4-1} - 1) = -7 )。
    • 总范围:-7+7
  • 补码

    • 正数:0 到 ( 2^{4-1} - 1 = 7 )。
    • 负数:( -2^{4-1} = -8 ) 到 -1
    • 总范围:-8+7

希望以上内容清晰解答了你的疑问!

Cache

虽然我无法直接在这里绘制图形,但我可以用文字描述一个典型的计算机存储器层次结构图,并解释每个部分如何与Cache相关联。你可以根据这个描述自己画出一张图来更好地理解。

计算机存储器层次结构示意图

+--------------------------------------------------+
|                  CPU                             |
+--------------------------------------------------+
            |      |        |          |
            v      v        v          v
+----------------------------+  +-------------------+
|         L1 Cache           |  |       L1 Cache    |
|  (Instruction & Data)      |  | (Instruction &    |
|  - Very Fast, Small Size   |  |  Data)            |
+----------------------------+  +-------------------+
            |                   |
            v                   v
+----------------------------+  +-------------------+
|         L2 Cache           |  |       L2 Cache    |
|  - Fast, Moderate Size     |  | - Fast, Moderate  |
|                            |  |  Size             |
+----------------------------+  +-------------------+
                    \                 /
                     \               /
                      v             v
                +-----------------------+
                |        L3 Cache      |
                |  - Shared among cores|
                |  - Larger but slower |
                +-----------------------+
                           |
                           v
                +-----------------------+
                |        Main Memory   |
                |  (RAM)               |
                |  - Large, Slower     |
                +-----------------------+
                           |
                           v
                +-----------------------+
                |    Secondary Storage |
                |  (HDD/SSD)           |
                |  - Very Large, Slow  |
                +-----------------------+

解释

  1. CPU:位于顶部,是执行指令和处理数据的核心部件。

  2. L1 Cache

    • 分为指令Cache(I-Cache)和数据Cache(D-Cache)。
    • 非常快但容量较小,通常每个核心都有自己的L1 Cache。
    • 直接连接到CPU,用于存储最频繁访问的数据和指令。
  3. L2 Cache

    • 速度比L1慢一些,但容量更大。
    • 每个核心通常有自己的L2 Cache。
    • 当L1 Cache未命中时,CPU会尝试从L2 Cache中获取数据。
  4. L3 Cache

    • 在多核处理器中,L3 Cache通常是多个核心共享的。
    • 容量比L2大,但速度较慢。
    • 如果L2 Cache也未命中,则查找L3 Cache。
  5. Main Memory (RAM)

    • 当所有级别的Cache都未命中时,CPU将不得不从主存中读取数据。
    • 主存容量大,但访问速度远低于Cache。
  6. Secondary Storage (HDD/SSD)

    • 最后一层存储,用于长期保存大量数据。
    • 访问速度最慢,但容量最大。

如何工作

  • 当CPU需要数据时,首先检查L1 Cache。如果找到所需数据(称为“命中”),则立即使用该数据继续操作。
  • 如果L1 Cache未命中,CPU将继续检查L2 Cache,依此类推直到L3 Cache。
  • 如果所有级别的Cache都没有所需数据,CPU将不得不从主存中读取数据,并将其加载到各级Cache中供后续使用。Cache的主要目的是通过存储最常访问或最近访问的数据来加速数据的读取速度,从而提高计算机系统的整体性能。由于处理器访问主内存(RAM)的速度相对较慢,而Cache能够以更快的速度提供数据,因此它可以显著减少CPU等待数据的时间,进而加快程序执行的速度。
  • 数据在Cache中的存储遵循一定的策略(如直接映射、全相联映射或组相联映射),并且当Cache满时需要采用替换算法(如LRU、FIFO等)决定移除哪些数据。

通过这种层次化的存储体系结构,计算机能够在性能和成本之间取得平衡,同时提供快速的数据访问路径以提高整体效率。希望这段描述能帮助你画出一个清晰的图示!

Cache的主要目的是:
通过存储最常访问或最近访问的数据来加速数据的读取速度,从而提高计算机系统的整体性能。
由于处理器访问主内存(RAM)的速度相对较慢,而Cache能够以更快的速度提供数据,因此它可以显著减少CPU等待数据的时间,进而加快程序执行的速度。

存储器

按照所处位置分类:
内存
外存

按照存储器材料分类
磁存储器
半导体存储器
光存储器

按照工作方式分类
读写存储器
只读存储器

按照访问方式分类
按地址访问的存储器
按内容访问的存储器

按寻址方式分类
随机存储器(Random Access Memory, RAM)
顺序存储器(Sequential Access Memory, SAM)
直接存储器(Direct Access Memory, DAM)

Cache地址映像方式指的是如何将主存中的数据块映射到Cache中特定的位置。这种映射方式决定了当CPU需要访问某个内存地址时,Cache如何确定该地址对应的数据是否已经在Cache中(即命中),以及如果不在Cache中时如何选择一个位置来存储新数据。常见的Cache地址映像方式主要有三种:直接映像(Direct Mapping)全相联映像(Fully Associative Mapping)组相联映像(Set Associative Mapping)

1. 直接映像(Direct Mapping)

特点
  • 每个内存块只能映射到Cache中的一个固定位置
  • 每个内存块与Cache中的一个特定行相对应,通过简单的哈希函数(通常是取模运算)决定映射关系。
优点
  • 实现简单,硬件设计成本较低。
  • 查找速度快,因为可以直接根据地址计算出Cache中的位置。
缺点
  • 可能导致冲突(Conflict Miss),即使Cache中有空闲行,但如果这些行不是对应的映射位置,则无法使用。
示例

假设有一个有4行的Cache,内存地址的低两位用于在行内定位字节,接下来的两位用于确定Cache中的哪一行(例如,地址 0x0C 映射到第3行)。这意味着内存地址为 0x0C, 0x1C, 0x2C 等的所有块都将竞争Cache中的同一行。

2. 全相联映像(Fully Associative Mapping)

特点
  • 任何内存块都可以放置在Cache中的任意位置
  • 需要比较所有Cache行的内容或标签来查找匹配项。
优点
  • 最大限度地减少了冲突,提高了命中率。
  • 对于局部性较好的程序特别有效。
缺点
  • 实现复杂且昂贵,因为需要比较所有行的标签来确定是否存在所需数据。
  • 查找速度较慢,尤其是在大型Cache中。
示例

在一个有4行的全相联Cache中,任何一个内存块都可以被放置在任意一行。因此,没有固定的映射关系,增加了灵活性但也增加了查找时间。

3. 组相联映像(Set Associative Mapping)

特点
  • 是直接映像和全相联映像的折衷方案
  • 主存块可以映射到一组特定的Cache行(称为“集合”)中的任意一行,而不是单一行。
  • 常见的形式包括2路、4路、8路等组相联Cache,其中“n路”表示每组包含n个行。
优点
  • 提供了比直接映像更高的灵活性,同时避免了全相联映像的高复杂度。
  • 在命中率和实现复杂度之间找到了良好的平衡。
缺点
  • 虽然比全相联映像简单,但仍然比直接映像复杂一些。
  • 查找速度介于两者之间。
示例

在一个4路组相联Cache中,假设我们有16行Cache分成4组,每组包含4行。那么,每个内存块可以映射到这4行中的任意一行。例如,地址 0x0C0x1C 可能都属于同一个组,但它们可以在该组内的不同行中找到。

总结

映像方式特点优点缺点
直接映像每个内存块映射到Cache中的唯一位置实现简单,查找快容易发生冲突
全相联映像任何内存块可映射到Cache中的任意位置冲突少,命中率高实现复杂,查找慢
组相联映像每个内存块映射到一组特定位置中的任意一个平衡了前两者的优缺点比直接映像复杂

选择哪种映像方式取决于具体的应用需求、性能要求以及硬件成本等因素。在实际应用中,组相联映像是最常用的,因为它提供了较好的性能与复杂度之间的平衡。

存储器层次结构
为了平衡成本、速度和容量的需求,现代计算机采用了一种多层次的存储体系结构:

寄存器:位于CPU内部,访问速度最快,但容量非常有限。
高速缓存(Cache):介于寄存器和主存储器之间,用于暂存最近或频繁访问的数据,减少对主存的访问次数。
主存储器(RAM):作为工作区,用于存放当前运行的应用程序及其所需的数据。
辅助存储器(如HDD、SSD):用于长期存储数据,虽然访问速度较慢,但提供了巨大的存储空间。
计算机存储器是计算机系统中用于存放数据和指令的重要组成部分,它在计算机运行过程中扮演着至关重要的角色。根据其功能和特性,存储器可以分为两大类:主存储器(内存)辅助存储器(外存)。下面详细介绍这两类存储器及其特点。

主存储器(内存)

主存储器,通常指的是随机存取存储器(RAM),是一种易失性存储器,这意味着当计算机关闭时,其中的数据会被清除。主存储器的主要作用是临时存储当前正在使用的数据和程序代码,以便CPU能够快速访问。

  • 随机存取存储器(RAM, Random Access Memory)

    • RAM允许数据以几乎相同的速度被读取或写入任何位置。
    • 它是易失性的,意味着断电后信息丢失。
    • 分为动态随机存取存储器(DRAM)和静态随机存取存储器(SRAM)。DRAM成本较低、容量大但速度较慢;SRAM速度快但成本高、容量相对较小,常用于高速缓存(Cache)。
  • 只读存储器(ROM, Read-Only Memory)

    • ROM是一种非易失性存储器,即使在没有电源的情况下也能保持数据。
    • 常用于存储固件或引导加载程序等不需要经常修改的信息。

辅助存储器(外存)

辅助存储器用于长期保存数据和程序,即使计算机关闭后信息也不会丢失。这类存储器的访问速度通常比主存储器慢,但由于其非易失性和较高的存储容量,非常适合用来存储大量数据。

  • 硬盘驱动器(HDD, Hard Disk Drive)

    • 使用旋转磁盘来读写数据,具有较大的存储容量和相对较低的成本。
    • 访问速度较慢,因为涉及到机械运动。
  • 固态硬盘(SSD, Solid State Drive)

    • 没有移动部件,使用闪存技术来存储数据。
    • 相比HDD,SSD提供更快的数据读写速度,更高的可靠性和更低的功耗。
  • 光盘(CD/DVD/Blu-ray Discs)

    • 使用激光读写数据,适用于长期存储和分发软件、音乐、电影等内容。
  • USB闪存驱动器

    • 小巧便携,基于闪存技术,适合于小量数据的传输和短期存储。

存储器层次结构

为了平衡成本、速度和容量的需求,现代计算机采用了一种多层次的存储体系结构:

  1. 寄存器:位于CPU内部,访问速度最快,但容量非常有限。
  2. 高速缓存(Cache):介于寄存器和主存储器之间,用于暂存最近或频繁访问的数据,减少对主存的访问次数。
  3. 主存储器(RAM):作为工作区,用于存放当前运行的应用程序及其所需的数据。
  4. 辅助存储器(如HDD、SSD):用于长期存储数据,虽然访问速度较慢,但提供了巨大的存储空间。

这种层次化的存储架构旨在优化性能的同时控制成本,通过合理分配不同类型的存储资源来满足各种应用场景的需求。

相关文章:

  • 3. 列表操作
  • JavaScript浅拷贝与深拷贝
  • 从理论到实战:深度解析MCP模型上下文协议的应用与实践
  • WSA(Windows Subsystem for Android)安装LSPosed和应用教程
  • git 提交空文件夹
  • Multi Agents Collaboration OS:数据与知识协同构建数据工作流自动化
  • C# 看门狗策略实现
  • JavaScript:游戏开发的利器
  • LangChain-输出解析器 (Output Parsers)
  • Python设计模式:命令模式
  • c++自学笔记——字符串与指针
  • Android 手机指纹传感器无法工作,如何恢复数据?
  • 四旋翼无人机手动模式
  • 在kotlin的安卓项目中使用dagger
  • 【CompletableFuture】异步编程
  • 每天五分钟玩转深度学习PyTorch:搭建LSTM算法模型完成词性标注
  • 使用libcurl编写爬虫程序指南
  • UE4模型导入笔记
  • 若依 前后端部署
  • 聊透多线程编程-线程基础-4.C# Thread 子线程执行完成后通知主线程执行特定动作