2

我是多线程编程的新手。我一直在阅读一些文章,但我不完全确定两个主要观点。具有单核处理器和多核处理器的单线程代码的多线程代码

  1. 如果我有单线程代码(顺序),并且我在多核处理器上运行它。操作系统将尝试将线程划分为多个线程(同时照顾相关性)以利用多核处理器?
  2. 如果我有一个多线程代码,并在单核处理器上运行它。操作系统是否会在不同线程之间分时分配(与多个进程一样)?
+2

1.没有2.是........ –

+0

我看不出为什么这个问题已收到4个upvotes? 4人有相同的功课? –

+0

相信我,朋友。不是功课。 – KhaledWas

回答

3

1)否

如果应用程序利用的,例如,英特尔数学库和已编译与右开关,像FFT的例程将在运行时被分割出到匹配单独的线程机器中的核心数量。您的源代码仍然是“单线程”,但该库正在创建和销毁背后的线程。类似地,一些编译器(e.h.Intel的icc,Sun的C编译器)可能会将一些循环转变为单独的线程,每个线程处理迭代的一部分。源代码再一次看起来是单线程的,但编译器会代表您生成线程代码。这有点像自动将一些OpenMP应用于源代码。

操作系统无法再猜测应用程序要做什么,因此他们不能这样介入。图书馆和编译器知道即将发生的事情,所以他们可以。

像这样的库和编译技巧已经被开发出来,以便程序员可以从“单一”线程代码中提取更高的性能。在开始迈向多核CPU的同时,英特尔开始在数学库中添加这样的功能。这个想法是(从程序员的角度)创建更好的'单一'线程性能的印象,而速度实际上是由多个内核提供的。与Sun在开始制作多处理器计算机时一样。并且每个人或多或少地放弃对单核的性能进行重大改进,这是未来的必由之路。

2)是的。它会怎么做呢?

+0

感谢您的回答。所以简而言之,单线程可以以某种方式转换为多线程,如你所说。但这不是由操作系统,而是由图书馆和执行者。 – KhaledWas

+0

@KhaledWas正确。在我的回答中,我没有提到I/O框架 - 有很多精心设计的方法可以通过单独的线程来处理I/O,但从程序员的角度来看,这些线程有点隐藏。像Node.JS这样做,.NET中的异步I/O等等。 – bazza

1
  1. 没有,操作系统有没有足够的信息来做到这一点。在并行化中,您需要考虑操作之间的依赖关系。一些编译器试图做到这一点,他们有更多关于代码意图的信息。但即使他们经常无法有效地做到这一点。

  2. 是的,例如Linux调度程序does not even distinguish between threads and processes