中级软考(软件工程师)——软件设计师高频核心考点大补充(架构设计、硬核计算与OS篇)

📢 导语:补齐短板,拿下核心重镇!

在前几篇的“错题集”中,我们扫清了许多选择题中的盲区。但如果你想在软考中级(软件设计师)中稳操胜券,有几个**“骨灰级”的经典知识模块**是你绝对绕不开的!

上午选择题常客的 数据库范式UML 类图关系,下午大题必考的 设计模式数据流图 (DFD),以及理科生最爱拿分的 流水线计算McCabe 复杂度PV 操作页面淘汰算法

这一篇,我们就来彻底打通这些常考常错的经典考点,拒绝死记硬背,硬核解析教你一秒破题!


🎨 一、 23种设计模式(GoF)避坑指南

设计模式不仅是上午选择题的常客,更是下午第6题(Java/C++代码填空)的绝对核心。死背定义很容易混淆,我们要抓的是**“场景关键字”**。

💡 考点 1:装饰器模式 (Decorator) vs 代理模式 (Proxy)

⚠️ 避坑吐槽:这两个模式的代码结构极其相似,都是包装一个对象,考场上极容易选错!

📝 深度解析
  • 装饰器模式 (Decorator)
    • 核心目的动态地给对象增加新的功能
    • 关键字:动态附加职责、不改变原类、扩展功能、继承的替代方案。
    • 经典场景:给一杯原味奶茶(原对象)加珍珠、加椰果(动态添加职责)。
  • 代理模式 (Proxy)
    • 核心目的控制对原对象的访问
    • 关键字:控制访问、安全代理、延迟加载(虚拟代理)。
    • 经典场景:你想买海外的东西,找个代购(代理)。代购不是为了改变商品,而是为你提供获取商品的“访问通道”。

💡 考点 2:策略模式 (Strategy) vs 状态模式 (State)

📝 深度解析
  • 策略模式 (Strategy)
    • 核心目的:封装不同的算法,让它们可以互相替换。
    • 经典场景:商场的打折活动(满减、打折、原价)。算法由客户端(用户)主动决定用哪一个。
  • 状态模式 (State)
    • 核心目的:当一个对象的状态改变时,它的行为也跟着改变。
    • 经典场景:自动售货机(缺货状态、正常状态)、电梯(开门状态、运行状态)。状态的切换是系统内部自动完成的,客户端不参与。

💡 考点 3:创建型模式三剑客(工厂方法 vs 抽象工厂 vs 建造者)

📝 深度解析
  • 工厂方法 (Factory Method):生产单一产品。比如鼠标工厂只生产鼠标。
  • 抽象工厂 (Abstract Factory):生产产品族(一系列相关的产品)。比如某工厂不仅生产鼠标,还生产配套的键盘(同一个品牌族)。看到“系列对象”、“产品族”必选抽象工厂。
  • 建造者模式 (Builder):一步一步创建一个复杂的对象。强调的是组装过程。比如组装一台电脑(先装 CPU,再装主板,再装内存)。

🔗 二、 UML 类图关系(万年必考符号题)

UML 类图是下午大题的基础,搞不清箭头和菱形,代码填空直接抓瞎。

💡 考点 4:六大关系的强弱对比

⚠️ 避坑吐槽:聚合和组合的菱形是空心还是实心?箭头到底指向谁?千万别搞反!

📝 深度解析

关系的强弱顺序:依赖 < 关联 < 聚合 < 组合 < 泛化/实现

  1. 依赖关系 (Dependency):最弱。A 的方法里用到了 B 作为参数。
    • 符号虚线 + 箭头(指向被依赖者)。
  2. 关联关系 (Association):平等的知道。A 里面有一个 B 的全局变量。
    • 符号实线 + 箭头(或无箭头双向关联)。
  3. 聚合关系 (Aggregation):整体与部分,“部分可以离开整体单独存在”。比如电脑和U盘、部门和员工。
    • 符号空心菱形 + 实线(菱形靠近整体)。
  4. 组合关系 (Composition):同生共死的整体与部分,“部分离开整体没有意义”。比如人和大脑、鸟和翅膀。
    • 符号实心菱形 + 实线(菱形靠近整体)。
  5. 泛化关系 (Generalization):即面向对象中的继承 (extends)
    • 符号实线 + 空心大三角(指向父类)。
  6. 实现关系 (Realization):类实现了接口 (implements)。
    • 符号虚线 + 空心大三角(指向接口)。

🗄️ 三、 数据库规范化理论(范式推导)

软考数据库必考题,给你一个关系模式,问你是第几范式(1NF/2NF/3NF/BCNF)。不要怕,记住以下三步走。

💡 考点 5:彻底分清 1NF、2NF、3NF

📝 深度解析

