当前位置:首页 > 天道酬勤 > 正文内容

jmeter并发数和线程数(进程和线程的相同点)

张世龙2022年01月15日 05:37天道酬勤780

关于Java并发

Java并发编程通常会联想到进程、线程、并行、并发等概念。 这些概念代表了什么呢? 进程与线程有什么关系? 同时和并行有什么关系呢?

进程与线程

进程是程序的动态运行进程,通常计算机上运行的程序是进程,每个程序对应一个进程。 进程包含从代码加载到执行完成的完整进程,是操作系统资源分配的最小单位。

线程是比进程小的执行单元,是CPU调度和分配的基本单元。 每个进程至少有一个线程。 相反,一个线程只属于一个进程。 线程可以调度和运算进程的所有资源。 线程可以由操作系统内核控制时间表,也可以由用户程序控制时间表。

多个CPU执行这三个过程,如下图所示。 每个进程至少包含一个线程。 例如,进程1包含四个线程,而进程2和进程3包含一个线程。 此外,每个进程都有自己的资源,进程中的所有线程都共享进程中包含的资源。

进程和线程

并发与并行

并发和并行可以对进程或线程执行。 并发是指一个或多个CPU在多个进程或线程之间复用。 简单来说,CPU依次执行多个任务,每个任务一点一点地执行。 从宏观上看,所有任务似乎都在同时执行。 并行是指多个进程或线程同时运行。 这必须在真正意义上同时执行,并支持多个CPU。 下图是并发和并行执行的时序图。 并行执行时,线程执行一定时间,线程2执行一定时间,线程3执行一定时间。 每个线程依次得到CPU的运行时间。 在这种情况下,只要有一个CPU就可以实现。 并行时,线程1、线程2和线程3同时运行。 在这种情况下,需要三个CPU才能实现。 并行性和并行性提高了CPU的资源利用率。

同时并行

Java并发在Java平台上实现,以实现并发机制,Java平台提供线程和线程的并发

多线程能提升执行效率

之前,我们了解到多线程可以同时运行和并行运行,因此多线程可以提高整体效率。 如果不支持多线程,当某个执行任务处于块等待状态时,块可能会降低执行效率。 如下图所示,某个请求任务开始请求后,开始等待响应。 此时,线程占用了CPU,不工作。 从整个执行线可以看到实际执行的(绿色方块)的时间少,就是执行效率低。 如果支持多线程并发,则可以在等待块时执行其他任务。 此外,在多CPU环境中,如果可以将单个任务划分为多个小任务,则可以同时在多个CPU上执行,因此单个CPU的执行能力有限,可以更快地执行任务。 如下图2所示,将任务分解为3个小任务后,可以在多CPU环境中并行执行,大大缩短了整体的执行时间。

单线程阻塞状态

多线程并行处理

多线程能提升用户体验

多线程也提高了用户体验。 如果一个线程的任务包含耗时的任务和用户交互任务,则用户体验可能会变差。 如下图所示,看到这些窗户团团转不能操作,会难受吗? 线程启动请求后,开始等待请求的结果,但用户界面保持不响应。 多线程可以将任务分为请求任务和接口操作,从而在请求后保持对接口操作的响应并提高用户体验。

界面卡住了

多线程让编码更难

没有免费的午餐,多线程化也需要成本。 从编写代码的角度来看,多线程使编码变得更复杂,本质上是

多线程机制与现代计算机结构所带来的。纵使在编程语言设计专家的努力下,现在有很多简化多线程编程的语言和模型,但相比于单线程来说多线程的编写仍然复杂很多。数据从主存储到CPU中间有若干层缓存和寄存器,而且多个线程可能访问共享内存,这就涉及到数据同步问题,从而增加了多线程编程的复杂性。此外,线程与线程之间的通信也比较麻烦,这也增加了多线程编码的复杂性。总之,尽管很多编程语言尝试为我们提供更便捷的多线程编程,但在语言层面仍然无法完全屏蔽掉多线程与计算机结构的复杂性,所以不管我们使用什么语言都需要为多线程的编码考虑得更多。

上下文切换与资源开销

多线程除了增加编码难度外,它还在执行过程中带来实际的损耗,包括资源开销和上下文切换开销。资源开销主要包括其本身占用的内存资源、执行时线程本地栈开销以及对这些线程进行管理的开销。而上下文切换开销则是因为CPU由一个线程切换到另外一个线程是需要做现场保护和现场恢复工作,包括线程标识、寄存器内存、线程状态、线程优先级、线程资源清单等等。如下图所示,假设线程一和线程二由某个CPU执行。线程一执行一段时间后将相关信息保存到现场数据结构中,而线程数据结构存放在主存储中,然后从线程二对应的现场数据结构中恢复线程二相关信息,完成现场恢复后线程二开始执行。接下去的过程反过来,由线程二切换到线程一。其中可以看到由虚线分割的两部分被标为切换开销,从完整的时序来看,这两部分并非执行线程的任务,而是消耗在了现场的保护和恢复上了,这便是上下文切换的开销。

上下文切换

在实践中我们要综合考虑多线程的优缺点,不能一味的去追求多线程,在使用多线程之前我们必须去衡量多线程带来的好处与代价。

更多Java并发原理可关注作者下面的专栏:

作者简介:笔名seaboat,擅长人工智能、计算机科学、数学原理、基础算法。出版书籍:图解数据结构与算法、Tomcat内核设计剖析、图解Java并发原理、人工智能原理科普。

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://zhangshilong.cn/work/43828.html

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。