软考(存储)

 层次化存储

空间局部性是被访问了相邻的可能还要被访问。

时间局部性是被访问了,可能会再次被访问。

虚拟存储体系由 主存-外存(辅存) 两级存储器构成

Cache- 主存-外存(辅存)叫三级存储结构

ROM,掉电安全

RAM,掉电丢数据

BIOS系统掉电不会丢失,一直存在,所以选A。

Cache

Cache性能分析与计算

  1. 命中率(Hit Rate)

    • 命中率 = 命中次数 / 总访问次数。

  2. 平均访问时间

    • 平均时间(t3) = 命中时间(命中率 (h)* Cache周期(t1)) + 缺失率(1-h) × 缺失惩罚(访问主存时间(t2))。

  3. 缺失类型

    • 强制缺失(Compulsory Miss):首次访问数据必然缺失。

    • 冲突缺失(Conflict Miss):因映射冲突导致的缺失(直接/组相联中存在)。

    • 容量缺失(Capacity Miss):Cache容量不足导致。

了解一下主存与Cache的映射关系。

主存与Cache之间的映射关系由硬件直接完成,与程序员和操作系统都无关。

Cache的三大映射方式

1. 直接映射(Direct Mapped)
  • 原理:主存块固定映射到Cache的唯一位置(如 Cache行号 = 主存块号 % Cache行数)。

  • 优点:硬件简单,访问速度快。

  • 缺点:易冲突(不同主存块竞争同一Cache行)。

  • 软考题:给定主存地址(标记位+行号+块内偏移),计算Cache命中位置。

2. 全相联映射(Fully Associative)
  • 原理:主存块可存入Cache的任意位置

  • 优点:冲突率低。

  • 缺点:查找需比较所有行的标记位(硬件成本高)。

  • 应用场景:小容量Cache(如TLB)。

3. 组相联映射(Set Associative)
  • 原理:Cache分组,主存块映射到特定组内的任意行(如2路组相联:每组2行)。

  • 优点:平衡冲突率和硬件成本(最常用)。

  • 计算题

    • 组号 = 主存块号 % 组数

    • 标记位 = 主存块号 / 组数

当Cache满且需要调入新数据时,如何选择被替换的行?
策略规则特点应用场景
随机(RAND)随机选择一行替换实现简单,性能不稳定极少使用
FIFO替换最早调入的行可能替换频繁使用的行较少使用
LRU替换最久未使用的行命中率高,硬件实现复杂最常用(如4路组相联)
LFU替换使用频率最低的行需维护计数器,可能积累旧数据特定场景

例题

Cache的命中率并不会随其容量增大而线性提高,当容量越大,提升率就越低,提升曲线越平缓。

全相联是任意地方都能映射,直接相连是映射到Cache的对应位置,组相连是分组对应,是前两个的折中。

软考高频考点

  1. 选择题

    • 问:“2路组相联Cache,容量8KB,每行32B,主存地址32位,块内偏移占多少位?”

      • 解:块内偏移 = log₂(32B) = 5位;组数 = 8KB/(2×32B) = 128组 → 组号占7位;标记位 = 32-5-7=20位。

  2. 简答题

    • 比较直接映射和全相联映射的优缺点。

  3. 设计题

    • 如何通过优化Cache行大小提升命中率?(权衡空间局部性与容量利用率)


自测题

  1. 某系统Cache命中率95%,命中时间2ns,缺失惩罚100ns,求平均访问时间?

    • 答:2ns + 5%×100ns = 7ns。

  2. 为什么组相联映射能减少冲突缺失?

    • 答:同一主存块可映射到组内多行,降低竞争概率。

主存编址计算

内存不够时可以横向扩容也可以纵向扩容

核心概念

1. 主存编址的基本单位
  • 位(bit):最小单位,0或1。

  • 字节(Byte):1 Byte = 8 bit(现代计算机的基本编址单位)。

  • 字(Word):与CPU位数相关(如32位CPU的1 Word = 4 Byte)。

2. 关键术语
  • 地址线(Address Bus):CPU通过地址线访问主存,n根地址线可寻址 2^n 个单元。

  • 数据线(Data Bus):决定每次读写的数据位数(如32位数据线一次传输4 Byte)。

  • 存储容量存储单元数 × 每个单元的位数(如64K×8位表示64K个单元,每单元8位)。

主存编址计算步骤

1. 确定地址空间
  • :若地址线为20根,按字节编址,则:

    • 可寻址空间 = 2^20 = 1MB(因为 2^20 Byte = 1MB)。

    • 地址范围:0x00000 ~ 0xFFFFF(十六进制)。

2. 计算芯片数量
  • 需求容量 vs 芯片容量

    • 若需 64KB 主存,使用 16K×4位 的存储芯片:

      • 数量 = (总容量) / (单芯片容量) = (64K×8) / (16K×4) = 8片

    • 连接方式:位扩展 + 字扩展(见下文)。

3. 地址分配与片选逻辑
  • 地址线分配

    • 低位地址线连接芯片内部地址(如 16K=2^14,需14根地址线 A0~A13)。

    • 高位地址线通过译码器生成片选信号(如剩余 A14~A15 用于片选)。

  • 片选信号:通过译码器(如2-4译码器)选择不同芯片组。

例题

题型1:计算主存容量
  • 题目:CPU地址线24根,按字节编址,主存容量是多少?

  • 解法

    • 可寻址单元数 = 2^24 = 16M

    • 容量 = 16M × 1 Byte = 16MB