首先找准主键(可能由多个属性联合组成)。

  • 第一范式 (1NF)属性不可再分
    • 解释:这是关系数据库最基本的要求。只要是个正常的二维表,都满足 1NF。
  • 第二范式 (2NF):在 1NF 的基础上,消除非主属性对主键的“部分依赖”
    • 鉴定口诀:“是不是只能由完整的联合主键推导出来?”
    • 举例:主键是(学号,课程号)。如果表里有个属性是“姓名”,因为仅靠“学号”就能推出“姓名”,不需要“课程号”,这就是部分依赖。消除它,就达到了 2NF。(注意:如果主键只有一个字段,那肯定没有部分依赖,直接满足 2NF!)
  • 第三范式 (3NF):在 2NF 的基础上,消除非主属性对主键的“传递依赖”
    • 鉴定口诀:“非主属性之间有没有互相推导的关系?”
    • 举例:主键是(学号)。属性有(系名,系主任)。因为 学号 -> 系名,而 系名 -> 系主任,导致 学号 间接(传递)推导出了 系主任。把系名和系主任单独拆一张表,就达到了 3NF。

💡 考点 6:无损联接与保持函数依赖

⚠️ 避坑吐槽:拆表不是随便拆的,拆坏了拼不回来叫“有损”!

📝 深度解析
  • 无损联接:拆分后的两张表,通过自然连接(JOIN)拼起来,和原表一模一样,没多出脏数据,没少数据。(3NF 和 BCNF 都能做到无损联接)
  • 保持函数依赖:拆分后,原来的依赖关系没有被破坏。(3NF 可以做到保持函数依赖,但 BCNF 不一定能做到)

🗺️ 四、 数据流图 (DFD) 找错技巧

下午题的第一道大题(15分),绝对是画数据流图。找错题是有固定套路的。

💡 考点 7:DFD 常见三大逻辑错误

📝 深度解析

找图里缺了什么线,检查以下三种典型的低级错误:

  1. 黑洞 (Black Hole):一个加工(圆圈)只有输入数据流,没有输出数据流。(数据进去了出不来,像黑洞一样)。
  2. 奇迹 (Miracle):一个加工只有输出数据流,没有输入数据流。(凭空产生数据,这是奇迹)。
  3. 灰洞 (Gray Hole):加工的输入数据不足以产生输出数据。(比如输入“学号”,输出“总成绩”,中间明显缺了“成绩单”的输入)。

💡 考点 8:父子图平衡(找遗漏数据流的终极必杀技)

⚠️ 避坑吐槽:下午大题让你填缺失的数据流,不要光盯着图看逻辑,要上下对比

📝 深度解析
  • 原则:父图(如顶层图)中某个加工的输入/输出数据流,必须在对应的子图(0层图、1层图)中一模一样地体现出来
  • 解题步骤
    1. 看父图里进入该加工的箭头有几个,叫什么名字。
    2. 看子图中整个框的外部输入箭头有几个。
    3. 一一对应消除,父图里有但子图里没有的,就是你要填的缺失数据流!
  • 特例:只允许一种不平衡,就是子图中出现了**内部的“数据存储”(数据库)**读写,这在父图里是可以被隐藏的。

⏱️ 五、 CPU 流水线计算(常考必杀技)

流水线技术是 CPU 提升效率的核心,考题通常让你算“执行 n n n 条指令需要多长时间”。这里有两个公式,出题人特别喜欢在这上面做文章!

💡 考点 9:流水线周期 ( Δ t \Delta t Δt)

  • 定义:执行时间最长的那一段操作的时间。
  • 举例:一条指令分取指 ( 2 ns 2\text{ns} 2ns)、分析 ( 3 ns 3\text{ns} 3ns)、执行 ( 5 ns 5\text{ns} 5ns)。那么流水线周期 Δ t \Delta t Δt 就是 5 ns 5\text{ns} 5ns。因为水管最细的地方决定了整体的水流速度(木桶效应)。

💡 考点 10:流水线执行时间计算(双公式防坑)

⚠️ 避坑吐槽:算出来一个答案,发现选项里没有?别慌,换另一个公式算!软考这块的答案极其薛定谔。

假设一条指令分 k k k 段,每段时间分别为 t 1 , t 2 , … , t k t_1, t_2, \dots, t_k t1,t2,,tk,流水线周期为 Δ t \Delta t Δt,要执行 n n n 条指令:

  1. 理论公式(优先使用)
    T = 第一条指令的完整时间 + 剩下  ( n − 1 )  条指令的重叠时间 T = \text{第一条指令的完整时间} + \text{剩下 }(n-1)\text{ 条指令的重叠时间} T=第一条指令的完整时间+剩下 (n1) 条指令的重叠时间
    T = ( t 1 + t 2 + ⋯ + t k ) + ( n − 1 ) × Δ t T = (t_1 + t_2 + \dots + t_k) + (n - 1) \times \Delta t T=(t1+t2++tk)+(n1)×Δt

  2. 实践公式(备胎使用)
    如果用理论公式算出来的答案选项里没有,说明出题人按“各段相等”的偷懒做法算了:
    T = k × Δ t + ( n − 1 ) × Δ t T = k \times \Delta t + (n - 1) \times \Delta t T=k×Δt+(n1)×Δt


