九、性能与可伸缩性

线程的最主要目的是提高程序的运行性能e。线程可以使程序更加充分地发挥系统的可用 处理能力,从而提高系统的资源利用率。此外,线程还可以使程序在运行现有任务的情况下立 即开始处理新的任务,从而提髙系统的响应性。

一、对性能的考虑

提升性能意味着用更少的资源做更多的事情。“资源”的含义很广。对于一个给定的操作, 通常会缺乏某种特定的资源,例如CPU时钟周期、内存、网络带宽、I/O带宽、数据库请求、 磁盘空间以及其他资源。当操作性能由于某种特定的资源而受到限制时,我们通常将该操作称为资源密集型的操作,例如,CPU密集型、数据库密集型等。
尽管使用多个线程的目标是提升整体性能,但与单线程的方法相比,使用多个线程总会引 入一些额外的性能开销。造成这些开销的操作包括:线程之间的协调(例如加锁、触发信号以 及内存同步等),增加的h下文切换,线程的创建和销毁,以及线程的调度等。如果过度地使 用线程,那么这些开销甚至会超过由于提髙吞吐量、响应性或者计算能力所带来的性能提升。 另一方面,一个并发设计很糟糕的应用程序,其性能甚至比实现相同功能的串行程序的性能还 要差。
要想通过并发来获得更好的性能,需要努力做好两件事情:更有效地利用现有处理咨源. 以及在出现新的处理资源时使程序尽可能地剌用这些新咨源。从性能监视的视角来看,CPU需要尽可能保持忙碌状态。(当然,这并不意味着将CPU时钟周期浪费在一些无用的计算上,而是执行一些有用的工作。)如果程序是计算密集型的,那么可以通过增加处理器来提髙性能。 因为如果程序无法使现有的处理器保持忙碌状态,那么增加再多的处理器也无济于事。通过将 应用程序分解到多个线程上执行,使得每个处理器都执行一些工作,从而使所有CPU都保持忙碌状态。

  • 性能与可伸缩性

应用程序的性能可以采用多个指标来衡量,例如服务时间、延迟时间、吞吐率、效率、可 伸缩性以及容量等。其中一些指标(服务时间、箠待时间)用于衡量程序的“运行速度”,即 某个指定的任务单元需要“多快”才能处理完成。另一些指标(生产量、吞吐量)用于程序的 “处理能力”,即在计算资源一定的情况下,能完成“多少”工作。
可伸缩性指的是:当增加计算资/源时(例如CPU、内存、存储容量或I/O带宽),程序的呑吐量或者处理能力相应都增加。

  • 评估性能权衡因素

在几乎所有的工程决策中都会涉及某些形式的权衡。在建设桥梁时,使用更粗的钢筋可以 提髙桥的负载能力和安全性,但同时也会提高建造成本。尽管在软件工程的决策中通常不会涉 及资金以及人身安全,但在做出正确的权衡时通常会缺少相应的信息。例如,“快速排序”算 法在大规模数据集上的执行效率非常髙,但对于小规模的数据集来说,“冒泡排序”实际上更 高效。如果要实现一个高效的排序算法,那么需要知道被处理数据集的大小,还有衡量优化的 指标,包括:平均计算时间、最差时间、可预知性。然而,编写某个库中排序算法的开发人员 通常无法知道这些需求信息。这就是为什么大多数优化措施都不成熟的原因之一:它们通常无 法获得一组明确的需求。
避免木成熟的优化。首先使程序正确〆然后再提高运行速度——如果它还运行得不够快。

二、Amdahl 定律

在有些问题中,如果可用资源越多,那么问题的解决速度就越快。例如,如果参与收割庄 稼的工人越多,那么就能越快地完成收割工作。而有些任务本质上是串行的,例如,即使增加 再多的工人也不可能增加作物的生长速度。如果使用线程主要是为了发挥多个处理器的处理能 力,那么就必须对问题进行合理的并行分解,并使得程序能有效地使用这种潜在的并行能力。
大多数并发程序都与农业耕作有着许多相似之处,它们都是由一系列的并行工作和串行工 作组成的。Amdahl定律描述的是:在增加计算资源的情况下,程序在理论上能够实现最髙加 速比,这个值取决于程序中可并行组件与串行组伴所占的比重。假定F是必须被串行执行的部 ^那么根据Amdahl定律,基包含汉个处理机器中,最高的加速比为:

加速比 <= 1/(F+(1-F)/N)

当N趋近无穷大时,最大的加速比趋近于1/F。因此,如果程序有50%的计算需要串行执 行,那么最髙的加速比只能是2 (而不管有多少个线程可用);如果在程序中有10%的计算需要 串行执行,那么最高的加速比将接近10。Amdahl定律还量化了串行化的效率开销。在拥有10 个处理器的系统中,如果程序中有10%的部分需要串行执行,那么最髙的加速比为5.3 (53% 的使用率),在拥有100个处理器的系统中,加速比可以达到9.2 (9%的使用率)。即使拥有无限多的CPU,加速比也不可能为10。

三、线程引入的开销

单线程程序既不存在线程调度,也不存在同步开销,而且不需要使用锁来保证数据结构的
一致性。在多个线程的调度和协调过程中都需要一定的性能开销:对于为了提升性能而引入的
线程来说,并行带来的性能提升必须超过并发导致的开销。

  • 上下文切换

如果主线程是唯一的线程,那么它基本上不会祯调度出去。另一方面,如果可运行的线程 数大于CPU的数量,那么操作系统最终会将某个正在运行的线程调度出来,从而使其他线程能 够使用CPU。这将导致一次上下文切换,在这个过程中将保存当前运行线程的执行上下文,并 将新调度进来的线程的执行上下文设置为当前上下文。

  • 内存同步

同步操作的性能开销包括多个方面。在synchronized和volatile提供的可见性保证中可能 会使用一些特殊指令,即内存栅栏(Memory Barrier)。内存栅栏可以刷新缓存,使缓存无效, 刷新硬件的写缓冲,以及停止执行管道。内存栅栏可能同样会对性能带来间接的影响,因为它 们将抑制一些编译器优化操作。在内存栅栏中,大多数操作都是不能被重排序的。

  • 阻塞

当线程无法获取某个锁或者由于在某个条件等待或在I/O操作上阻塞时,需要被挂起,在 这个过程中将包含两次额外的上下文切换,以及所有必要的操作系统操作和缓存操作:被阻塞 的线程在其执行时间片还未用完之前就被交换出去,而在随后当要获取的锁或者其他资源可用 时,又再次被切换回来。(由于锁竞争而导致阻塞时,线程在持有锁时将存在一定的开销:当它 释放锁时,必须告诉操作系统恢复运行阻塞的线程。)

四、减少锁的竞争

在并发程序中,对可伸缩性的最主要威胁就是独占方式的资源锁。
有三种方式可以降低锁的竞争程度:

  • 减少锁的持有时间。
  • 降低锁的请求频率。
  • 使用带有协调机制的独占锁,这些机制允许更高的并发性。
  • 缩小锁的范围
  • 减少锁的粒度

另一种减小锁的持有时间的方式是降低线程请求锁的频率(从而减小发生竞争的可能性)。 这可以通过锁分解和锁分段等技术来实现,在这些技术中将采用多个相互独立的锁来保护独立 的状态变量,从而改变这些变量在之前由单个锁来保护的情况。这些技术能减小锁操作的粒 度,并能实现更高的可伸缩性,然而,使用的锁越多,那么发生死锁的风险也就越高。

  • 锁分段

  • 避免热点域

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书香水墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值