1、  上下文切换

  单核处理器也支持多线程执行代码,cpu通过给每个线程分配cpu时间片来实现这个机制。时间片是cpu分配给每个线程的时间,时间片非常短,所以cpu通过不停的切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒。

  CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态,所以任务从保存到再加载的过程就是一次上下文切换。

  例子:使用两个线程实现累加操作和使用串行实现累加,在百万级别以下时,两者的效率相似,随着数据量的不断下降,串行效率更高;当数据量达到千万左右及以上时,并行效率更高。

  测试代码性能工具:Lmbench开源工具测试上下文切换的时长;

                                        Vmstat:linux命令,测量上下文切换速度。

   减少上下文切换:无锁并发编程, CAS算法,使用最小线程和使用协程

2、死锁

  死锁的出现会造成业务系统不在提供服务了,可感知;

  避免死锁的方法:

    A.避免一个线程中获取多个锁;

    B、避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源

    C、尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制

    D、对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

3、  资源限制的挑战

  进行并发编程时,程序执行速度受限于计算机硬件资源和软件资源(硬件资源如带宽,软件资源如数据库连接数和socket连接数等),资源的限制可能导致多线程运行比单线程运行速度更加慢;

  解决:由于单机性能一定,无法提高,硬件方面可以进行集群提高处理效率;软件层面使用资源池复用资源。

posted on 2019-06-11 11:19  探路_先锋  阅读(87)  评论(0编辑  收藏  举报
……