看过一本书,上面说到为什么使用多线程可以提高效率,主要的原因有两个:IO等待和多CPU。
多CPU
显然有多个CPU就可以同时执行多个任务,每个线程就相当于一个任务。
IO等待
假如有一个线程在执行的时候,遇到了磁盘读写或者网络传输阻塞,那么线程就需要等待,这时候占用的CPU就可以释放,然后CPU就可以将时间片分给其他线程,等待这个线程IO等待结束了,CPU再把时间片分给它,这样就可以合理安排CPU时。
如果是计算型的线程,那么计算型线程的个数不要超过CPU的个数,因为计算型线程没有IO等待,会一直运行,那么就会一直占用CPU资源,所以CPU就不会切换去执行其他的线程,这种情况下如果计算型线程数多于CPU个数的话,就没有CPU能够空出来去执行多出来的线程。
我的疑问
是不是并不是一定要有IO阻塞才能利用多线程,比如可以在一个线程的执行方法里面使用sleep,让线程睡眠,也产生了线程等待的效果,这时候CPU就会去执行其他线程,是不是这样?
另外,四种线程同步的方式(临界区、互斥对象、事件对象、信号量),比如线程在等待事件对象的时候,CPU是会一直执行这个线程还是在这个等待的时间去执行其他的线程?其他的几种线程同步方式,CPU是怎么分配时间片的?
不一定非得有 IO 阻塞才能用多线程,也不用 sleep 就可以让 CPU 去执行别的线程。
即使全是计算任务,操作系统也会照顾所有线程的,尽量不会让一个线程饿死。
因同步而发生等待时,一般会主动触发线程调度,所以 CPU 可能会在某个线程等待的时候去执行其他线程。
有些“锁”,比如自旋锁,是采用忙等的方式进行同步的,这种锁在等待的时候可能就不主动触发线程调度,而只能等时间片用完之后再进行线程调度了。