当前位置: 首页 > 网络应用技术

如何开始并发编程?看这篇文章

时间:2023-03-06 12:07:49 网络应用技术

  并发编程的目的是使程序更快地运行速度,但不是要启动更多线程以使程序最大化并发执行。执行并发编程时,如果您想执行多线程任务以使程序更快地运行速度,您将面临许多挑战,例如上下文切换问题,死锁的问题以及受硬件和软件限制的资源限制问题。本文介绍了一些并行编程的挑战和解决方案。

  即使是单个核心处理器也支持多线程执行代码,CPU通过将CPU时间芯片分配给每个线程来实现此机制。时间胶片是将CPU分配给每个线程的时间。由于时间胶片非常短,因此所有CPU都是通过不断切换线程执行的,这使我们感到多个线程同时执行。时间膜通常是数十毫秒(MS)。

  CPU通过时间膜分配算法执行任务。执行时间胶片后,当前的任务将切换到下一个任务。。

  这就像在我们的同事中读两本书。当我们阅读英语技术书时,我发现一个单词不知道,所以我打开了中文和英语词典,但是在放下英语技术书之前,大脑必须先记住这本书。这本书?检查单词后,您可以继续阅读本英语技术书籍。更换会影响阅读效率,相同推理上下文的切换也会影响多线程执行的速度。

  以下代码演示串行和并发执行和累积操作时间,比串行执行更快地分析并发执行?

  时间统计

  1555,1023,100万,近1,87,近15454,近1,5454,近1,514508。从上表可以看出。当并发执行的累积操作少于一百万次时,速度将在串行执行中累积。操作应慢。在这种情况下,同时执行的速度比串行执行速度慢?这是因为创建的时间上空的时间是线程和上下文切换的时间远大于简单计算的时间开销。

  测试工具:

  VMSTAT参数的含义:

  r表示运行队列(即,实际分配了多少个进程)b表示已使用了阻止过程SWPD虚拟内存。如果大于0,则意味着您的机器物理内存不足。然后,您应该升级内存或迁移消耗任务到其他机器。目录中的内容是什么,权限的缓存缓存等。用于记住我们打开的文件,并且文件从磁盘中读取到文件的虚拟内存中。如果此值大于0,则表示该文件物理内存不足或内存泄漏。找到消耗存储器过程,以求解每秒的SO虚拟内存的大小。这里的块设备是指系统上的所有磁盘和其他块。默认的块大小为1024 byte.bi和bo通常接近0,否则IO太常见了。您需要调整每秒CPU中断的数量,包括时间中断CS。切换每秒的次数。例如,io操作经常wt wt等待io cpu时间

  CS(内容开关)表示上下文切换的次数。从上面可以看出,上下文切换每秒超过1000次。

  减少上下文开关的方法是面向锁定的编程,CAS算法,最小线程和使用Coroutine。

  此示例简单地说明了如何减少线程池中大量等待线程以减少上下文切换时间的数量。(本文在Windows环境中进行了测试)

  编写一个模拟等待情况的代码:

  结果:

  1216

  12176 elleotemavenserver36

  18052 TREEDPOOLDUMPTPT

  18084发射器

  15800 JPS

  发现等待状态有300个线程

  在此处的示例中,我们将线程池的固定尺寸修改为10:

  再次出现在转储快照分析线程操作中,我发现只有10个线程在等待:

  在上面的简单情况下,等待线程减少了,并且系统的上下文切换的数量将减少,因为每次从等待到运行,都会执行上下文开关。在实际开发中,我们不做这样的看似低级别的操作,但是样本可以为我们提供在代理线程池的各个方面和编程线程优化的各个方面解决问题的想法。

  锁定是一个非常有用的工具,并且有很多场景,因为它非常简单易懂。一旦发生僵局,系统函数将无法使用。

  以下说明了导致僵局的代码使线程T1和线程T2互相释放锁。

  该代码展示了一个简单的僵局场景。实际上,每个人都不会编写这样的代码。但是,在一些更复杂的情况下,您可能会遇到此类问题。例如,在T1获取锁后,一些异常尚未发布锁(例如死周期)或T1获取数据库锁定,并且当发布锁定锁定时会抛出异常。

  实际上,一旦出现了一个死锁,就可以感知业务,因为无法继续使用服务,那么您只能通过转储线程查看哪个线程问题。我们从以下转储分析线程信息:

  从上面的第33行和第50行可以看出。

  资源限制是指编程仅限于计算机硬件资源或软件资源时程序的执行速度。例如,服务器的带宽仅为2MB/s。特定资源的下载速度为1MB/s。该系统启动10个线程以下载资源。下载速度不会成为10MB/S.Limit。

  在并发编程中,加速执行代码的原理是将代码中的串行执行部分转换为并发执行,但是如果同时执行串行段的串行代码,因为它仅限于资源,它仍被执行序列执行。。此过程不会加速,但会更慢,因为时间增加了上下文切换和资源调度。

  在资源限制的情况下,如何使程序加速?该方法是根据不同资源限制调整程序的并发性,例如下载文件程序取决于两个资源 - 大众和硬盘的读取速度和写作速度。当有数据库操作时,涉及数据库连接。如果SQL执行非常快,并且线程数量比数据连接数量大得多,则某些线程将被阻止并等待数据库连接。

  本文总结了“ Java并发编程的艺术”/“ Java并发编程的艺术”