系统架构师1000问:体系结构、数据库、网络安全与设计

本篇迁移系统架构师题库第二批 27 道问答,覆盖计算机组成、存储管理、数据库、嵌入式、网络安全、软件架构、UML 和可靠性分析。考试术语应以当年大纲和指定教材版本为准,以下答案用于理解原理。

一、计算机组成与操作系统

Q35. RISC 和 CISC 的典型区别是什么?

答案: RISC 倾向于指令格式规整、指令集相对精简、Load/Store 架构和较多通用寄存器;CISC 倾向于提供更丰富的复杂指令和寻址方式。现代处理器常把复杂指令解码为内部微操作,二者边界已经不像早期教材描述得那么绝对。编译器需要结合寄存器分配、指令调度和目标微架构优化性能。

Q36. 流水线的结构、数据和控制冒险分别是什么?

答案:

  • 结构冒险:多个流水级争用同一硬件资源。
  • 数据冒险:后续指令依赖前序指令尚未产生的结果。
  • 控制冒险:分支/跳转改变下一条指令地址,导致预取路径不确定。

常见解决办法包括资源复制、流水线暂停、数据前递、分支预测和投机执行。不同 CPU 的实现不同,考试应根据题目给出的流水线条件判断。

Q37. k 级流水线执行 n 条指令,理想吞吐率和加速比怎样计算?

答案: 若每级耗时 Δt、各级平衡且无冒险,流水线完成 n 条指令约需 (k+n−1)Δt;非流水线约需 knΔt。

  • 吞吐率:n/[(k+n−1)Δt]。
  • 理想最大吞吐率:当 n 足够大时趋近 1/Δt。
  • 加速比:kn/(k+n−1),当 n 增大时趋近 k。

真实流水线还要考虑冒险、缓存未命中、分支错误预测和阶段不均衡。

flowchart LR
  A[取指 IF] --> B[译码 ID]
  B --> C[执行 EX]
  C --> D[访存 MEM]
  D --> E[写回 WB]

Q38. Cache 写直达和写回策略有什么区别?

答案:

  • Write-through:CPU 写 Cache 时同步写下一级存储,数据一致性逻辑较简单,但写流量大。
  • Write-back:先只更新 Cache 并标记 Dirty,替换或刷新时再写回下一级存储,减少写流量,但一致性管理更复杂。

DMA 与 Cache 不一致时,写直达并不自动解决所有问题;还需考虑 DMA 是否绕过 Cache、总线一致性和缓存维护操作。

Q39. 流水线加速比为什么不会无限增长?

答案: 理想加速比上限接近流水级数 k,但实际存在流水线填充/排空、阶段不均衡、结构/数据/控制冒险、分支预测失败、访存等待和同步开销。流水线越深,时钟频率可能提高,但分支错误预测的代价也可能增加。

Q40. 段页式存储管理为什么同时使用分段和分页?

答案: 分段提供逻辑上有意义的地址空间划分(代码、数据、堆栈等),分页把每段再切成固定大小页,便于物理内存分配和减少外部碎片。逻辑地址可表示为段号、段内页号和页内偏移;硬件/OS 通过段表和页表完成转换。

代价是地址转换和表管理更复杂,可能需要 TLB 缓存转换结果。

Q41. Spooling 为什么能把独占设备变成“可共享”的逻辑设备?

答案: Spooling 把多个进程的输入/输出请求先写入磁盘缓冲区或队列,再由后台程序按序交给物理设备执行。以打印机为例,多个进程可以提交打印任务,而不必直接独占打印机。它通过排队和缓冲解耦 CPU 与慢速设备,但不代表物理设备可以同时打印多个任务。

二、数据库系统

Q42. 关系代数中的选择、投影和连接分别做什么?

答案:

  • 选择 σ:按条件筛选行。
  • 投影 π:选择需要的列。
  • 连接 ⋈:按关联条件组合多个关系。

复杂查询通常先确定关系和连接条件,再应用选择条件,最后投影所需属性。关系代数是理解 SQL 查询逻辑的基础。

Q43. 3NF 和 BCNF 的区别是什么?

