有人能给我解释一下,当单核cpu一次只能做一件事时,多线程应用程序是如何变得更快的?如果我有10个线程,那么在任何给定时刻,只有1个线程在单核cpu上真正“运行”,所有额外的线程都会增加上下文切换开销。因此,如果每个线程有10条指令要处理,那么最终我仍然会按顺序处理100条指令,外加上下文切换开销。我是不是漏掉了什么?
发布于 2010-11-13 03:08:12
是的,您忽略了进程可能阻塞以等待I/O的事实。因此,如果您在应用程序中只使用一个线程,如果它阻塞以等待I/O完成,那么它将非常慢。
另一方面,如果您有多个线程,您的应用程序可能会有几个线程等待I/O完成,但其余的线程在操作系统允许其访问单个处理器时“执行”。
请记住,与CPU操作相比,I/O操作要慢几个数量级的。
还有,是的,。即使在单核中,多线程应用程序也可能比单线程应用程序更快。考虑像APACHE这样的服务器进程在单个线程上运行的情况。每当有一个连接等待I/O完成时,连接的其余部分将暂停等待该I/O操作完成。当然还有ASYNC-IO。但是,使用ASYNC-IO使像Apache这样的大型服务器在单线程上运行的编程模型将太复杂,难以维护、改进或其他任何事情。
发布于 2010-11-13 03:24:53
关于香蕉的一个有用的类比
想象一个有4个结账通道的超市。但是只有一个收银员。她应该在单个寄存器上工作,还是在所有4个寄存器上工作,在它们之间移动?
显而易见的答案是,她应该留在一个寄存器上,以避免浪费时间在结账通道之间移动。
但现在想象一下,当你购买水果时,刻度可能需要长达5分钟来重新校准每种特定类型的水果。
当天平正在重新校准和登记时,突然之间,转到下一条车道并在那里响起一些物品,而不是仅仅等待天平再次准备就绪,总体上变得更有效率。
刻度校准是非CPU工作(如磁盘I/O、网络延迟等)。旋转到下一个寄存器就是切换到另一个线程。现在你就知道了。
发布于 2010-11-13 03:12:58
你说得对,它在单核处理器上不会更快。大多数程序一次可以做很多事情。这些操作中的大多数对于处理器来说都是“突发的”。他们做一些事情,等待输入或输出完成,然后做更多的事情。多线程编程允许另一个操作在等待期间使用处理器。记住,所有的处理器基本上都做同样的事情。不同之处在于他们可以进行操作的速度。这样做的目的是让处理器尽可能多地忙于做有用的事情。多线程编程只是一种让程序员更容易实现这一目标的方法。
https://stackoverflow.com/questions/4168137
复制相似问题