🕸️ 六、 McCabe 环路复杂度计算

在白盒测试中,McCabe 复杂度用于衡量代码的逻辑复杂程度。下午大题如果考到软件工程,大概率会让你算这个值。

💡 考点 11:三大秒杀公式

⚠️ 避坑吐槽:很多同学喜欢在图里数“闭合区域”,一旦图画得复杂点眼睛就看花了。直接数“判定节点”才是王道!

面对一张程序流程图(控制流图),你可以用以下三种方法计算复杂度 V ( G ) V(G) V(G),结果绝对一样:

  1. 公式法(最稳妥) V ( G ) = E − N + 2 V(G) = E - N + 2 V(G)=EN+2
    • E E E 是图中边的数量(箭头数)。
    • N N N 是图中节点的数量(圆圈数)。
  2. 区域法(最直观) V ( G ) = 闭合区域数 + 1 V(G) = \text{闭合区域数} + 1 V(G)=闭合区域数+1
    • 图里有几个被完全封闭的“圈”,再加上图外部的那 1 1 1 个大区域。
  3. 判定节点法(最神速,强烈推荐) V ( G ) = P + 1 V(G) = P + 1 V(G)=P+1
    • P P P判定节点的数量。(判定节点就是流程图里会产生分支的地方,比如 ifwhileswitch-case)。
    • 实战技巧:直接数图里有几个节点长出了 2 条或以上的向外箭头,有几个这样的节点,加 1 就是答案!

🚥 七、 操作系统进程同步(PV 操作)

PV 操作简直是很多同学的梦魇,尤其是下午大题填空,经常搞不清哪里该 P 哪里该 V。

💡 考点 12:彻底理解 P 与 V

  • P 操作 (Wait)申请资源/消耗资源
    • 操作底层:信号量 S = S − 1 S = S - 1 S=S1。如果 S < 0 S < 0 S<0,说明没资源了,进程阻塞挂起
  • V 操作 (Signal)释放资源/生产资源
    • 操作底层:信号量 S = S + 1 S = S + 1 S=S+1。如果 S ≤ 0 S \le 0 S0,说明有其他进程在等,唤醒一个等待的进程。

💡 考点 13:前趋图填空的“出 V 入 P”口诀

⚠️ 避坑吐槽:下午大题给个流程图让你填空,千万别自己脑补复杂的逻辑,直接看箭头!

在进程同步的前趋图(比如 A 必须执行完才能执行 B)中:

  • 箭头的起点(流出) = V 操作。说明 A 干完活了,通知下一位。
  • 箭头的终点(流入) = P 操作。说明 B 开始干活前,得先等 A 的通知。
  • 口诀:出 V 入 P!
    • 一个节点如果有 2 个向外指的箭头,那它的代码末尾一定有 2 个 V 操作。
    • 一个节点如果有 3 个指向它的箭头,那它的代码开头一定有 3 个 P 操作。

🗑️ 八、 页面淘汰算法 (LRU vs FIFO)

操作系统的虚拟内存管理中,如果内存满了,要把哪个页面踢出去?这经常伴随着缺页中断的计算。

💡 考点 14:三大淘汰算法对比

  1. OPT(最佳置换算法)
    • 机制:淘汰未来最长时间内不再被访问的页面。
    • 特点:只有上帝才知道未来!这是一种理论上的理想算法,现实中无法实现,通常用来作为性能天花板对比。
  2. FIFO(先进先出算法)
    • 机制:谁最早进来,谁先被踢出去(排队机制)。
    • 特点:极其简单,但不符合局部性原理。
    • 特有考点:Belady 异常!(注意,这题常考选择题)。正常情况下,给进程分配的物理块越多,缺页率应该越低。但 FIFO 算法可能会出现分配的物理块数增加,缺页次数反而增加的反常现象,这就是著名的 Belady 异常。
  3. LRU(最近最少使用算法)
    • 机制:淘汰最长时间没有被访问过的页面。
    • 特点:符合局部性原理,性能好,没有 Belady 异常。
    • 实战技巧:考试时如果让你手动模拟 LRU,就看内存里那几个页面,在历史访问序列中,谁躲在最前面(离当前位置最远),谁就被踢!

🚀 总结语

从【硬件底层的流水线计算】到【设计模式的暗坑】,从【UML 类的羁绊】到【操作系统的 PV 大法】,你现在已经掌握了软考及格线以上最精华的武器库。

考试的时候,遇到不会的题不要慌张,用排除法结合我们讲过的“关键字”、“秒杀法则”,很多答案都会跃然纸上。

如果这系列干货文章对你有所帮助,欢迎大家点赞、收藏、转发给一起备考的战友!

最后,预祝大家在考场上:会做的全对,蒙的全中,一把过线,顺利拿证!🎉🎉🎉

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