答案: 3NF 要求对每个非平凡函数依赖 X→A,X 是超键,或 A 是主属性;BCNF 更严格,要求每个非平凡函数依赖的决定因素 X 都必须是超键。

因此 BCNF 可以消除某些 3NF 仍允许的冗余,但分解时还要考虑无损连接和依赖保持,不能只追求范式等级越高越好。

Q44. 数据库三级模式结构是什么?

答案:

  • 外模式:面向用户/应用的视图。
  • 概念模式:数据库整体逻辑结构。
  • 内模式:数据在存储介质上的物理组织。

三级模式通过映射实现逻辑独立性和物理独立性。考试常把“视图、全局逻辑结构、存储文件”分别对应到外模式、概念模式和内模式。

三、嵌入式与网络安全

Q45. 硬实时和软实时有什么区别?

答案: 硬实时系统错过关键截止时间可能意味着系统失效或造成不可接受的危险;软实时系统错过截止时间会降低服务质量,但不一定导致整体失效。区分重点是截止时间违例的后果,而不是系统运行得快不快。

Q46. 嵌入式操作系统如何分类?Linux 一定是软实时吗?

答案: 可按实时性、资源约束、内核结构和应用领域分类。传统通用 Linux 默认配置通常不提供严格硬实时保证;PREEMPT_RT 等实时补丁和专用配置可显著改善确定性,但是否满足硬实时要求仍需测量和论证。VxWorks、QNX、FreeRTOS 等也要结合具体版本、配置和系统设计评估,不能仅凭产品名称给出绝对结论。

Q47. 什么是交叉编译?交叉开发环境包含哪些部分?

答案: 交叉编译是在宿主机上运行编译器,为不同架构/ABI 的目标机生成可执行文件。环境通常包括宿主机、交叉编译器/链接器、目标 SDK/sysroot、目标机、下载/调试连接和运行时库。必须匹配目标 CPU、ABI、操作系统和库版本。

Q48. OSI 七层模型与 TCP/IP 模型如何对应?

答案: 常见四层 TCP/IP 模型中,OSI 应用/表示/会话层大致映射到应用层;传输层对应传输层;网络层对应网际层;数据链路层和物理层对应网络接口层。不同教材可能使用五层教学模型,把数据链路层和物理层分开。

Q49. 为什么实际通信常使用混合加密?

答案: 对称加密(如 AES/SM4)适合高效加密大量数据;非对称密码(如 RSA/ECC/SM2)适合密钥协商、密钥封装和身份认证。混合加密利用非对称机制建立/保护会话密钥,再用对称算法加密业务数据。真实协议还需要随机数、认证、密钥派生和安全参数管理。

Q50. 数字签名和数字证书分别证明什么?

答案: 数字签名用私钥对消息摘要等数据进行签名,接收方用对应公钥验证完整性和签名者持有私钥的事实;数字证书由 CA 签发,把主体身份与公钥绑定。证书链验证需要逐级验证签名、有效期、用途、撤销状态和信任根。签名不自动证明内容真实,只证明签名验证通过及其密钥关系。

Q51. 包过滤、状态检测和代理防火墙有什么区别?

答案:

  • 包过滤:按 IP、端口、协议等字段做规则匹配。
  • 状态检测:跟踪连接状态,判断报文是否属于已建立会话。
  • 应用代理:在应用层终止并重新建立连接,能理解更高层协议,但延迟和资源开销通常更大。

“代理防火墙一定最安全”不是绝对结论;安全性取决于规则、协议解析、部署位置、更新和运维。

Q52. VPN 的传输模式和隧道模式有什么区别?

答案: 以 IPsec 为例,传输模式主要保护原 IP 包的载荷,保留原 IP 头;隧道模式把整个原始 IP 包封装起来,再添加新的外层 IP 头。传输模式常用于主机间保护,隧道模式常用于网关到网关或远程接入。具体使用还要看 NAT、路由和安全策略。

四、软件工程与系统架构

Q53. 瀑布、原型、螺旋和敏捷模型分别适合什么场景?

