良好的并发性不仅需要在应用程序中抛出几个线程并希望达到最佳状态,还需要更多。从令人尴尬的并行到纯顺序,程序并发的方式有很多。任何给定的程序都可以使用阿姆达尔定律来表达问题或算法的可扩展性。令人尴尬的并行应用程序的几个条件是:
- 没有共享状态,每个函数仅取决于传入的参数
- 无法访问物理设备(图形卡,硬盘驱动器等)
还有其他条件,但仅凭这两个条件,我们就能理解为什么特别是游戏不像您想的那样利用多核优势那么容易。首先,将要共享的世界模型必须共享,因为不同的功能可以计算物理,运动,应用人工智能等。其次,该游戏模型的每一帧都必须使用图形卡在屏幕上进行渲染。
公平地说,许多游戏制造商都使用第三方生产的游戏引擎。花费了一段时间,但是这些第三方游戏引擎现在比以前更加并行。
在处理有效的并发方面存在更大的架构挑战
并发可以采用多种形式,从后台运行任务到对并发的完整体系结构支持。某些语言为您提供了非常强大的并发功能,例如ERLANG,但它要求您对构建应用程序的方式进行不同的思考。
并非每个程序都真正需要完整的多核支持的复杂性。这样的示例之一是税务软件或任何表单驱动的应用程序。当您大部分时间都花在等待用户做某事上时,多线程应用程序的复杂性就没那么有用了。
一些应用程序使自己可以使用更尴尬的并行解决方案,例如Web应用程序。在这种情况下,平台以令人尴尬的方式并行启动,这取决于您不必强加线程争用。
底线:
并非所有应用程序都没有充分利用多个线程(因此没有内核)而受到真正的伤害。对于那些受此影响的应用程序,有时计算对并行处理不友好,或者协调起来的开销会使应用程序更加脆弱。不幸的是,并行处理仍然不如要做的好。