有人可以向我解释,当一个核心CPU一次只能做一件事时,多线程应用程序如何更快.如果我有10个线程,那么在单个核心cpu上的任何给定时刻,这些线程中只有一个真正"正在运行",并且所有额外线程只会增加上下文切换开销.因此,如果每个线程有10个指令要处理,那么最后我仍然按顺序处理100个指令加上上下文切换开销.我在这里错过了什么吗?
dka*_*ins 16
关于香蕉的有用类比
想象一下超市有4个结账车道.但只有一个收银员.她应该在单个寄存器上工作还是在所有4个寄存器上工作,在它们之间移动?
显而易见的答案是,她应该留在一个登记册上,以避免浪费时间在结账通道之间移动.
但现在想象一下,当你购买水果时,每个特定类型的水果重新校准可能需要5分钟.
当刻度重新校准并且寄存器被束缚时,突然变得更有效率整体旋转到下一个车道并在那里响起一些物品而不是仅仅等待秤再次准备就绪.
刻度校准是非CPU工作(例如磁盘I/O,网络延迟等).旋转到下一个寄存器正在切换到另一个线程.你有它.
是的,您错过了一个进程可能阻塞等待I/O的事实.因此,如果您在应用程序中仅使用一个THREAD,如果它阻止等待I/O完成,那么它将非常慢.
另一方面,如果您有多个线程,您的应用程序可能会有几个等待I/O完成,但其余的"执行",而OS则允许它访问SINGLE PROCESSOR.
请记住,与CPU操作相比,I/O操作要慢几个数量级.
和肯定.即使在单核中,多线程应用程序也可能比单线程应用程序更快.考虑在单个线程上运行的服务器进程(如APACHE)的情况.每当有连接等待I/O完成时,连接的其余部分将停止等待I/O操作完成.当然有ASYNC-IO.但是,使用像ASYNC-IO在单个线程上运行像Apache这样的庞大服务器的编程模型将太复杂,无法维护,改进或其他任何东西.
| 归档时间: |
|
| 查看次数: |
1111 次 |
| 最近记录: |