计算机
1.计算机网络
1.1 IP地址与子网掩码
IP 地址(以 IPv4 为例)由 32 位组成。
通过 子网掩码(Subnet Mask) 来划分这 32 位:
- 子网掩码中为
1的位 → 网络位 - 子网掩码中为
0的位 → 主机位
✅ 网络位:标识所属网络
✅ 主机位:标识该网络中的具体设备
下面给出 从头到尾 的完整计算步骤,帮助你理解为什么
- 最小可分配地址是 168.16.80.1
- 最大可分配地址是 168.16.95.254
1️⃣ 把 IP 地址和子网前缀写成二进制
| 项目 | 十进制 | 二进制(8 位) |
|---|---|---|
| 主机 IP 第1段 | 168 | 10101000 |
| 主机 IP 第2段 | 16 | 00010000 |
| 主机 IP 第3段 | 84 | 01010100 |
| 主机 IP 第4段 | 24 | 00011000 |
所以完整的 32 位二进制表示为
10101000 . 00010000 . 01010100 . 00011000
2️⃣ 依据前缀 /20 求子网掩码
/20 表示 前 20 位是网络位,其余 12 位是主机位。
- 前 20 位全 1 → 11111111.11111111.11110000.00000000
- 换算成十进制:255.255.240.0
255 . 255 . 240 . 0
11111111 .11111111 .11110000 .00000000
3️⃣ 计算 网络地址(Network ID)
网络地址 = 主机 IP 与子网掩码的 按位与(AND)运算。
IP: 10101000 00010000 01010100 00011000
MASK: 11111111 11111111 11110000 00000000
------------------------------------------------
AND: 10101000 00010000 01010000 00000000
把二进制再转回十进制:
- 第1段:10101000 → 168
- 第2段:00010000 → 16
- 第3段:01010000 → 80
- 第4段:00000000 → 0
网络地址 = 168.16.80.0
4️⃣ 计算 广播地址(Broadcast)
广播地址 = 网络地址的 主机位全部置 1(即把子网掩码的主机位取反后 OR 网络地址)。
子网掩码的主机位(12 位)全为 0 → 取反后全为 1:
子网掩码: 11111111 11111111 11110000 00000000
主机位取反: 00000000 00000000 00001111 11111111
把它 OR 到网络地址:
网络地址: 10101000 00010000 01010000 00000000
取反后: 00000000 00000000 00001111 11111111
------------------------------------------------
广播地址:10101000 00010000 01011111 11111111
转回十进制:
- 第1段:10101000 → 168
- 第2段:00010000 → 16
- 第3段:01011111 → 95
- 第4段:11111111 → 255
广播地址 = 168.16.95.255
5️⃣ 确定可分配的主机范围
- 网络地址本身不可分配给主机(它标识子网本身)。
- 广播地址也不可分配(用于子网的广播)。
因此:
| 项目 | 地址 |
|---|---|
| 最小可分配地址 | 网络地址 + 1 → 168.16.80.1 |
| 最大可分配地址 | 广播地址 - 1 → 168.16.95.254 |
6️⃣ 还有哪些有用的衍生信息?
| 项目 | 计算方法 | 结果 |
|---|---|---|
| 子网掩码 | /20 → 2^(32‑20)‑1 = 0xFFF0 0000 | 255.255.240.0 |
| 主机位数 | 32‑20 = 12 | 12 位 |
| 单个子网可用主机数 | 2^12‑2 = 4094 | 4094 台主机 |
| 子网的地址块大小 | 2^12 = 4096 个 IP | 从 168.16.80.0 到 168.16.95.255 |
7️⃣ 小结(一步步复盘)
- 把 IP 与掩码写成二进制。
- 网络地址 = IP AND 掩码。
- 广播地址 = 网络地址 OR (掩码取反)。
- 可用主机范围 = (网络地址+1) ~ (广播地址‑1)。
按照以上步骤,你可以对任何 IP/prefix(例如 10.0.5.12/22、172.16.3.4/26)快速算出它所在子网的最小/最大可分配地址。
如果还有其他子网划分、VLSM、CIDR 之类的问题,随时提问!祝你玩转 IP 地址!
2. 集群/冗余模式
1️⃣ 基本的 双机 冗余模型
| 模型 | 结构图 | 工作方式(核心) | 优点 | 缺点 / 限制 | 典型场景 |
|---|---|---|---|---|---|
| 双机热备(Active‑Standby / 主备) (也叫 双机互备、双机互为备份) | ![]() |
- 主机 A 正常提供业务。 - 备机 B 实时同步状态(心跳、磁盘镜像、心跳链路)。 - A 故障 → B 自动“接管”,切换时间通常在 秒级(软切)或 毫秒级(硬切,使用共享磁盘)。 |
- 实现相对简单。 - 故障切换快速。 - 同步数据保证业务一致性。 |
- 只有 一台主机在工作,资源利用率 ≤ 50%。 - 备机需保持 实时同步,网络/磁盘同步带宽要求高。 | - 数据库主备(MySQL 主从、Oracle Data Guard)。 - 防火墙/负载均衡器的 HA(F5、Keepalived)。 |
| 双机双工(Active‑Active / 双活) | ![]() |
- 两台机器 同时 对外提供业务。 - 业务请求根据 负载均衡(IP Hash、Round‑Robin、权重)分配。 - 需要 共享存储(SAN、GPFS)或 数据复制(同步/异步)确保数据一致。 |
- 资源利用率 接近 100%。 - 可实现 负载均衡 + 高可用。 | - 数据冲突/一致性控制复杂(需要分布式锁、双写冲突解决)。 - 对共享存储或分布式文件系统依赖大。 | - 大型 Web / 应用服务器集群(Tomcat、WebLogic 双活)。 - 数据库双活(Oracle RAC、MySQL Group Replication、Galera Cluster)。 |
| 双机互备(Active‑Standby + 互为主备) | 同 “双机热备”。 | 与双机热备相同,只是把 “热备机” 也称为 “互备”。 | 同双机热备。 | 同双机热备。 | 同双机热备。 |
| 双机集群(Cluster) | 常指 2‑N、N+M架构,下面会细化。 | - 根据实际需求可以是 Active‑Standby、Active‑Active、共享磁盘/共享存储、**共享无磁盘(shared‑nothing)**等多种组合。 | - 统一的管理平台(如 Pacemaker、Corosync、Kubernetes、Hadoop YARN 等)。 | - 需要统一的 集群调度 与 心跳机制。 |
1. 双机热备(Active-Standby)
“一个柜员上班,一个柜员在旁边坐着等”
- 主机(Active):柜员 A 正在为客户办理业务。
- 备机(Standby):柜员 B 坐在旁边,眼睛盯着 A 的操作,实时记下每一步(数据同步),但不接待客户。
- 故障时:A 突然晕倒 → B 立刻接手,继续服务,客户几乎无感。
✅ 优点:切换快,数据一致
❌ 缺点:B 平时“吃空饷”,资源浪费
💡 典型应用:数据库主备(如 MySQL 主从热备)、核心交易系统
2. 双机互备(Mutual Standby)
“两个柜员,各自负责不同窗口,但能互相顶班”
- 柜员 A 负责 对公业务,柜员 B 负责 对私业务。
- 同时,A 也备份 B 的业务数据,B 也备份 A 的。
- 如果 A 挂了 → B 临时接管对公业务(虽然忙一点,但能顶上)。
✅ 优点:资源利用率高(两人都干活)
⚠️ 注意:切换后单机压力变大
💡 典型应用:两台服务器分别跑不同服务(如 Web + DB),彼此互为备份
3. 双机双工(Active-Active)
“两个柜员同时接待同一批客户,分工协作”
- 客户来办业务,系统自动分配给 A 或 B。
- A 和 B 同时处理业务,比如 A 处理奇数号客户,B 处理偶数号。
- 数据实时同步,确保两边状态一致。
- 如果 A 挂了 → 所有客户自动转给 B,服务不中断。
✅ 优点:性能翻倍 + 高可用
❌ 挑战:需解决数据冲突(比如两人同时改同一账户)
💡 典型应用:负载均衡 Web 服务器、分布式数据库(如 Oracle RAC)
1. 什么是信号量(Semaphore)
信号量是一种用于 同步 与 互斥 的计数器,它只能通过两条原子操作来改变其值:
| 操作 | 名称(常见) | 含义 | 伪代码 |
|---|---|---|---|
| P | wait、down、acquire | 计数器‑‑;若计数器<0,则将当前进程阻塞 | while (S == 0) block; S-- |
| V | signal、up、release | 计数器++;若有进程在阻塞队列中,则唤醒其中一个 | S++; if (blocked_queue not empty) wake_one(); |
- 原子性:在一个CPU时钟周期内完成,保证多个进程并发时不会出现竞争条件。
- 不可让进程自行修改计数器,只能通过
P、V两个系统调用。
2. 信号量的种类
| 类型 | 说明 | 适用场景 |
|---|---|---|
| 二值信号量(Binary Semaphore) | 计数器只能取 0 或 1,等价于 互斥锁(mutex)。 | 保护临界区、单一资源的互斥访问。 |
| 计数信号量(Counting Semaphore) | 计数器可以是任意非负整数,用来表示 资源的数量。 | 控制多实例资源(如池化的连接、打印机等)。 |
| 系统信号量 | 由操作系统内核管理,常用于进程间同步。 | 多进程共享硬件、文件等。 |
| 用户信号量 | 由用户空间库实现,功能同系统信号量,但不必进入内核。 | 轻量级线程(如 POSIX threads)之间的同步。 |
3. 计数信号量的计算方法(常见题型)
3.1 基本公式
| 变量 | 含义 |
|---|---|
N0 |
初始值(资源总数) |
S |
当前值(信号量计数) |
Avail |
当前可用资源数 = S(若 S ≥ 0) |
Wait |
等待该资源的进程数 = max(0, N0 - (S + 已分配资源数)),在简化模型中常写作 Wait = max(0, N0 - (S + 已占用资源数)) 或直接 Wait = max(0, -S)(负值模型)。 |
4.2 常见题目求解步骤
- 阅读题目,找出初始值
N0与当前信号量值S。 - 若题目只给出S(且S ≥ 0),则
- 可用资源数 =
S。 - 等待进程数 =
0(因为S为正,没有进程被阻塞)。
- 可用资源数 =
- 若题目给出S为负(或说明有阻塞进程),则
- 可用资源数 =
0(资源已全部被占用)。 - 等待进程数 =
|S|(即-S)。
- 可用资源数 =
- 若要求已分配/已占用资源数,可以利用
已占用 = N0 - Avail - Wait(或N0 - S当S ≥ 0且Wait = 0)。
4.3 示例
题目:某资源的计数信号量
S初始值为 8,当前值为 3。求可用资源数和等待该资源的进程数。
解
Avail = S = 3(还有 3 个资源可用)。S为正,说明没有进程在阻塞队列中 ⇒Wait = 0。
题目:某资源的计数信号量采用负值模型,初始值为 5,当前值为 -2。求可用资源数和等待该资源的进程数。
解
Avail = max(0, S) = 0(已无可用资源)。Wait = -S = 2(有 2 个进程在等待)。

