并发编程时代,我们应何去何从?

2020-06-11 15:27:22 浏览数 (1)

“十多年来预言家们就一直争论:单个计算机的结构发展到达了极限,计算机技术的真正大幅度飞跃只能通过将多台计算机连接到一起才能实现。”

——吉恩·阿姆达尔,1967 年

免费的性能午餐已经结束——Intel、AMD 和Sparc、PowerPC 等主要的处理器生产厂商,从前使用的提高CPU 性能的传统方法已经走到尽头,单核处理器的主频多年来一直踏步不前,当今主流的CPU 制造技术是超线程和多核架构。

并发和并行编程技术已经从内核程序设计和高性能计算等尖端领域延伸而出,发展成为每位程序员都必备的知识。当前并行和分布式计算系统已经变成了一种规范,大多数应用程序都使用并发处理方式,有些程序是为了提高性能,也有些程序是为了处理异步事件。

目前,大多数开发者都没有做好迎接这场变革的准备工作。也许他们在学校学习过传统的并发模型(基于线程和锁的),但是这类模型无法在确保可接受生产效率的前提下,以可靠的方式处理海量的并发工作。而且,线程和锁不仅难以使用还易于出错。开发者如果想要提高自己的水平,就必须使用等级更高且可组合性更高的并发抽象。

并发编程

在开发并发程序时,我们将一个程序视为同时执行并通过某种方式协调的一系列计算操作。要实现一个能够正常运行的并发程序,比实现一个顺序程序要困难得多。顺序程序设计中的所有难点都会在并发程序设计中出现,但不止如此,并发程序设计中还有另一些挑战。你可能会问:“既然这样麻烦,为什么还要开发并发程序?我们只开发顺序程序不就行了吗?”

1

提高程序性能

整个程序不再由单个处理器执行,不同的子计算操作可以由不同的独立处理器执行,这样可以使程序运行得更快。随着多核处理器的发展,当前并发程序设计受到了越来越多的关注。

2

更快速的I/O 操作

纯顺序程序必须定时轮询I/O设备,以查明键盘、网络接口或其他设备是否输入了数据。与之相比,并发程序可以实时回应I/O 请求。对于I/O 密集型操作来说,这可以提高吞吐量,而且这也是在多处理器计算机出现前,编程语言就已经支持并发程序设计技术的原因之一。因此,并发编程技术能够切实地提高程序的交互操作响应性。

3

简化程序的实现和维护工作

通过使用并发编程技术,可以使一些程序更加简洁。可以更方便地将一个程序划分为更小的、独立的控制流实体,而不是通过一个较大的程序协调所有任务。用户接口、Web 服务器和游戏引擎就是可应用并发编程技术的典型系统。

Scala

尽管Scala 仍旧处于发展之中,还没有成为广泛流行的编程语言(如Java),但它为并发程序设计提供了丰富的支持并具有强大的功能。

Scala 生态体系中存在几乎支持所有并发编程模式的并发框架,而且这些框架正在积极发展。在其全部发展过程中,Scala 为并发程序设计提供了现代化的高级编程接口,从而扩展了并发编程技术的应用领域。

许多现代并发框架的固有句法灵活性能够与Scala 相合

这归功于第一类函数、叫名参数、类型推断和模式匹配等功能,通过这些功能可以将API 定义得像该语言的固有功能一样。

像嵌入式领域特定语言一样,这些API 通过将Scala 用作宿主语言,可以模拟各种编程模型:Actor、基于软件的事务内存和Future,当这些典型的API 被实现为软件库时,它们就会变得像基础的语言功能一样。

一方面,Scala 可以避免出现必须为每种新并发编程模型开发一种新语言的情况,而且Scala 还可以被用作孕育现代并发框架的温床。

另一方面,与许多编程语言相比,Scala 减轻了程序员的句法负担,因而吸引了更多用户。

Scala 是一种安全语言

它拥有自动垃圾收集、自动绑定检查功能并取消了指针运算,这有助于避免内存泄漏、缓冲区溢出等内存错误。与此类似,其静态类型安全性可确保在较早的开发阶段去除许多程序错误。在开发并发程序时,虽然各种并发错误更加难以处理,但静态类型安全性确实可以为程序员分忧。

Scala 具有互操作性

Scala 程序会编译为Java字节码,因此最终的可执行代码是在Java 虚拟机(JVM)上运行的。这意味着Scala 程序能够以无缝方式使用现存的Java 库,并与Java 内容丰富的生态系统交互。通常,向另一种编程语言过渡是一个痛苦的过程。从Java 之类的语言向Scala 过渡时,该过程会很平缓并且会轻松得多。这也是Scala 变得越来越流行的原因之一,也是一些兼容Java 的框架选择Scala作为其实现语言的一个原因。

更为重要的是,Scala 程序在JVM 上运行意味着Scala 程序可以轻松移植到多种平台上。除此之外,JVM 拥有定义明确的线程和内存模型,这可以确保在不同的计算机上Scala 程序都能够以相同的方式运行。对于顺序程序的语义一致性来说,可移植性非常重要,而在并发程序中可移植性就更为重要。

——本文节选自《Scala并发编程》

0 人点赞