题型2:存储芯片扩展
  • 题目:用 8K×8位 芯片扩展为 32K×16位 主存,需多少芯片?如何连接?

  • 解法

    1. 字扩展:容量从 8K→32K,需 32K/8K=4组

    2. 位扩展:位数从 8位→16位,需 16/8=2片/组

    3. 总芯片数 = 4组 × 2片/组 = 8片

    4. 连接图

      • 低位地址线 A0~A12 连接所有芯片(8K=2^13)。

      • 高位 A13~A14 通过译码器选择组(4组需2根线)。

      • 数据线:每组2片分别提供高8位和低8位。

题型3:地址范围计算
  • 题目:某存储芯片地址范围为 8000H~BFFFH,求容量(按字节编址)。

  • 解法

    1. 计算地址跨度:BFFFH - 8000H + 1 = 4000H

    2. 转十进制:4000H = 2^14 = 16K

    3. 容量 = 16K × 1 Byte = 16KB

第一步:计算内存总容量

1. 确定地址范围跨度
  • 起始地址:A0000H

  • 结束地址:CFFFFH

  • 地址跨度 = 结束地址 - 起始地址 + 1

    CFFFFH - A0000H + 1 = 30000H
    • 注意:CFFFFH - A0000H = 2FFFFH,再加1得到 30000H

2. 将十六进制转换为十进制
  • 30000H 转换为十进制:

    3 × 16^4 + 0 × 16^3 + 0 × 16^2 + 0 × 16^1 + 0 × 16^0 = 3 × 65536 = 196608 Byte
  • 转换为KB(1KB = 1024 Byte):

    196608 / 1024 = 192 KB
  • 选项匹配D、192KB

3. 快速验证
  • 十六进制 30000H 直接转换为十进制:

    • 30000H = 3 × 64K = 192KB(因为 10000H = 64KB)。

第二步:计算所需芯片数量

1. 明确芯片容量
  • 题目给出芯片规格:64K×8bit

    • 64K 表示地址单元数(字扩展)。

    • 8bit 表示每个单元的数据位数(位扩展)。

  • 芯片容量 = 64K × 1 Byte = 64KB(因为 8bit = 1Byte)。

2. 计算芯片数量
  • 总内存容量 = 192KB(第一步结果)。

  • 单芯片容量 = 64KB

  • 所需芯片数量 = 总容量 / 单芯片容量 = 192KB / 64KB = 3片

  • 选项匹配B、3

3. 连接方式说明
  • 由于题目要求的是按字节编址,且芯片本身是 64K×8bit(即 64KB),因此:

    • 无需位扩展(因为 8bit 已经满足字节编址要求)。

    • 只需字扩展,将 3 片 64KB 芯片的地址空间拼接为 192KB

### 关于中数据库存储过程的点解析 #### 中的存储过程定义与作用 存储过程是一组为了完成特定功能而编写的 SQL 语句集合,经过编译并保存在数据库服务器中[^3]。通过调用存储过程名称来执行这些预定义好的操作,从而减少网络流量和提高性能。 #### 创建存储过程的关键要素 创建存储过程中涉及几个重要组成部分:参数列表、局部变量声明以及具体的SQL命令序列。其中,输入/输出参数允许外部程序存储过程传递数据或者接收返回的结果;局部变量则用于临时存储计算中间值以便进一步处理[^4]。 ```sql CREATE PROCEDURE procedure_name @parameter1 datatype, @parameter2 datatype OUTPUT AS BEGIN -- SQL statements here... END; ``` #### 执行存储过程的方式方法 可以通过EXECUTE或CALL关键字来激活已存在的存储过程实例运行。如果该过程带有输出型参量,则需额外指定相应变量名以捕获其传出的数据项[^5]。 ```sql DECLARE @output_value INT; EXEC procedure_name @input_param = 'value', @output_param = @output_value OUTPUT; SELECT @output_value AS output_result; ``` #### 常见察点分析 - **语法结构**: 掌握如何正确定义一个完整的存储过程,包括但不限于头部信息(如名字空间)、主体逻辑编写规范等方面的知识点。 - **事务控制机制(TCL)**: 理解COMMIT 和 ROLLBACK 的应用场景及其对于保持业务一致性的重要性[^6]。 - **错误捕捉与异常处理**: 学习TRY...CATCH 结构的应用场景及其实现细节,确保即使发生意外情况也能优雅降级而不至于崩溃整个系统服务[^7]。 #### 示例题目解析 假设有一道典型的笔试题如下所示: > 设计一个名为`usp_UpdateEmployeeSalary`的存储过程,接受两个整数类型的参数分别代表员工ID(`@emp_id`)和新的薪水金额(`@new_salary`)。当更新成功时打印消息"Updated successfully!",否则抛出自定义错误提示"Update failed."。 解答此问题可以从以下几个方面入手虑解决方案的设计思路: 1. 明确需求范围——即哪些表参与此次变更动作; 2. 编写具体实现代码片段; 3. 测试验证最终成果是否满足预期效果。 ```sql CREATE PROC usp_UpdateEmployeeSalary ( @emp_id INT, @new_salary DECIMAL(8,2), @result_msg NVARCHAR(MAX) OUTPUT )AS BEGIN TRY UPDATE Employees SET Salary=@new_salary WHERE EmpId=@emp_id; IF @@ROWCOUNT >0 THEN SET @result_msg='Updated successfully!'; ELSE THROW 50001,'No matching record found.',1; END TRY BEGIN CATCH SET @result_msg=ERROR_MESSAGE(); END CATCH ; GO -- Testing the stored procudure. DECLARE @msg nvarchar(max); EXEC dbo.usp_UpdateEmployeeSalary 1 ,75000,@msg OUT; PRINT @msg; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值