4.1.3 开发人员与操作系统的交互
无论您是否在多核开发中使用类库、高级函数库、应用框架,操作系统都将起到处理器、内存、文件系统等连接到计算机的设备的看门人的作用。这意味着类库、高级函数库或应用框架中包含的多线程或多处理功能仍需要经过操作系统API或SPI。图4-1显示了开发人员视角中的软件层和操作系统。
|
| (点击查看大图)图4-1 |
图4-1显示了可用于为应用软件提供多线程或多处理功能的软件层。注意图4-1中每个软件层的级别。在图4-1中,级别越低,开发人员需要控制的、负责正确使用的、必须了解的并行编程(www.cppentry.com)机制越详细。级别越低,为了正确实现软件所要求的设计和编程(www.cppentry.com)技巧越多。
级别4是最高的层。这一层为开发人员提供了与并行编程(www.cppentry.com)细节最高程度的隔离。标准模板适配并行库(Standard Template Adaptive Parallel Library,STAPL)是这种应用框架的一个实例。STAPL是采用C++(www.cppentry.com)开发并行程序的框架。类似STAPL的框架的目标是允许开发人员在应用软件中提供并行性,同时不需要担心并行编程(www.cppentry.com)所涉及的所有特定实现的相关问题。
注意:
我们将在第8章中详细介绍STAPL。
图4-1中的级别3以模板库或类库为代表,例如Intel Threading Building Blocks(TBB)库。Intel Threading Building Block库是一组高级通用组件,封装了多处理和多线程的大部分细节。开发人员使用TBB来调用完成底层工作的高级算法模板和同步对象。
注意:
我们将在第8章中介绍TBB。
STAPL和TBB库使得程序员可以更多地集中于正在实现的软件解决方案,而不是将精力主要集中于如何对正在实现的解决方案进行并行化。要记住尽管这种类型的抽象和信息隐藏对特定类型的应用程序开发人员有益,但是对某些类别的系统程序员、库开发人员或服务器开发并不合适。在第3章中,我们强调了在判断何处、何时、是否需要使用多线程或多处理时,建模和软件开发生命周期(SDLC)是非常关键的。高级应用框架以及线程构建块库并未改变这个事实。它们并没有取代建模工作或SDLC中的任何步骤。然而,如果正确使用它们,可以使得建模以及SDLC中的一些步骤更容易实现。应当首先进行问题和解决方案的分解与建模,然后再选择并行编程(www.cppentry.com)技术和工具,我们一直在强调这一点。
图4-1中的级别2包括由操作系统环境提供的线程和进程的API。在本书中,我们使用POSIX API来与操作系统进行交互,以完成进程管理和线程管理。级别2为应用程序员和系统程序员提供了最大的灵活性,但是这种灵活性是有成本的。在级别2上使用多线程和多处理,要求对线程及进程管理、进程间通信有着详细地了解,要求熟练掌握同步技术,要求对同进程和线程管理相关的操作系统API有深入地了解,要求掌握并行算法实现的特定知识,要求掌握同多处理和多线程相关的特定编译器和链接器指示的知识。在某些情况下,在级别2编程(www.cppentry.com)的灵活性的价值超过所要求的额外的技能和努力,从而是可以接受的。
在图4-1中的级别1进行编程(www.cppentry.com)要求对操作系统内核、硬件接口、内核级接口有着尽可能多的了解。级别1上的编程(www.cppentry.com)会直接访问硬件,很少或没有软件阻碍。在级别1编程(www.cppentry.com)属于系统编程(www.cppentry.com)的范畴。
无论开发的应用程序使用的是级别4还是级别3的工具和技术,框架、模板和类库最终必须调用位于级别2和级别1的API。级别1和级别2提供了SPI和API到操作系统的入口,而且不论如何,操作系统将控制对我们所感兴趣的多个内核的访问。
尽管不是每个编写软件以利用多核计算机的开发人员都会使用级别1和级别2,但是在SDLC中,对这些层如何工作有基本的理解是很重要的。理解这些基础之所以重要,就是因为没有哪个库、框架或工具提供多数应用程序需要的所有服务。此外,这些工具中的大部分必须被混合与协调使用。实际上所有中等规模到大规模的应用软件都是使用多个库的联合来构建的。这些库并不总是线程安全(thread safe)或可感知多核(multicore-aware)的。当发生问题时,软件开发人员至少需要理解在进程和线程管理方面发生了什么事情。图4-1中在级别3和级别4中使用的高级工具必须被配置,配置过程要求人们对其工作原理有基本的理解。在某些情况下,混合和协调会导致产生一些需要解决的冲突。
除此之外,不是所有的高级工具在每种环境中都能够运行。例如,TBB能够在很多基于Intel的处理器上运行,但是在所有主要的非Intel处理器上均不可用。为了使之可用或完全与您的平台兼容,可能会需要进行移植等。多线程和多处理应用程序的本质要求开发人员理解软件、操作系统、处理器及内存之间的基本关系。这在有效处理调试过程、测试过程、最终软件部署中是绝对必须的。高质量、正确、可靠的多处理和多线程应用程序要求开发人员对操作系统的任务有着清楚的理解。
