Skip to content

Commit 8086fd5

Browse files
committed
fix: unify md style then
1 parent cb40e04 commit 8086fd5

File tree

1 file changed

+21
-21
lines changed

1 file changed

+21
-21
lines changed

src/content/blog/2025-04-01/index.md

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
---
2-
title: "Zig语言中的拓扑排序及其在并行处理中的应用"
2+
title: "Zig 语言中的拓扑排序及其在并行处理中的应用"
33
author: "杨其臻"
44
date: "Apr 01, 2025"
5-
description: "本文介绍Zig语言实现拓扑排序及其在并行任务调度中的应用"
5+
description: "本文介绍 Zig 语言实现拓扑排序及其在并行任务调度中的应用"
66
latex: true
77
pdf: true
88
---
99

1010
## 引言
11-
在系统编程领域,Zig语言凭借其独特的显式内存管理、零成本抽象和强调确定性的设计理念,正在成为构建高性能应用的利器。本文聚焦于拓扑排序算法在Zig语言中的实现,并深入探讨其在并行任务调度中的创新应用。通过将传统的图论算法与现代并发模型相结合,我们能够构建出既保证执行顺序正确性,又充分挖掘硬件并行潜力的任务调度系统。
11+
在系统编程领域,Zig 语言凭借其独特的显式内存管理、零成本抽象和强调确定性的设计理念,正在成为构建高性能应用的利器。本文聚焦于拓扑排序算法在 Zig 语言中的实现,并深入探讨其在并行任务调度中的创新应用。通过将传统的图论算法与现代并发模型相结合,我们能够构建出既保证执行顺序正确性,又充分挖掘硬件并行潜力的任务调度系统。
1212

1313
## 拓扑排序基础
1414
拓扑排序是对有向无环图(DAG)进行线性排序的算法,其数学表达为:对于图中任意有向边 $(u, v)$,节点 $u$ 在排序结果中都出现在 $v$ 之前。形式化定义为给定图 $G=(V, E)$,求节点排列 $L = [v_1, v_2, ..., v_n]$,使得对于每条边 $(v_i, v_j) \in E$,都有 $i < j$。
1515

16-
Kahn算法是该问题的经典解法,其伪代码可表示为:
16+
Kahn 算法是该问题的经典解法,其伪代码可表示为:
1717
1. 初始化入度表并构建邻接表
18-
2. 将入度为0的节点加入队列
18+
2. 将入度为 0 的节点加入队列
1919
3. 循环处理队列直到为空:
2020
1. 取出队首节点加入结果集
21-
2. 将该节点邻居的入度减1
22-
3. 将新产生的入度0节点加入队列
21+
2. 将该节点邻居的入度减 1
22+
3. 将新产生的入度 0 节点加入队列
2323

24-
## Zig语言实现拓扑排序
24+
## Zig 语言实现拓扑排序
2525

2626
### 数据结构设计
27-
Zig的标准库提供了`std.ArrayList`作为动态数组实现,我们采用邻接表表示图结构:
27+
Zig 的标准库提供了 `std.ArrayList` 作为动态数组实现,我们采用邻接表表示图结构:
2828
```zig
2929
const Node = struct {
3030
edges: std.ArrayList(usize),
@@ -42,9 +42,9 @@ const Graph = struct {
4242
}
4343
};
4444
```
45-
此结构通过`nodes`数组存储所有节点,每个节点的`edges`字段存储其邻接节点索引。显式的`allocator`参数贯彻了Zig显式内存管理的设计哲学,允许调用方控制内存分配策略。
45+
此结构通过 `nodes` 数组存储所有节点,每个节点的 `edges` 字段存储其邻接节点索引。显式的 `allocator` 参数贯彻了 Zig 显式内存管理的设计哲学,允许调用方控制内存分配策略。
4646

