
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
高并发编程开发是目前大多数软件编程开发程序员都在学习和使用的一种编程开发方式,而本文我们就通过案例分析来简单了解一下,高并发编程开发基础概念分享。
并发级别
分为阻塞和非阻塞(非阻塞分为无障碍、无锁、无等待)
阻塞
当一个线程进入临界区后,其他线程必须等待
无障碍
无障碍是一种弱的非阻塞调度
可自由出入临界区
无竞争时,有限步内完成操作
有竞争时,回滚数据
和非阻塞调度相比呢,阻塞调度是一种悲观的策略,它会认为说一起修改数据是很有可能把数据改坏的。而非阻塞调度呢,是一种乐观的策略,它认为大家修改数据未必把数据改坏。但是它是一种宽进严出的策略,当它发现一个进程在临界区内发生了数据竞争,产生了冲突,那么无障碍的调度方式则会回滚这条数据。
在这个无障碍的调度方式当中,所有的线程都相当于在拿去一个系统当前的一个快照。他们一直会尝试拿去的快照是有效的为止。
无锁
是无障碍的
保证有一个线程可以胜出与无障碍相比,无障碍并不保证有竞争时一定能完成操作,因为如果它发现每次操作都会产生冲突,那它则会不停地尝试。如果临界区内的线程互相干扰,则会导致所有的线程会卡死在临界区,那么系统性能则会有很大的影响。
而无锁增加了一个新的条件,保证每次竞争有一个线程可以胜出,则解决了无障碍的问题。至少保证了所有线程都顺利执行下去。
无锁的
要求所有的线程都必须在有限步内完成
无饥饿的
无等待的前提是无锁的基础上的,无锁它只保证了临界区肯定有进也有出,但是如果进的优先级都很高,那么临界区内的某些优先级低的线程可能发生饥饿,一直出不了临界区。那么无等待解决了这个问题,它保证所有的线程都必须在有限步内完成,自然是无饥饿的。
无等待是并行的高级别,它能使这个系统达到优状态。无等待的案例:只有读线程,没有写线程,那么这个则必然是无等待的。如果既有读线程又有写线程,而每个写线程之前,都把数据拷贝一份副本,然后修改这个副本,而不是修改原始数据,因为修改副本,则没有冲突,那么这个修改的过程也是无等待的。后需要做同步的只是将写完的数据覆盖原始数据。由于无等待要求比较高,实现起来比较困难,所以无锁使用得会更加广泛一些。
关于并行的2个重要定律
两个定律都与加速比有关
阿姆达尔定律
Amdahl定律(阿姆达尔定律):定义了串行系统并行化后的加速比的计算公式和理论上限(加速比=优化前系统耗时/优化后系统耗时)**一个程序(或者一个算法)可以按照是否可以被并行化分为下面两个部分:
可以被并行化的部分
不可以被并行化的部
假设一个程序处理磁盘上的文件。这个程序的一小部分用来扫描路径和在内存中创建文件目录。做完这些后,每个文件交个一个单独的线程去处理。扫描路径和创建文件目录的部分不可以被并行化,不过处理文件的过程可以。
增加CPU处理器的数量并不一定能起到有效的作用,提高系统内可并行化的模块比重,合理增加并行处理器数量,才能以小的投入,得到大的加速比
古斯塔夫森定律
Gustafson定律(古斯塔夫森):说明处理器个数,串行比例和加速比之间的关系
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。