并发编程的挑战

一、  上下文切换linux

  单核处理器也支持多线程执行代码,cpu经过给每一个线程分配cpu时间片来实现这个机制。时间片是cpu分配给每一个线程的时间,时间片很是短,因此cpu经过不停的切换线程执行,让咱们感受多个线程是同时执行的,时间片通常是几十毫秒。算法

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

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

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

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

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

二、死锁工具

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

  避免死锁的方法:测试

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

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

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

    D、对于数据库锁,加锁和解锁必须在一个数据库链接里,不然会出现解锁失败的状况。

三、  资源限制的挑战

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

  解决:因为单机性能必定,没法提升,硬件方面能够进行集群提升处理效率;软件层面使用资源池复用资源。

相关文章
相关标签/搜索