47-
### Kahn算法实现
47+
### Kahn 算法实现
4848
完整算法实现包含入度计算和队列处理:
4949
```zig
5050
fn topologicalSort(g: *Graph) !std.ArrayList(usize) {
@@ -85,12 +85,12 @@ fn topologicalSort(g: *Graph) !std.ArrayList(usize) {
8585
return result;
8686
}
8787
```
88-
代码亮点在于错误处理机制:当结果长度与节点总数不符时,立即返回`CycleDetected`错误,这对应着图中存在环的情况。`defer`语句确保临时分配的内存被正确释放,避免了内存泄漏风险。
88+
代码亮点在于错误处理机制:当结果长度与节点总数不符时,立即返回 `CycleDetected` 错误,这对应着图中存在环的情况。`defer` 语句确保临时分配的内存被正确释放,避免了内存泄漏风险。
8989

9090
## 并行处理中的拓扑排序
9191

92-
### Zig并发模型
93-
Zig采用基于协程的异步编程模型,通过`async`/`await`语法实现轻量级并发。其标准库提供的`std.Thread`模块支持系统级线程的创建和管理。考虑如下并行调度策略:
92+
### Zig 并发模型
93+
Zig 采用基于协程的异步编程模型,通过 `async`/`await` 语法实现轻量级并发。其标准库提供的 `std.Thread` 模块支持系统级线程的创建和管理。考虑如下并行调度策略:
9494
```zig
9595
fn parallelExecute(g: *Graph, result: []const usize) void {
9696
var semaphore = std.Semaphore.init(0);
@@ -122,15 +122,15 @@ fn parallelExecute(g: *Graph, result: []const usize) void {
122122
该实现创建固定数量的工作线程(`batch_size`),每个线程以跨步方式处理任务。信号量机制保证主线程能够准确等待所有任务完成。这种批量处理方式减少了线程创建开销,同时通过任务分片避免了资源竞争。
123123

124124
### 性能优化实践
125-
在16核服务器上对包含10,000个任务的依赖图进行测试,测得并行版本相比串行执行有显著提升:
126-
- 吞吐量:从1200 tasks/s提升至8500 tasks/s
127-
- 延迟:从8.3ms降低至1.2ms(P99)
128-
关键优化点包括采用无锁环形缓冲区作为任务队列、根据CPU缓存行大小(通常64字节)进行数据对齐来避免伪共享等问题。
125+
在 16 核服务器上对包含 10,000 个任务的依赖图进行测试,测得并行版本相比串行执行有显著提升:
126+
- 吞吐量:从 1200 tasks/s 提升至 8500 tasks/s
127+
- 延迟:从 8.3ms 降低至 1.2ms(P99)
128+
关键优化点包括采用无锁环形缓冲区作为任务队列、根据 CPU 缓存行大小(通常 64 字节)进行数据对齐来避免伪共享等问题。
129129

130130
## 进阶话题
131-
在动态图场景下,传统的静态拓扑排序算法需要改进。我们提出增量维护算法:当新增边(u, v)时,只需沿着v的后续节点传播更新。数学上,这可以形式化为:
131+
在动态图场景下,传统的静态拓扑排序算法需要改进。我们提出增量维护算法:当新增边 $(u, v)$ 时,只需沿着v的后续节点传播更新。数学上,这可以形式化为:
132132
$$\Delta L = \text{TopoSort}(\{v\} \cup \text{Descendants}(v))$$
133-
其中 $\text{Descendants}(v)$ 表示 $v$ 的所有可达节点。Zig的编译时反射机制可以优化该过程,通过`@TypeOf``@hasField`等编译时函数实现依赖关系的静态验证。
133+
其中 $\text{Descendants}(v)$ 表示 $v$ 的所有可达节点。Zig 的编译时反射机制可以优化该过程,通过 `@TypeOf``@hasField` 等编译时函数实现依赖关系的静态验证。
134134

135135
## 总结
136-
本文展示了Zig语言在实现经典算法和构建并发系统方面的独特优势。通过将显式内存控制与现代化并发原语相结合,开发者能够创建出既保证正确性又具备高性能的任务调度系统。未来随着Zig标准库的进一步完善,其在分布式系统和异构计算领域的应用值得期待。
136+
本文展示了 Zig 语言在实现经典算法和构建并发系统方面的独特优势。通过将显式内存控制与现代化并发原语相结合,开发者能够创建出既保证正确性又具备高性能的任务调度系统。未来随着 Zig 标准库的进一步完善,其在分布式系统和异构计算领域的应用值得期待。

0 commit comments

Comments
 (0)