答案:

  • 瀑布:需求和验收条件相对稳定,阶段交付明确。
  • 原型:需求不清晰,需要快速验证用户理解。
  • 螺旋:风险较高,适合通过迭代识别和控制风险。
  • 敏捷:需求变化快,强调短迭代、持续反馈和可交付增量。

模型选择必须结合项目规模、风险、合规和团队成熟度,不能只按“新项目用敏捷、老项目用瀑布”机械判断。

Q54. 常见软件架构风格有哪些?如何选?

答案:

  • 数据流:批处理、管道-过滤器。
  • 调用返回:分层、主程序-子程序。
  • 独立构件:事件驱动、消息通信。
  • 仓库:以共享数据中心组织协作。
  • 虚拟机:解释器、规则引擎。
  • 服务化:通过服务契约和网络接口协作。

选型先识别主要质量属性和系统约束,再比较耦合、部署、延迟、可扩展性和运维成本。

Q55. 创建型、结构型和行为型设计模式分别解决什么问题?

答案:

  • 创建型:对象如何创建,如工厂、抽象工厂、单例。
  • 结构型:对象/类如何组合,如适配器、代理、装饰器。
  • 行为型:对象如何协作和分配职责,如策略、观察者、模板方法。

模式不是必须使用的清单。应先识别变化点和耦合问题,再选择最简单可维护的设计。

Q56. SOA 和微服务有什么区别?SOA 一定需要 ESB 吗?

答案: SOA 强调以服务契约组织企业系统集成;微服务通常进一步强调服务自治、独立部署和围绕业务能力拆分。传统 SOA 常使用 ESB,但 ESB 不是所有 SOA 的必要条件;微服务也不意味着完全不需要网关、消息中间件或集成层。

架构演进不是简单“微服务取代 SOA”,而是根据组织边界、部署独立性、数据一致性和运维能力选择。

五、UML 与可靠性

Q57. UML 用例图中的 include 和 extend 有什么区别?

答案: include 表示基础用例必定复用被包含用例的行为;extend 表示在特定条件下向基础用例插入可选或扩展行为。箭头方向均指向被复用/被扩展的用例。具体关系应按 UML 语义和图中条件说明,而不是只靠箭头记忆。

Q58. 关联、聚合、组合、依赖、泛化和实现有什么区别?

答案:

  • 关联:对象之间存在结构关系。
  • 聚合:整体—部分关系,部分可以独立存在。
  • 组合:更强的整体—部分关系,部分生命周期通常受整体管理。
  • 依赖:一个元素临时使用另一个元素。
  • 泛化:继承关系。
  • 实现:类实现接口/契约。

UML 符号有不同箭头和菱形端,画图时要保持语义一致;组合关系是否真的拥有生命周期约束,要看领域模型。

Q59. UML 时序图怎样表达交互顺序?

答案: 生命线表示参与者或对象,消息箭头表示调用/通信,激活条表示对象执行过程,时间通常从上向下推进。阅读时检查消息发送顺序、同步/异步语义、返回消息和循环/条件片段是否与需求一致。

Q60. 串联系统和并联系统的可靠度怎样计算?

答案: 若各部件独立:

  • 串联系统:R=R1×R2×…×Rn,任一关键部件失效都会使系统失效。
  • 并联系统:R=1−(1−R1)(1−R2)…(1−Rn),所有冗余部件都失效时系统才失效。

实际冗余系统还要考虑共因失效、切换失败、诊断覆盖率和维修时间,独立性假设不成立时不能直接套公式。

Q61. 软件为什么没有像硬件那样的物理磨损型“耗损故障期”?

答案: 软件本身不会因机械摩擦或材料疲劳而磨损;故障通常来自需求/设计/编码缺陷、环境变化、数据变化和维护引入的新问题。软件运行时间增长可能暴露潜伏缺陷,但不是硬件材料意义上的磨损。修改软件可能引入回归缺陷,因此维护过程仍需配置管理和回归测试。

flowchart TD
  A[需求与架构] --> B[设计与实现]
  B --> C[测试与验证]
  C --> D[部署运行]
  D --> E[环境 / 需求变化]
  E --> F[维护与修改]
  F --> G[回归测试]
  G --> D

Flomo 原始来源