首页 > 其他 > 详细

并发编程的挑战

时间:2019-06-11 13:25:36      阅读:102      评论:0      收藏:0      [点我收藏+]

1、  上下文切换

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

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

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

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

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

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

2、死锁

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

  避免死锁的方法:

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

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

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

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

3、  资源限制的挑战

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

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

并发编程的挑战

原文:https://www.cnblogs.com/tlxf-blog/p/11002515.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!