技术开发 频道

面向模式的软件架构:并发

【IT168 技术文章】

    选择什么样的并发架构会对多线程软件的设计和性能产生极大的影响,而对分布式软件的影响尤为明显。然而,还没有一种并发架构是适合所有的负载情况和平台的。本章所介绍的四种并发模式可以应对多种并发问题——从将异步并发处理与同步并发处理组合起来到将对共享组件的访问进行同步,同时保证性能和吞吐量的最大化。

    分布式系统软件通常能够从并发中获益,尤其是处理从多个客户端同时发出请求的服务器和服务器端软件。同时,人们设计出越来越多的多核CPU和多CPU计算机来运行多控制线程,以弥补相对于摩尔定律的差距[Sut05a]。因此,进程和线程管理机制成了分布式系统软件开发人员必须精通的知识。

    进程是一组资源的集合,比如虚拟内存、I/O句柄、控制线程,它为执行程序指令提供上下文。在硬件保护地址空间(hardware-protected address space)中,每个进程便是一个保护和资源分配单元。相反,线程是一个独立的指令序列,它以进程作为运行的上下文。线程不仅包含指令的指针,同时它还包括诸如函数激活记录(function activation records,即调用栈)、寄存器组以及线程专属(thread-specific)的数据等资源。一个线程是一个执行单元,它属于某个进程,并且与进程中其他的线程共享地址空间。

    促使分布式系统软件使用多进程和多线程的原因是多方面的,包括:

    ? 通过使用现代硬件和软件平台的进程并发能力透明地提高性能。

    ? 允许程序员进行交叠计算和在服务处理过程中交互,从而显式地提高性能。

    ? 对于交互式——比如包含用户界面的——软件可以缩短感知响应时间,因为不同的线程执行不同的服务处理任务,用户可以在某些任务阻塞的时候做其他的工作。

    ? 允许多个服务处理任务独立运行,采用同步的编程抽象——比如双向方法调用,以及阻塞在I/O和锁上的操作——从而简化应用设计。

    然而,编写高效、可预料、可缩放而且鲁棒的并发软件是相当困难的[Lea99]。高效的并发编程绝不仅仅是把独立的组件、对象或者服务用各自的控制线程启动起来,然后就可以撒手不管了。究其原因,包括以下几点:

    ? 软件的多样性。 既然不同类型的分布式系统软件的结构和行为特点各不相同,所以也就不存在放之四海皆适用的并发模型。例如,有些软件混合使用异步和同步服务处理,有些软件则由事件驱动,还有的软件必须处理不同优先级的服务请求。因此,每个类型的软件所要求的并发模型都可能有所不同,以便为用户提供有质量保证的服务,同时为开发人员提供合适的编程模型。

    ? 多线程成本。 并发软件的设计者必须清楚多线程会引入上下文切换、同步和在CPU缓存间移动数据的开销。轻率地使用线程机制很可能会减少从并发中获得的好处,甚至得不偿失。因此,设计并发软件时应该尽量将应用多线程的开销降到最低。

    ? 可移植性。已有的软件开发方法、工具和操作系统平台的局限也会给并发编程带来额外的复杂性。例如,现代硬件和软件平台的多样性使得开发能够运行在多种操作系统上的并发软件和工具变得异常复杂。

    有效地解决这些挑战和复杂性要求开发人员了解并能够正确地运用并发模式。在设计软件的基线架构、子系统和组件的整个过程中,都应该自觉地、认真地理解和应用这些模式。

0
相关文章