前趋图(Precedence Graph)
前趋图(Precedence Graph)是一种用于描述任务、事件或进程之间先后依赖关系的有向无环图(Directed Acyclic Graph,DAG)。
通常记作:
G = (P, E)
其中:
- P:顶点集合(Vertex Set),表示进程、任务或事件
- E:边集合(Edge Set),表示前驱约束关系
边一般表示为:
E = {(p_i, p_j)}
表示进程 p_i 必须先执行完成,进程 p_j 才能开始执行,即:
p_i ➡️ p_j
由于前趋图只描述“先后依赖关系”,因此图中不能出现环路,所以它属于有向无环图(DAG)。
在实际分析中,本质上就是按照“节点大小关系 + 箭头方向”记录每一条边的依赖关系。
PV 操作(Semaphore Operations)
PV 操作是操作系统中用于实现进程同步与互斥的一种经典机制,其核心是信号量(Semaphore)。
信号量通常记作:
S_i
其中:
- S:Semaphore(信号量)
- 下标 i:表示第 i 个信号量
PV 操作包括两种基本原语:
P 操作(Proberen)
P 操作来源于荷兰语 “Proberen”,含义为“测试”或“申请资源”。
执行逻辑:
- 对信号量 S 减 1
- 若结果小于 0,则当前进程阻塞等待
- 若结果大于等于 0,则继续执行
因此:
- 执行前需要进行 P 操作
- 表示“申请资源”或“进入临界区”
常写作:
P(S_i)
V 操作(Verhogen)
V 操作来源于荷兰语 “Verhogen”,含义为“增加”或“释放资源”。
执行逻辑:
- 对信号量 S 加 1
- 若有等待进程,则唤醒其中一个
因此:
- 执行完成后进行 V 操作
- 表示“释放资源”或“退出临界区”
常写作:
V(S_i)
PV 操作与前趋图的关系
例如:
p_1 到 p_2
可表示为:
- p_1 执行结束后执行 V(S)
- p_2 执行前先执行 P(S)
磁盘调度
最短移臂调度算法(SSTF,Shortest Seek Time First)
找最近柱面号,同柱面下,扇区号小的优先
切换磁头代价较小
页存储逻辑地址和物理地址转换
假设逻辑地址十六进制 5148H 进程 P四个存储块,页面大小 4K,页号 0~7,页号 5 的页帧号 3 怎么换算出物理地址 3148H
页面大小 4K = 4 \times 1024 = 4096 = 2^{12}
- 页内偏移量占 12 位
- 高位是页号 5 查页表是 3
如果访问页面 6 不在内存 看状态位,在内存的,淘汰没被访问的,都被访问淘汰没被修改的
文件索引
某文件系统文件存储采用文件索引节点法假设磁盘索引块和磁盘数据块大小均为 1 KB, 每个文件的索引节点中有 8 个地址项,07,每个地址项大小为 4B,其中 05 为直接索引,6是一级间接,七7二级间接,那么我们要访问的这个文件的逻辑块号分别为 0,260 和 518,则系统应分别采用什么索引,其文件系统可表示的文件最大长度为多少 KB
块大小 1KB,地址项 4B,所以一个索引块能放:
1024 / 4 = 256 个地址。
0~5:直接索引,共 6 块6:一级间接索引,可表示 256 块7:二级间接索引,可表示 256 × 256 = 65536 块
| 逻辑块号 | 判断 |
|---|---|
| 0 | 直接索引 |
| 260 | 一级间接索引,因为在 6~261 |
| 518 | 二级间接索引,因为大于 261 |
6 + 256 + 65536 = 65798 块 | |
| 65798KB |
先算一个索引块能放多少地址项:块大小 / 地址项大小。
然后按“直接块数、一级间接块数、二级间接块数”分段判断逻辑块号。
应用层协议
| 协议 | 全称 | 传输层协议 | 默认端口 | 作用 / 特点 |
|---|---|---|---|---|
| FTP | File Transfer Protocol | TCP | 21(控制)/ 20(数据) | 文件传输协议,使用两条 TCP 连接 |
| TFTP | Trivial File Transfer Protocol | UDP | 69 | 简单文件传输协议,无认证、轻量级 |
| HTTP | HyperText Transfer Protocol | TCP | 80 | 超文本传输协议,Web 基础协议 |
| HTTPS | HTTP Secure | TCP | 443 | 加密版 HTTP,基于 SSL/TLS |
| SMTP | Simple Mail Transfer Protocol | TCP | 25 | 邮件发送协议 |
| POP3 | Post Office Protocol Version 3 | TCP | 110 | 邮件接收协议,下载式 |
| IMAP | Internet Message Access Protocol | TCP | 143 | 邮件接收协议,支持服务器同步 |
| DHCP | Dynamic Host Configuration Protocol | UDP | 67(服务端)/ 68(客户端) | 动态分配 IP 地址,默认租约一般 8 天,过半续约 |
| Telnet | Telnet Protocol | TCP | 23 | 远程终端协议,明文传输,不安全 |
| SSH | Secure Shell | TCP | 22 | 安全远程登录协议,Telnet 替代品 |
| DNS | Domain Name System | UDP / TCP | 53 | 域名解析,通常 UDP,大数据量或区域传送使用 TCP |
| SNMP | Simple Network Management Protocol | UDP | 161 | 网络设备管理协议 |
| NTP | Network Time Protocol | UDP | 123 | 网络时间同步协议 |
| LDAP | Lightweight Directory Access Protocol | TCP / UDP | 389 | 目录访问协议 |
| SMB | Server Message Block | TCP | 445 | Windows 文件共享协议 |
| RTP | Real-time Transport Protocol | UDP | 动态端口 | 音视频实时传输 |
| SIP | Session Initiation Protocol | TCP / UDP | 5060 | 音视频会话控制协议 |
| RTSP | Real Time Streaming Protocol | TCP / UDP | 554 | 流媒体控制协议 |
存储网络架构
DAS,单机存储架构 NAS,网络存储架构 SAN,网络存储架构
信息安全基础知识
机密性、完整性、可用性、可控性、可审查性
安全范围:
设备安全:物质基础。 数据安全:防止未授权的泄露,篡改和毁坏 内容安全:政治法律道德层次上的要求 行为安全:通过行为提供给用户,确保行为安全。
信息安全风险类别
人为: 被动 主动 灾害性 系统故障 人员无意识行为
加密技术
| 类型 | 特征 | 常见算法 |
|---|---|---|
| 对称加密(Symmetric Encryption) | 加密和解密使用同一个密钥;速度快;适合大量数据加密;密钥分发困难 | DES、3DES、AES、RC4、SM4 |
| 非对称加密(Asymmetric Encryption) | 使用公钥和私钥;公钥加密、私钥解密;安全性高;速度较慢;适合密钥交换与数字签名 | RSA、DSA、ECC、ElGamal |
- DES 太短不安全 64 位,56 位密钥,8 位校验
- 3DES 三次更安全但更慢 112 或 168 位密钥长度
- AES 又快又安全,是现代主流
- RSA 512 位
补充记忆:
HTTPS 中通常:
- 非对称加密用于“交换会话密钥”
- 对称加密用于“实际数据传输”
消息摘要
例:哈希算法 常用算法,MD5,SHA-256
数字签名
发送者私钥加密
数字证书
CA = Certificate Authority
安全模型
| 模型 | 全称 | 核心目标 | 主要特征 |
|---|---|---|---|
| 状态机模型 | State Machine Model | 保证系统始终处于安全状态 | 将系统抽象为“状态集合 + 状态转换”,只允许安全状态之间转换,是很多安全模型的理论基础 |
| BLP 模型 | Bell-LaPadula Model | 保密性(Confidentiality) | “不上读,下不写(No Read Up,No Write Down)”;防止高密级信息泄露到低密级 |
| Biba 模型 | Biba Integrity Model | 完整性(Integrity) | “不上写,下不读(No Write Up,No Read Down)”;防止低可信数据污染高可信数据 |
| CWM 模型 | Clark-Wilson Model | 商业数据完整性 | 强调事务控制、职责分离、审计机制,通过“良构事务”保证数据一致性 |
| Chinese Wall 模型 | Chinese Wall Model | 防止利益冲突 | 用户访问某公司数据后,不能再访问竞争公司的敏感数据,常用于金融、咨询行业 |
常见口诀:
| 模型 | 口诀 |
|---|---|
| BLP | 保密模型,上读下写禁止 |
| Biba | 完整性模型,上写下读禁止 |
| CWM | 商业完整性、职责分离 |
| Chinese Wall | 防利益冲突 |
| 状态机模型 | 系统始终保持安全状态 |
数据库体系结构
| 模式 | 又称 | 面向对象 | 主要内容 | 作用 |
|---|---|---|---|---|
| 外模式 | 子模式 / 用户模式 | 用户、应用程序 | 用户看到的局部数据视图 | 保证数据独立性与安全性,不同用户看到不同数据 |
| 概念模式 | 逻辑模式 | 整个数据库系统 | 数据库整体逻辑结构与关系 | 描述全局数据结构,是数据库核心层 |
| 内模式 | 存储模式 | 数据库存储系统 | 数据物理存储方式 | 描述数据在磁盘中的存储结构与访问方式 |
简单理解:
| 层次 | 类比 |
|---|---|
| 外模式 | 用户看到的页面 |
| 概念模式 | 数据库整体设计图 |
| 内模式 | 磁盘里的真实存储 |
核心作用:
| 模式 | 数据独立性 |
|---|---|
| 外模式 ↔ 概念模式 | 逻辑数据独立性 |
| 概念模式 ↔ 内模式 | 物理数据独立性 |
口诀:
- 外模式:用户看到什么
- 概念模式:数据库整体长什么样
- 内模式:数据实际上怎么存
数据模型
| 类型 | 含义 | 特点 | 常见模型 |
|---|---|---|---|
| 概念数据模型 | 面向用户和业务的模型 | 强调现实世界语义,独立于具体数据库实现,便于需求分析 | E-R 模型(实体-联系模型) |
| 基本数据模型 | 面向数据库系统实现的模型 | 描述数据逻辑结构和操作方式,用于数据库设计与实现 | 层次模型、网状模型、关系模型、面向对象模型 |
进一步理解:
| 模型 | 面向阶段 |
|---|---|
| 概念数据模型 | 需求分析阶段 |
| 基本数据模型 | 数据库设计与实现阶段 |
常见概念:
概念数据模型
核心元素:
- 实体(Entity)
- 属性(Attribute)
- 联系(Relationship)
典型表示:
E-R 图。
基本数据模型
常见类型:
| 模型 | 特点 |
|---|---|
| 层次模型 | 树形结构,一对多 |
| 网状模型 | 图结构,多对多 |
| 关系模型 | 二维表结构,最主流 |
| 面向对象模型 | 支持对象封装、继承 |
口诀:
- 概念模型:面向现实世界
- 基本模型:面向数据库实现
- E-R 属于概念模型
- 关系模型属于基本模型
关系代数运算
| 运算 | 符号 | 含义 | 特点 |
|---|---|---|---|
| 并 | ∪ | 合并两个关系中的元组 | 要求两个关系同构 |
| 差 | − | 属于前者但不属于后者 | 要求两个关系同构 |
| 交 | ∩ | 两个关系共同拥有的元组 | 要求两个关系同构 |
| 笛卡尔积 | × | 两个关系所有元组组合 | 元组数相乘 |
| 选择 | σ | 按条件筛选行 | 相当于 WHERE |
| 投影 | π | 选取指定列 | 相当于 SELECT 字段 |
| 连接 | ⋈ | 按条件组合两个关系 | 常见数据库 JOIN |
| 自然连接 | ⨝ | 自动按同名属性连接 | 去除重复列 |
| 除 | ÷ | 表示“全部满足”关系 | 较难理解,考试高频 |
常见分类:
| 类型 | 运算 |
|---|---|
| 集合运算 | 并、差、交 |
| 专门关系运算 | 选择、投影、连接、除 |
| 基本运算 | 并、差、笛卡尔积、选择、投影 |
| 导出运算 | 交、连接、自然连接、除 |
简单理解:
| 运算 | 类似 SQL |
|---|---|
| 选择 σ | WHERE |
| 投影 π | SELECT 字段 |
| 连接 ⋈ | JOIN |
| 并 ∪ | UNION |
| 差 − | EXCEPT / MINUS |
口诀:
- 选择选“行”
- 投影选“列”
- 连接拼“表”
- 并差交做“集合运算”
云原生架构
| 架构模式 | 核心特征 | 典型能力 | 适用场景 | 常见技术/实现 |
|---|---|---|---|---|
| 服务化架构模式 | 将系统拆分为多个独立服务,每个服务独立部署、扩缩容、迭代 | 服务自治、接口通信、独立发布 | 大型业务系统、微服务平台 | Kubernetes、Spring Cloud、Dubbo、gRPC |
| Mesh 化架构模式 | 将网络通信能力下沉到基础设施层,通过 Sidecar 管理服务间流量 | 服务治理、流量控制、安全认证、熔断限流 | 大规模微服务集群 | Istio、Linkerd、Envoy |
| Serverless 模式 | 开发者只关注业务逻辑,底层资源由平台自动管理 | 自动扩缩容、按需计费、免运维 | 突发流量、轻量 API、事件处理 | AWS Lambda、Knative、OpenFaaS |
| 存储计算分离模式 | 计算节点与存储节点解耦,可独立扩展 | 弹性扩缩容、资源复用、高可用 | 大数据、云数据库、AI 训练 | Ceph、MinIO、Snowflake、对象存储 |
| 分布式事务模式 | 在多个服务或数据库之间保证数据一致性 | 最终一致性、事务补偿、状态协调 | 电商订单、支付、库存系统 | Seata、Saga、TCC、两阶段提交(2PC) |
| 可观测架构 | 对系统运行状态进行全面采集与分析 | 日志、指标、链路追踪、告警 | 云平台运维、故障定位 | Prometheus、Grafana、OpenTelemetry、Jaeger |
| 事件驱动架构 | 系统通过事件进行异步解耦通信 | 消息发布订阅、异步处理、削峰填谷 | 实时通知、数据同步、流处理 | Kafka、RabbitMQ、Pulsar、RocketMQ |
大数据设计架构
Lambda 架构(Lambda Architecture)
是一种“大数据实时处理架构”。
它的核心目标是:
同时兼顾:
- 实时性
- 准确性
- 海量数据处理能力
最早由 Nathan Marz 提出。
Lambda 架构的核心思想:
同一份数据:
- 一边走“实时计算”
- 一边走“离线批处理”
最后把两边结果合并。
经典结构:
[text] 显示已折叠代码(19 行)
| |
它由三层组成。
1. Batch Layer(批处理层)
负责:
- 存储全量历史数据
- 做高准确性离线计算
特点:
- 慢
- 但结果最准确
典型技术:
| 技术 | 用途 |
|---|---|
| Apache Hadoop | 离线计算 |
| Apache Spark | 批处理 |
| Hive | 数仓 |
| HDFS | 分布式存储 |
例如:
| |
2. Speed Layer(实时层)
负责:
- 处理最新数据
- 提供低延迟结果
特点:
- 快
- 但可能不完全准确
因为:
- 数据可能不完整
- 窗口未闭合
- 有乱序问题
典型技术:
| 技术 | 用途 |
|---|---|
| Apache Storm | 早期流处理 |
| Apache Flink | 实时计算 |
| Apache Kafka | 消息流 |
| Spark Streaming | 流计算 |
例如:
| |
而不是等第二天。
3. Serving Layer(服务层)
负责:
- 合并批处理结果
- 合并实时结果
- 对外提供查询
例如:
| |
为什么需要 Lambda 架构
因为:
早期大数据系统存在矛盾:
| 需求 | 问题 |
|---|---|
| 实时 | 数据不完整 |
| 准确 | 批处理太慢 |
于是:
| |
两边结合。
举个电商例子
假设淘宝统计:
| |
实时层:
| |
但:
- 有重复消息
- 有退款
- 有延迟订单
所以结果不一定准。
离线层:
| |
得到准确结果。
最终:
| |
Lambda 架构的问题
后来大家发现:
它太复杂。
因为:
你要维护:
| |
即:
- 实时计算代码
- 离线计算代码
容易:
- 逻辑不一致
- 运维复杂
- 开发成本高
所以后来出现 Kappa 架构
由 Jay Kreps 提出。
核心思想:
| |
即:
| |
历史数据也可以重新回放。
结构变成:
| |
不用:
- Batch Layer
- 双代码
所以现代云原生实时系统:
很多已经:
| |
二者对比
| 对比项 | Lambda | Kappa |
|---|---|---|
| 批处理层 | 有 | 无 |
| 实时层 | 有 | 有 |
| 代码逻辑 | 两套 | 一套 |
| 架构复杂度 | 高 | 较低 |
| 数据校正 | 离线修正 | 流回放修正 |
| 适合 | 传统大数据 | 现代实时系统 |
现在比较常见的现实情况是:
| 场景 | 架构 |
|---|---|
| 传统 Hadoop 数仓 | Lambda |
| 实时风控 | Kappa |
| Kafka + Flink | Kappa |
| 湖仓一体 | 更偏流批一体 |
一句话总结:
Lambda 架构本质是:
| |
用:
| |
Kappa 架构
该架构的核心思想其实非常“Kafka 化”:
| |
它不再区分:
- “离线数据”
- “实时数据”
而是统一:
| |
先看一个最典型的 Kappa 例子。
例子 1:电商实时订单系统
假设:
用户下单。
系统产生事件:
| |
这些事件进入:
Apache Kafka
然后:
Apache Flink
持续消费:
| |
此时:
你的网站已经能:
- 实时排行榜
- 实时销售额
- 秒级监控
- 实时推荐
那问题来了:
如果:
| |
怎么办?
Lambda 的做法:
| |
Kappa 的做法:
| |
例如:
| |
重新计算。
这就是:
| |
所以 Kappa 的关键前提是:
| |
Kafka 天然适合。
例子 2:实时风控系统
这是 Kappa 非常适合的场景。
例如:
信用卡风控。
每次交易:
| |
进入 Kafka。
Flink 实时处理:
| |
然后:
| |
这里:
| |
所以:
Kappa 很适合。
例子 3:IoT / 工业监控
例如:
设备持续上传:
| |
全部进入 Kafka。
Flink 持续计算:
| |
如果:
后面:
| |
怎么办?
Kappa:
| |
重新生成结果。
这其实比 Lambda 更自然。
因为工业场景:
本来就是:
| |
Kappa 为什么越来越流行
因为现代系统:
越来越“事件驱动”。
例如:
- Kafka
- Pulsar
- Redpanda
- EventBridge
- CDC
- Debezium
本质都在:
| |
Kappa 能完全替代 Lambda 吗?
答案:
| |
但:
| |
原因在于:
Kappa 有自己的限制。
Kappa 的几个核心问题
1. 回放成本巨大
假设:
| |
你要重算:
| |
这非常恐怖。
Lambda:
| |
尤其:
- PB级
- 年级别
- 全量统计
2. Kafka 不是无限存储
理论上能长保留。
实际上:
成本极高。
所以:
很多公司:
| |
历史数据进:
- HDFS
- S3
- Iceberg
- Hudi
- Delta Lake
这时候:
纯 Kappa 就不成立了。
3. 流处理不擅长复杂历史分析
例如:
| |
这种:
OLAP / 数仓分析。
批处理更强。
4. AI / 机器学习训练
很多训练:
需要:
| |
例如:
- 特征工程
- embedding
- 离线训练
- 数据清洗
这类:
还是:
| |
所以现代架构其实变成了:
流批一体(Streaming + Batch Unified)
代表:
| 技术 | 特点 |
|---|---|
| Apache Flink | 流批一体 |
| Apache Spark | Structured Streaming |
| Apache Iceberg | 湖仓 |
| Delta Lake | 湖仓 |
| Apache Hudi | 增量数据湖 |
现在很多公司的真实架构:
| |
同时:
| |
也就是说:
| |
这其实已经:
既不是纯 Lambda。
也不是纯 Kappa。
而是:
| |
你可以这样理解三代演进:
| 时代 | 架构 |
|---|---|
| Hadoop时代 | Lambda |
| Kafka时代 | Kappa |
| Lakehouse时代 | 流批一体 |
一句话总结:
Kappa 的核心优势:
| |
它非常适合:
- 实时业务
- IoT
- 风控
- 推荐系统
- 实时监控
但:
| |
目前仍离不开 Batch。
SOAP协议是什么
SOAP(Simple Object Access Protocol)
面向服务架构
| 模式 | 英文 | 核心思想 | 主要特征 |
|---|---|---|---|
| 服务注册表模式 | Service Registry Pattern | 通过统一注册中心管理服务 | 服务启动时注册自身信息,消费者通过注册表发现服务,实现动态发现与解耦 |
| 企业服务总线模式 | ESB(Enterprise Service Bus) | 通过统一总线实现系统集成 | 采用中心化总线连接各系统,负责协议转换、消息路由、数据转换与服务编排 |
进一步理解:
| 模式 | 类比 |
|---|---|
| 服务注册表 | “电话簿 / 通讯录” |
| ESB | “交通枢纽 / 中央调度中心” |
ESB 负责:
- 消息转发
- 协议转换
- 数据格式转换
- 服务路由
- 服务编排
常见对比:
| 对比项 | 服务注册表 | ESB |
|---|---|---|
| 架构风格 | 微服务 | SOA |
| 通信方式 | 去中心化 | 中心化 |
| 核心作用 | 服务发现 | 服务集成 |
| 是否存在中心节点 | 注册中心 | 总线中心 |
| 扩展性 | 高 | 相对较低 |
口诀:
- 注册表解决“服务在哪”
- ESB 解决“系统怎么连”
微服务
能拆就拆 独立,技术选型灵活 松耦合、易扩展
挑战
分布式、数据一致性、测试难度、监控管理分发扩容问题
数据库设计
redis
redis持久化方案
| 持久化方式 | 全称 | 特点 | 优点 | 缺点 |
|---|---|---|---|---|
| RDB | Redis DataBase | 定时生成内存快照(Snapshot) | 文件小、恢复快、性能高 | 可能丢失最后一次快照后的数据 |
| AOF | Append Only File | 记录每条写操作日志 | 数据更安全、丢失少 | 文件较大、恢复较慢 |
| 混合持久化 | RDB + AOF | Redis 4.0 引入,先写 RDB 再追加 AOF | 兼顾恢复速度与数据安全 | 实现更复杂 |
核心区别:
| 对比项 | RDB | AOF |
|---|---|---|
| 持久化方式 | 保存数据结果 | 保存操作命令 |
| 数据安全性 | 较低 | 较高 |
| 文件大小 | 小 | 大 |
| 恢复速度 | 快 | 慢 |
| 对性能影响 | 小 | 较大 |
| 数据丢失风险 | 较高 | 较低 |
RDB(快照)
原理:
某一时刻把整个内存数据:
直接保存成二进制快照文件。
生成文件:
| |
常见触发方式:
| |
表示:
- 900 秒内至少 1 次修改
- 就执行快照
特点:
- 类似“拍照片”
- 保存的是某时刻完整数据
可能丢失:
最后一次快照之后的数据。
AOF(追加日志)
原理:
把所有写命令:
追加记录到日志文件。
例如:
| |
恢复时:
重新执行命令。
生成文件:
| |
AOF 三种刷盘策略:
| 策略 | 含义 |
|---|---|
| always | 每次写都刷盘,最安全最慢 |
| everysec | 每秒刷盘一次,默认 |
| no | 由 OS 决定 |
默认:
| |
最多丢失约 1 秒数据。
混合持久化
Redis 4.0 后支持。
核心思想:
- 前半部分用 RDB 快照
- 后半部分追加 AOF 日志
这样:
- 启动恢复更快
- 数据也更安全
属于目前推荐方案。
一句话记忆
| 方式 | 理解 |
|---|---|
| RDB | “存结果” |
| AOF | “存过程” |
| 混合持久化 | “结果 + 过程” |
口诀:
- RDB 快但可能丢数据
- AOF 安全但更重
- 混合持久化最均衡