在了解多线程与多进程差异之前,我们先讨论一下摩尔定律。想必大家都有所了解,摩尔定律表示,处理器的时钟频率每两年提升一倍。多年来确实是按照这样的规律发展的,但最近开始有了一些变化,时钟频率的提升速度开始减慢。这也预示着,摩尔定律也许即将迎来终点,想想真是很可怕。
计算机制造商应对摩尔定律极限的方法,是通过引入多处理器。多核心架构是目前以及今后市场解决摩尔定律极限的主要策略。如今的工作站通常配备4、8、16、32、64个内核,利用多个内核来提高应用程序性能,保证及时响应,尤其在处理一些常见的高吞吐量工作负载时,如渲染,仿真,机器学习等耗时的高强度计算。
当我们想要最大化利用多个处理器的硬件结构,编写软件时选择正确的架构至关重要。在大多数情况下,我们可以选择多线程或多进程处理,又或者两者兼用。这个选择将影响软件的性能、后期的维护、可扩展性、内存等各方面。任何一种选择都有利弊,但熟悉各个选择,可以帮助我们做出正确的决定。在这篇文章中,我将解释不同应用软件开发选择多内核策略时需要考虑的因素。换句话说,厘清在各种应用场景中多线程与多进程开发的优劣。话不多说,我们直入主题。
多线程开发:优势
多线程最突出的优点是借助变量、对象等,线程之间可以便捷地共享数据,与主线程进行通信也非常容易。
处理不可分割的大型数据集时,多线程开发也将非常有利。因为多进程处理需要复制数据集,导致占用大量时间和内存,同时使用共享内存数据会让软件开发更为复杂。
多线程另一个广为人知的特点是具有许多第三方库(开源和商业)的支持。如今许多数据库通过提供“线程安全”接口来支持多线程应用程序。组件、类、功能等预构建功能为多线程开发提供强大的支持,让开发人员的工作更为轻松,但物无完美……
多线程开发:劣势
多线程代码的主要缺点是,如果其中一个线程崩溃,整个应用程序将连带崩溃。与之相对,多进程中一个进程失败不一定影响其他进程。
另一个缺点是多线程应用程序调试困难。这个问题不容小觑,因为错误难以避免。通常,排错程序不是处理多线程错误的最佳工具,建议使用日志来跟踪错误并找出导致错误的线程(或线程之间的通信)。简单来说,调试时间会相对较长。同时,多线程应用程序需要经验丰富的开发人员进行开发和调试。因此如果团队成员经验不足,新手较多,也需要格外注意。
如果同时执行太多线程,也会出现另一个问题。处理器可能会花费大量时间进行上下文切换,而因此影响实际运行。文件系统占用大量内存块,导致 I\O 瓶颈,最终减慢整个应用程序,造成主机堵塞。
另外,还有内存问题。所有线程都使用相同的进程内存,这对于线程之间的通信是非常有利的。但是,如果每个线程需要更多内存,可