多线程与多进程 执行效率

1、多线程在单核和多核CPU上的执行效率问题的讨论

多线程在单cpu中其实也是顺序执行的,不过系统可以帮你切换哪个执行而已,其实并没有快(反而慢)。多个cpu的话就可以在多个cpu中同时执行了。单核CPU时使用多线程,通常是有线程要处于等待状态。而对于普通的进度条更新类的,能够简单控制的(比如:在循环里面手动处理消息)就简单控制,一般不使用线程,这样可以提高程序的性能。并且避免掉不必要的线程同步问题。

2为什么有时候线程数超过CPU内核数会更快呢?

原因是这种程序的单个线程运算量不足以占满CPU一个内核(比如存在大量IO操作,IO比较慢,是程序瓶颈)。多线程的用处在于,做某个耗时的操作时,需要等待返回结果,这时用多线程可以提高程序并发程度。如果一个不需要任何等待并且顺序执行能够完成的任务,用多线程简直是浪费。

3、 线程越多越好吗?什么时候才有必要用多线程?

线程必然不是越多越好,线程切换也是要开销的,当你增加一个线程的时候,增加的额外开销要小于该线程能够消除的阻塞时间,这才叫物有所值。

4、多核与多线程

多核指的是CPU有多个核心,多线程是程序有多个线程在同时执行。多核也要用多线程才能发挥优势。同样,多线程要在多核上才能真正有优势。这点来说,对程序员不是透明的。程序员可以控制程序/线程在哪个CPU()上运行。用户也可以控制程序在哪几个核上运行。所以多核,多线程对用户和程序员都不是透明的。程序员必须了解这方面的知识。才能让程序最大限度的发挥机器的性能。


CPU分配时间片策略:

在并发运行中,CPU需要在多个程序之间来回切换,那么如何切换就有一些策略

3.1 先来先服务 - 时间片轮转调度

这个很简单,就是谁先来,就给谁分配时间片运行,缺点是有些紧急的任务要很久才能得到运行。

3.2 优先级调度

每个线程有一个优先级,CPU每次去拿优先级高的运行,优先级低的等等,为了避免等太久,每等一定时间,就给线程提高一个优先级

3.3 最短作业优先

把线程任务量排序,每次拿处理时间短的线程运行,就像我去银行办业务一样,我的事情很快就处理完了,所以让我插队先办完,后面时间长的人先等等,时间长的人就很难得到响应了。

3.4 最高响应比优先

用线程的等待时间除以服务时间,得到响应比,响应比小的优先运行。这样不会造成某些任务一直得不到响应。

3.5 多级反馈队列调度

有多个优先级不同的队列,每个队列里面有多个等待线程。 
CPU每次从优先级高的遍历到低的,取队首的线程运行,运行完了放回队尾,优先级越高,时间片越短,即响应越快,时间片就不是固定的了。
队列内部还是用先来先服务的策略。


你可能感兴趣的:(Java并发)