在程序中使用并行有两大原因:功能和性能分离,事实上,它是使用并发的唯一理由,其他的你看上去难的可以归结为一个理由。
1.2.1 为功能分离使用并行
写软件时功能分离是一个好主意,把相关的代码放在一起,把不想管的代码分离,你会让你的程序更容易理解和测试,并且会减少bugs,你可以使用并行分离单独的功能,甚至在这些单独的功能同事发生;如果没有并行,你就不得不写一个任务切换的框架或者在一个操作中调用不相关的代码。
考虑到一个处理密集的用户界面程序,比如DVD播放器,这样有两个基础功能的程序:不仅要从实时的从硬盘读取数据,解码,发送到显卡和声卡,准确的显示出来。还要响应用户的输入,比如点击暂停或者回到菜单、甚至推出。在一个线程中,程序必须定时检测用户输入,DVD播放的代码与用户界面的代码会交织在一起。通过使用多线程去分隔不同的功能,DVD播放的代码与用户界面的代码不必非交织在一起。一个线程处理用户界面,另一个线程处理播放,他们会相互作用,比如当点击暂停时,直接作用到相关的任务上。
这会提高用户体验,因为用洁面线程可以立刻响应用户请求,即使这个响应是简单的显示一个繁忙的鼠标或者发送一个请等待的消息。类似的,分离线程经常被用来运行后台程序,比如在一个桌面搜索程序中监视文件系统的改变。使用这种方法使每个线程的逻辑更简单,因为他们的相互作用可以被清晰的标示出来,不同的任务逻辑被分散。
线程数是独立于可用的CPU核心数的,因为分隔线程是基于提高性能的概念设计的。
1.2.2 为性能使用并行
多进程系统已经存在很多年了,但是现在只能在在超级计算机,主流框架和大型服务系统中看到了,但是芯片制造商已经设计出了2,4,16或者更多进程的芯片以提供更好的性能。因此,多核桌面计算机,甚至多核嵌入式设备,越来越普遍。这些计算机性能的提高不是运行一个任务越来越快,而是运行多任务能力越来越高。过去程序员不用做任何努力就能看到他们的程序在新一代的处理器中运行的更快。但是现在,如果软件要运行更快必须设计并行任务。程序员必须谨慎并且把并行添加到他们的工具箱。
有两个方法使用并行提高性能,第一个,把一个任务分隔成几部分去同时执行,这回减少总的运行时间。听起来很简单,但他有时是一个很复杂的过程,因为这几部分之间可能是相互关联的。这种分离的处理方法,一个线程执行一部分计算当另一个线程执行不同的部分时,或者每个线程执行相同的操作在不同的数据上。这被称作数据平行。