【Java】上下文切换笔记

线程池优化根据?多线程效率高还是单线程效率高?

对于这个问题,首先考虑有多少个用户,如果用户量很少的话,单线程不一定比并发线程效率差,甚至有可能要高于并发线程效率执行时间。如果是百万级以上,多线程效率是远远高于单线程的,那为何用户量少的时候,单线程有时候比多线程效率高呢?这里面需要考虑一个因素:上下文切换。

上下文切换,有时也称做进程切换或任务切换,是指CPU从一个进程或线程切换到另一个进程或线程。

在上下文切换过程中,CPU会停止处理当前运行的程序,并保存当前程序运行的具体位置以便之后继续运行。从这个角度来看,上下文切换有点像我们同时阅读几本书,在来回切换书本的同时我们需要记住每本书当前读到的页码。在程序中,上下文切换过程中的“页码”信息是保存在进程控制块(PCB)中的。PCB还经常被称作“切换帧”(switchframe)。“页码”信息会一直保存到CPU的内存中,直到他们被再次使用。

测试工具:

Lmbench3可以测试上下文切换的时长

vmstat可以测量上下文切换的次数

说明:CS(Content Switch)表示上下文切换的次数

如何减少上下文切换:

1.无锁并发编程:多线程竞争锁会引起上下文切换,可以用一些办法来避免使用锁

2.CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁

3.使用最少线程:避免创建不需要的线程。

4.协程:单线程实现多任务的调度,在单个线程里面维持多任务的切换。

减少上下文切换思考:

上下文切换又分为2种:让步式上下文切换和抢占式上下文切换。前者是指执行线程主动释放CPU,与锁竞争严重程度成正比,可通过减少锁竞争来避免;后者是指线程因分配的时间片用尽而被迫放弃CPU或者被其他优先级更高的线程所抢占,一般由于线程数大于CPU可用核心数引起,可通过调整线程数,适当减少线程数来避免。具体来说就是调整线程池里面线程的数目来优化。

线程池的关键点是:1、尽量减少线程切换和管理的开支; 2、最大化利用cpu。 对于1,要求线程数尽量少,这样可以减少线程切换和管理的开支; 对于2,要求尽量多的线程,以保证CPU资源最大化的利用。

所以对于任务耗时短的情况,要求线程尽量少,如果线程太多,有可能出现线程切换和管理的时间,大于任务执行的时间,那效率就低了; 对于耗时长的任务,要分是cpu任务,还是io等类型的任务。如果是cpu类型的任务,线程数不宜太多;但是如果是io类型的任务,线程多一些更好,可以更充分利用cpu。 所以: 高并发,低耗时的情况:建议少线程,只要满足并发即可;例如并发100,线程池可能设置为10就可以 低并发,高耗时的情况:建议多线程,保证有空闲线程,接受新的任务;例如并发10,线程池可能就要设置为20; 高并发高耗时:1要分析任务类型,2增加排队,3、加大线程数

参考文章:《Java并发编程的艺术》 

                   http://ifeve.com/question/如何减少上下文切换?/




知行办公,专业移动办公平台 https://zx.naton.cn/

原创团队
【总监】十二春秋之,[email protected]
【Master】zelo,[email protected];【运营】运维 艄公 [email protected]
【产品设计】流浪猫,[email protected];【体验设计】兜兜,[email protected]
【iOS】淘码小工,[email protected];iMcG33K,[email protected]
【Android】人猿居士,[email protected] 思路的顿悟,[email protected]
【java】首席工程师MR_W,[email protected];【测试】 土镜问道,[email protected]
【数据】fox009521,[email protected];【安全】保密,你懂的。


你可能感兴趣的:(JAVA)