2012-04-11 87 views
11

我对单线程和多线程编程之间的差异存在误解,所以我想要回答下面的问题以使一切都清楚。误解单线程和多线程编程之间的差异

假设有9个独立的任务,我想用一个单线程程序和一个多线程程序完成它们。基本上,它会是这样的:

单线程:

- Execute task 1 
- Execute task 2 
- Execute task 3 
- Execute task 4 
- Execute task 5 
- Execute task 6 
- Execute task 7 
- Execute task 8 
- Execute task 9 

多线程:

线程1:

- Execute task 1 
- Execute task 2 
- Execute task 3 

线程2:

- Execute task 4 
- Execute task 5 
- Execute task 6 

Thread3:

- Execute task 7 
- Execute task 8 
- Execute task 9 

据我所知,只有ONE线程在同一时间(让CPU)来执行,一旦量子结束后,线程调度会给另一个线程提供CPU时间。

那么,哪个程序会早些完成?它是多线程程序(逻辑上)?或者它是单线程程序(因为多线程有很多上下文切换需要一些时间)?为什么?我需要一个很好的解释:)

+2

'哪个程序会早点完成?答案:它取决于 – 2012-04-11 17:10:12

+0

即使在单个CPU上也会异步发生许多事情:内存读取,磁盘I/O,网络I/O ......在“强制超时”期间,上下文切换通常会优先发生。无论如何,现在谁真的只有一个CPU? – 2012-04-11 17:10:47

+0

这个问题目前的形式是无法回答的。这些任务是相互独立的,还是依赖于早期任务的结果?有多少个CPU /内核可用?任务处理器是绑定的还是I/O绑定的?在并行性(多CPU /内核,处理器绑定,独立任务)的理想情况下,多线程版本可能会更快。但也许不是。 – dlev 2012-04-11 17:12:04

回答

17

这取决于。

你有多少个cpus?你的任务涉及多少I/O?

如果您只有1个CPU,并且任务没有阻塞I/O,那么单线程将完成等于或快于多线程,因为切换线程会产生开销。

如果您有1个cpu,但任务涉及大量阻塞I/O,则可能会看到使用线程加速,假设在I/O正在进行时可以完成工作。

如果您有多个cpus,那么您应该看到单线程上的多线程实现的加速,因为可以并行执行多个线程。除非这些任务是I/O占主导地位,在这种情况下,限制因素是您的设备速度,而不是CPU功耗。

+0

如果你有1个cpu,但是任务涉及很多阻塞I/O,将会有很大的加速,因为所有九个任务都可能在完成IO发出信号时获得一些CPU。 – 2012-04-11 17:51:29

+1

通过cpus你真的是指核心?大多数电脑都有一个CPU,但CPU有多个核心。 – Guffa 2012-04-11 17:54:59

+0

是[15个字符] – hvgotcodes 2012-04-11 17:55:50

6

据我所知,只有一个线程将在同一时间

这将是,如果CPU只有一个核心的情况下执行。现代CPU有多个内核,可以并行运行多个线程。

运行三个线程的程序运行速度将快三倍。即使任务是独立的,计算机中仍有一些资源必须在线程之间共享,如内存访问。

2

嗯,这不完全是语言不可知的。一些解释性编程语言不支持真正的线程。也就是说,执行线程可以由程序定义,但解释器是单线程的,所以所有的执行都在CPU的一个核心上。

对于支持真正多线程的编译语言和语言,单个CPU可以有多个内核。实际上,大多数台式电脑现在有2个或4个内核。因此,执行真正独立任务的多线程程序可以根据CPU中可用内核的数量快两到四倍。

+0

任务很少真正独立。根据我的经验,通常最终发生的事情是,您的代码不再像CPU一样使用单个线程和/或核心,而是现在可能会被I/O绑定。你投入四核的努力常常被浪费掉。这一课很难学到。 – 2014-04-15 18:30:43

+1

@ A-B-B,你是对的。确保并发计算足够复杂以证明开销也很重要。但是,就IO而言,假设有一个IO密集型任务。这个任务仍然会受益于多线程,因为一个线程可以在另一个线程正在使用通信总线的同时进行计算。最后,还有专门的架构设计可以执行高效的并行IO。 – 2014-04-16 03:28:54

2

假设集: 单核心,没有超线程; 任务受CPU限制; 每个任务需要3个量子时间;每个调度器分配被限制为1个量子时间; FIFO调度程序非抢先; 所有线程同时触发调度程序; 所有上下文切换需要相同的时间量;

  • 测试1::单的方法,单个线程(包含所有9个任务)
  • 试验2:

    过程如下圈定单一过程,三个线程(包含各3个任务)

  • 试验3:三个过程,每个单线程(包含各3个任务)
  • 测试4:三个过程,每个具有三个线程(包含每一个任务)

有了上述假设,他们都在同一时间完成。这是因为为CPU预留了一定量的时间,上下文切换是标准化的,没有中断处理,并且没有任何内容正在等待IO。

欲了解更多有关这种性质的深入,请找到this book