一、 上下文切换linux
单核处理器也支持多线程执行代码,cpu经过给每一个线程分配cpu时间片来实现这个机制。时间片是cpu分配给每一个线程的时间,时间片很是短,因此cpu经过不停的切换线程执行,让咱们感受多个线程是同时执行的,时间片通常是几十毫秒。算法
CPU经过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。可是切换前会保存上一个任务的状态,以便下次切换回这个任务时,能够再加载这个任务的状态,因此任务从保存到再加载的过程就是一次上下文切换。数据库
例子:使用两个线程实现累加操做和使用串行实现累加,在百万级别如下时,二者的效率类似,随着数据量的不断降低,串行效率更高;当数据量达到千万左右及以上时,并行效率更高。编程
测试代码性能工具:Lmbench开源工具测试上下文切换的时长;多线程
Vmstat:linux命令,测量上下文切换速度。并发
减小上下文切换:无锁并发编程, CAS算法,使用最小线程和使用协程socket
二、死锁工具
死锁的出现会形成业务系统不在提供服务了,可感知;性能
避免死锁的方法:测试
A.避免一个线程中获取多个锁;
B、避免一个线程在锁内同时占用多个资源,尽可能保证每一个锁只占用一个资源
C、尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制
D、对于数据库锁,加锁和解锁必须在一个数据库链接里,不然会出现解锁失败的状况。
三、 资源限制的挑战
进行并发编程时,程序执行速度受限于计算机硬件资源和软件资源(硬件资源如带宽,软件资源如数据库链接数和socket链接数等),资源的限制可能致使多线程运行比单线程运行速度更加慢;
解决:因为单机性能必定,没法提升,硬件方面能够进行集群提升处理效率;软件层面使用资源池复用资源。