我刚刚购买了一台价值低于1,000美元的新笔记本电脑,其中一款主要面向消费者,非开发商市场,并且从规格上看,它惊讶地发现它标配双核处理器。
这引出了一个问题:随着多核机器成为常态,再次编写单线程应用程序 是否正确?
除了可以合理地预期完全适合运行最弱系统的单个处理器的单个核心的简单应用程序之外,在所有一个线程中运行的应用程序将被现代操作系统的方式严重降级如果应用程序没有给出关于如何优化这种拆分的指导,那么将它们的执行分布在核心上?
答案 0 :(得分:52)
由于线程化总是会给应用程序带来额外的复杂性,我相信单线程应用程序总会占有一席之地。
即使单核处理器完全过时,单线程编程也不会消失。
双核,特别是在消费市场,非常适合多任务处理。如果每个应用程序占用每个处理器核心,我们可能会遇到与单核处理器相同的问题。
我说不要疯了,开始多元化。 除非有充分理由,否则请将其保留在一个帖子中。
答案 1 :(得分:45)
除非应用程序需要是多线程的,否则不应该是多线程的。
仅仅因为你可以多线程并不意味着你应该。多核/处理器并没有真正改变这一事实。
答案 2 :(得分:4)
多线程应用程序编写和维护起来要困难得多。我认为,由于硬件的进步,以及技术堆栈的进步,你将开始看到更多利用多线程的应用程序。
Microsoft有一组扩展,我相信它们被添加到运行时称为“Parallels”?我知道他们称之为LINQ启用版PLINQ。本质上,它试图从多线程算法中删除许多容易出错的管道。
然而,只有时间告诉我,我还会打赌仍有大量的单线程应用程序,因为它们不会算法证明启动线程的性能成本是合理的。
答案 3 :(得分:4)
...如果应用程序没有就如何优化这种拆分提供指导,那么现代操作系统在内核中执行操作的方式会严重降低在所有一个线程中运行的应用程序吗?
不,它仍然可以像在单核CPU上运行一样运行。
答案 4 :(得分:4)
硬件并没有真正改变特定应用程序中的任何任务将阻止或不阻塞的事实,而这实际上决定了您是否应该使用多线程。
然而,现代编程语言正在添加新功能,以使程序员更容易,更安全地实现线程化应用程序。例如Cocoa有NSOperationQueue,它抽象了工作线程模型,OS X的下一个版本还有更多改进。除了使实现简单的线程模型更容易之外,NSOperationQueue还以总数的方式管理线程线程的数量适合于处理器和内核的数量,因此如果您的应用程序使用大量线程,则可以获得一些非常显着的速度增加,而无需额外的工作。
答案 5 :(得分:2)
明确地说,并行编程将在未来取得很大进展,因为CPU不再会变得更快,我们只会有很多。拥有双核或四核只是一个开始,在不久的将来会有更多处理器的系统(目前有256核的CPU,Windows 7将支持这些处理器)。
但是,我认为并行性不适合解决任何问题,它需要不同的编程风格。使用当前技术,多线程为应用程序增加了相当高的复杂性。因此,功能编程以及支持并行化的库/编译器等范例将来会变得越来越重要。
David Callahan在MSDN杂志上发表了一篇有关并行编程设计考虑转变的有趣文章:Paradigm Shift: Design Considerations For Parallel Programming答案 6 :(得分:2)
为用户利益而不是程序员宣传多个核心。用户将被告知具有多个核心意味着他们可以同时运行多个复杂的应用程序,例如,在Excel中更新大型电子表格并查看Powerpoint演示文稿等。
显然,作为开发人员,您可以充分利用额外的内核;大多数视频编辑软件包在多核机器上的运行速度要快得多。
如果您正在编写一个可以从使用更多内核中获益的应用程序,那么投入额外的开发时间可能是值得的,因为大多数新机器现在拥有多个内核,但一如既往地考虑投资回报率。
答案 7 :(得分:2)
多线程编程目前有些困难,容易出错,而且难以测试(对竞争条件进行测试并不容易)。因此,当优势克服缺点时,应该保留它。
许多程序运行速度足以满足几乎所有目的,并且不需要任何性能提升。有些需要一段时间,但由于不真正涉及CPU的原因而且不会被多线程改进。对于这些,使用多个线程使得它们更难开发而不帮助最终用户。
与此同时,多核可以在没有多线程的情况下使用。大多数操作系统都有多个进程(监视,后台管理,病毒,间谍软件,垃圾邮件等),允许这些进程在另一个核心上运行可以释放一个用户代码。
答案 8 :(得分:1)
通常在性能优化方面;你无法对任意应用程序的某些内容是否“足够”做出通用陈述。问题是,对于应用程序X,它是否“足够高效”。
然而,或许更重要的是要继续看到摩尔定律的好处,它不再使处理器更快,而是使它们更小(因此芯片上的内核更多)应用程序必须变成多线程。
但是,构建多线程应用程序(工程,测试,支持)的成本仍然很高,因此除非您需要性能,否则不应该这样做。我认为,对于使用一些不同的库以及函数式编程和优化编译器等多线程编程进行多线程编程的一些更简单的方法,所以我认为随着我们继续向多核世界过渡,这将变得更容易。 / p>
答案 9 :(得分:0)
你的问题的答案很棘手,因为它要求我们推测未来的发展。您的问题的简单答案是:
不,单线程是多线程的基础,没有另一个线程就不能拥有。因此,单线程应用程序的容量将始终存在,并且无疑将在未来几年内编写它们。
复杂的答案如下: 计算机具有双核处理器标准的原因是因为它是处理器开发的下一步。虽然许多应用程序不会立即利用双核,但有些人会这样做。因此,像英特尔这样的公司必须能够容纳或被竞争对手压制。
除此之外,还有直接的优势。更大的可寻址内存空间。操作系统本身已经为双重操作系统进行了优化,也可以立即获益。
另外:如果您有一个针对双核处理器优化的库,则所有后续开发都将从中受益。一个例子是搜索和排序算法(由于数据的可分性而导致的“线程拆分”的一个nartural选择),可以针对双核进行优化,然后在具体情况下使用它。
答案 10 :(得分:0)
让我们面对大多数应用程序是为业务编写的,它们访问数据库并允许查看,编辑和追加数据。然后可能会有一些数据分析报告等等。
除了单独的UI线程之外,如果数据库查询需要一段时间,则很少有理由对其进行线程处理,因为增益将是小数并且最终用户基本上不会注意到。可能有一些情况下,并行循环可能会使应用程序受益。
我认为目前多核的真正好处是多个应用程序同时访问不同的核心。试想一下windows在后台运行了多少个进程,这些进程可以在任意数量的内核中同时运行。
答案 11 :(得分:0)
也许这个问题应该重新制定为:“正在运行一个只有核心技术的程序”。这将使它更加普遍。如果你看一下最近添加到firefox 3.5和其他主流浏览器的web工作者,那么他们确实支持多个核心,但是使用进程和消息传递。比线程更安全的方法。最后,这一切都取决于手头的问题。如果手头的问题是CPU限制的话,使用多个内核确实只会产生影响。
我还想补充一点,您的应用程序可能不是计算机上唯一正在运行的进程(提示)。
答案 12 :(得分:0)
在没有多线程的情况下使用多个处理器的好方法:
cat data.txt | sed 's/,/ /g' | awk '{print $4}' | gzip > foo.txt.gz
这是否可以回答您关于天气的问题双核意味着所有应用都应该是多线程的?理论上上面可以使3个CPU饱和。 (不包括猫,只使用它,因为这使得线条更具可读性)