《Haskell并行与并发编程》PDF下载

  • 购买积分:11 如何计算积分?
  • 作  者:(英)马洛(SimonMarlowe)著;喻昌远译
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2014
  • ISBN:9787115367181
  • 页数:260 页
图书介绍:本书深入浅出地介绍如何使用Haskell语言及相关的库和框架编写并行和并发程序。本书用两个部分分别讲解并行Haskell编程和并发Haskell编程。书中包含大量可运行的代码示例,并附有详细的注释,读者通过亲身运行、修改和调试代码,可极大地加深对书中内容的理解。

第1章 绪论 1

1.1 术语:并行性和并发性 1

1.2 工具和资源 3

1.3 示例代码 3

第一部分 并行Haskell 9

第2章 并行基础:Eval Monad 9

2.1 惰性求值和弱首范式 9

2.2 Eval monad、rpar和rseq 15

2.3 示例:并行化数独解算器 18

2.4 Deepseq 27

第3章 求值策略 29

3.1 参数化策略 30

3.2 列表并行求值策略 32

3.3 示例:K均值问题 33

3.3.1 并行化K均值问题求解 37

3.3.2 性能和分析 39

3.3.3 spark活动可视化 42

3.3.4 粒度 43

3.4 spark垃圾回收与投机并行 44

3.5 使用parBuffer并行化惰性流 47

3.6 分块策略 50

3.7 恒等性 51

第4章 数据流并行:Par Monad 52

4.1 示例:图中的最短路径 56

4.2 流水线并行 59

4.2.1 生产者限速 63

4.2.2 流水线并行的局限性 63

4.3 示例:会议时间表 64

4.4 示例:并行类型推断器 71

4.5 使用不同的调度器 75

4.6 Par monad和策略的对比 76

第5章 Repa数据并行编程 77

5.1 数组、形状和索引 78

5.2 数组运算 80

5.3 示例:计算最短路径 82

5.4 折叠和形状多态 86

5.5 示例:图像旋转 88

5.6 小结 92

第6章 Acellerate GPU编程 94

6.1 概述 95

6.2 数组和索引 95

6.3 运行简单Accelerate计算 97

6.4 标量数组 99

6.5 数组索引 99

6.6 在Acc中创建数组 99

6.7 数组配对 101

6.8 常数 102

6.9 示例:最短路径 102

6.9.1 在GPU上运行 105

6.9.2 调试CUDA后端 106

6.10 示例:Mandelbrot集生成器 106

第二部分 并发Haskell 115

第7章 并发基础:线程和MVar 115

7.1 简单的示例:提醒器 116

7.2 通信:MVar 118

7.3 MVar用作简单通道:日志服务 120

7.4 MVar用作共享状态的容器 122

7.5 MVar用作构件单元:无界通道 125

7.6 公正性 129

第8章 重叠I/O 131

8.1 Haskell中的异常 134

8.2 Async的错误处理 138

8.3 合并 140

第9章 线程的取消和超时 143

9.1 异步异常 144

9.2 异步异常的屏蔽 146

9.3 bracket操作 149

9.4 通道的异步异常安全 149

9.5 超时 151

9.6 异步异常的捕获 153

9.7 mask和forkIO 155

9.8 关于异步异常的讨论 156

第10章 软件事务内存 158

10.1 运行示例:窗口管理 158

10.2 阻塞 162

10.3 阻塞直到发生变化 164

10.4 STM的合并 165

10.5 Async的重实现 166

10.6 通道的STM实现 168

10.6.1 更多可能的操作 169

10.6.2 阻塞操作的复合 170

10.6.3 异步异常安全 170

10.7 通道的另一种实现 171

10.8 有界通道 173

10.9 STM的适用性 175

10.10 性能 176

10.11 小结 178

第11章 高级并发抽象 179

11.1 线程泄漏的避免 179

11.2 对称并发组合子 181

11.3 添加函子实例 184

11.4 小结:Async API 185

第12章 并发网络服务程序 186

12.1 简易服务器 186

12.2 包含状态的简易服务器 189

12.2.1 设计一:单一全局锁 190

12.2.2 设计二:每条服务线程一个通道 190

12.2.3 设计三:使用广播通道 191

12.2.4 设计四:使用STM 192

12.2.5 实现 193

12.3 聊天服务器 195

12.3.1 架构 196

12.3.2 客户数据 197

12.3.3 服务器数据 198

12.3.4 服务器 199

12.3.5 设置新客户 199

12.3.6 运行客户处理 201

12.3.7 小结 203

第13章 使用线程并行编程 204

13.1 如何通过并发实现并行 204

13.2 示例:文件搜索 205

13.2.1 串行版本 205

13.2.2 并行版本 207

13.2.3 性能和伸缩性 208

13.2.4 使用信号量限制线程数量 210

13.2.5 ParIO monad 215

第14章 分布式编程 218

14.1 distributed-process及相关软件包 219

14.2 分布式是并发还是并行? 220

14.3 第一个示例:ping 220

14.3.1 进程和ProcessMonad 221

14.3.2 定义消息类型 221

14.3.3 Ping服务进程 222

14.3.4 主进程 224

14.3.5 main函数 225

14.3.6 Ping示例小结 225

14.4 多节点ping 226

14.4.1 单机运行多节点 227

14.4.2 多机运行 227

14.5 有类型通道 229

14.6 故障处理 233

14.7 分布式聊天服务器 236

14.7.1 数据类型 237

14.7.2 发送消息 239

14.7.3 广播 240

14.7.4 分布式处理 240

14.7.5 测试服务器 243

14.7.6 故障以及增删节点 243

14.8 练习:分布式键值存储 245

第15章 调试、性能调整以及外部函数接口 247

15.1 并发程序调试 247

15.1.1 查看线程状态 247

15.1.2 记录事件日志和ThreadScope 248

15.1.3 死锁检测 250

15.2 并发(和并行)程序的调优 252

15.2.1 创建线程和Mvar操作 252

15.2.2 共享并发数据结构 255

15.2.3 RTS选项的调整 255

15.3 并发和外部函数接口 257

15.3.1 线程和外部对外调用 257

15.3.2 异步异常和外部调用 259

15.3.3 线程和外部对内调用 259