CPU-bound(计算密集型) 和IO bound(IO密集型)
I/O bound指的是系统CPU效能相对硬盘和内存好很多,此时大部分CPU在等io的读写,此时CPU Loading不高。
CPU bound指的是系统的硬盘和内存的性能,相对于CPU的性能要好很多,此时系统运作CPU Loading 100% ,CPU要读写,I/O在很短时间完成,而CPU还有很多运算要处理,CPU Loading很高。
- 大部分时间用来做计算和逻辑判断等CPU动作的程序称之为CPU bound。例如计算圆周率,在执行过程中绝大部分时间用在三角函数和开根号的计算,便是CPU bound程序
CPU bound的程序一般而言CPU占用率相当高。这可能是因为任务本身不太需要访问I/O设备,也可能是因为程序是多线程实现因此屏蔽掉了等待I/O的时间。
而I/O bound的程序一般在达到性能极限时,CPU占用率仍然较低。这可能是因为任务本身需要大量I/O操作,而pipeline(管道通信)做得不是很好,没有充分利用处理器能力
;还可能是因为数据局部性不是很好,导致较多page error,结果产生了大量disk I/O的开销。
==如何分辨到底是CPU还是IO bound?==
进程vs线程
如果用多进程实现Master-Worker,主进程就是Master,其他进程就是Worker。
-
如果用多线程实现Master-Worker,主线程就是Master,其他线程就是Worker。
- 多进程优缺点
多进程模式最大的优点就是稳定性高,因为一个子进程崩溃了,不会影响主进程和其他子进程。当然主进程挂了所有进程就全挂了,但是Master进程只负责分配任务,挂掉的概率低)著名的Apache最早就是采用多进程模式。多进程模式的缺点是创建进程的代价大,在Unix/Linux系统下,用fork调用还行,在Windows下创建进程开销巨大。另外,操作系统能同时运行的进程数也是有限的,在内存和CPU的限制下,如果有几千个进程同时运行,操作系统连调度都会成问题。
- 多线程优缺点
多线程模式通常比多进程快一点,但是也快不到哪去,而且,多线程模式致命的缺点就是任何一个线程挂掉都可能直接造成整个进程崩溃,因为所有线程共享进程的内存。在Windows上,如果一个线程执行的代码出了问题,你经常可以看到这样的提示:“该程序执行了非法操作,即将关闭”,其实往往是某个线程出了问题,但是操作系统会强制结束整个进程。 在Windows下,多线程的效率比多进程要高,所以微软的IIS服务器默认采用多线程模式。由于多线程存在稳定性的问题,IIS的稳定性就不如Apache。为了缓解这个问题,IIS和Apache现在又有多进程+多线程的混合模式,真是把问题越搞越复杂。