当前位置: 首页 > 后端技术 > Java

大哥,这是并发不是并行,AreYouOk-

时间:2023-04-01 16:52:36 Java

本文内容整理自博雪谷狂野架构师的多线程概览。基本概念进程和线程进程是程序运行的最小资源分配单位。、磁盘IO等,同一个进程内的多个线程共享进程内的所有系统资源,进程间相互独立。进程是对某个数据集上的某个运行活动具有一定独立功能的程序,进程是系统分配和调度资源的独立单元。进程是程序在计算机上的执行活动。当你运行一个程序时,你就启动了一个进程。显然,程序是死的、静态的,而进程是活的、动态的。进程可以分为系统进程和用户进程。所有用来完成操作系统各种功能的进程都是系统进程,是处于运行状态的操作系统本身,而用户进程都是你启动的进程。线程是CPU调度的最小单位,必须依赖于进程而存在。线程是进程的实体,是CPU调度调度的基本单位。它是一个比进程更小,可以独立运行的基本单元。线程本身基本上不拥有系统资源,只有一些运行中必不可少的资源(如程序计数器、一组寄存器和堆栈),但它可以与属于同一进程的其他线程共享本进程拥有的所有资源.线程无处不在任何程序都必须创建一个线程,尤其是Java无论任何程序都必须启动一个main函数的主线程;定时任务,定时器,JSP和Servlet,JavaWeb开发中的异步消息处理机制,远程访问接口RM等,任何监听事件,onclick触发事件等都离不开线程和并发的知识。CPU核心数与线程数的关系多核:也指单片机多处理器(ChipMultiprocessors,简称CMP),CMP由美国斯坦福大学提出,其思想是结合SMP(symmetricalMultiprocessors)被集成到同一个芯片中,每个处理器并行执行不同的进程。依靠多个CPU同时并行运行程序是超高速计算的一个重要方向。它被称为并行处理多线程:SimultaneousMultithreading。简称SMT。让同一个处理器上的多个线程同步执行,共享处理器执行资源。核心数和线程数:目前主流的CPU都是多核的。增加核心数就是增加线程数,因为操作系统是通过线程来执行任务的,一般它们是1:1的对应关系,也就是说四核CPU一般有四个线程。但是,Intel推出超线程技术后,核心数和线程数的关系是1:2。为什么CPU时间片轮转机制感受不到CPU线程数的限制?我们平时开发的时候,感觉不受CPU核数的限制。,想启动线程就启动线程,即使是在单核CPU上,为什么呢?这是因为操作系统提供了CPU时间片轮转机制。时间片循环调度是最古老、最简单、最公平、应用最广泛的算法,也称为RR调度。每个进程都被分配了一段时间,称为它的时间片,也就是允许进程运行的时间。什么是CPU轮转机制百度百科对CPU时间片轮转机制的原理解释如下:如果时间片结束时进程仍在运行,则CPU将被剥夺,分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU立即切换。调度器所要做的就是维护一个就绪进程列表,当一个进程用完它的时间片时,它被移到队列的末尾。时间片长度循环调度中唯一有趣的一点是时间片长度。从一个进程切换到另一个进程是需要时间的,包括保存和加载寄存器值和内存映像,更新各种表和队列等等。如果一个进程切换(有时称为上下文切换)需要5ms,假设时间片设置为20ms,那么在做了20ms的有用工作后,CPU将花费5ms做进程切换。20%的CPU时间浪费在了管理开销上。为了提高CPU效率,我们可以将时间片设置为5000ms。这时候,只有0.1%的时间被浪费了。但是考虑一下在分时系统中,如果10个交互式用户几乎同时按下回车键会怎样?假设所有其他进程都用完了它们的时间片,那么最后一个不幸的进程必须等待5s才能获得运行的机会。大多数用户无法忍受需要5次才能响应的简短命令。在支持多道程序设计的个人电脑上也会出现同样的问题。结论可以概括为:时间片设置太短会导致进程切换过多,降低CPU效率:设置太长可能导致对短交互请求的响应不佳。100毫秒的时间片通常是一个合理的折衷方案。在CPU死机的情况下,大家不难发现,在不重启电脑的情况下运行一个程序,让CPU达到100%,我们还是有机会杀掉它的。我想正是因为这个机制的原因。明确并行性和并发性举个例子,如果有一条高速公路A,并排有8个车道,那么最大的平行车辆是当这条高速公路A上的8辆车小于等于8辆车并排行驶在同时,车辆可以并行运行。CPU也是基于这个原理。一个CPU相当于一条高速公路A,核心或线程的数量相当于可以并排通过的车道;车道。讲并发的时候一定要加一个单位时间,也就是说单位时间的并发量是多少?离开单位时间是没有意义的。俗话说,一心不可二用,计算机也是如此。原则上一个CPU只能分配给一个进程才能运行这个进程。我们平时使用的电脑只有一个CPU,也就是说只有一颗心脏。要使其一机多用,同时运行多个进程,就必须使用并发技术。并发技术的实现相当复杂,最容易理解的就是“时间片轮转进程调度算法”。总结一下:并发:指的是应用程序交替执行不同任务的能力。例如,在单个CPU核心下执行多个线程并不意味着同时执行多个任务。如果开两个线程去执行,那是在以一种几乎察觉不到的速度在这两个任务之间不断切换,达到了“同时执行的效果”。其实不然,只是电脑的速度太快了,我们察觉不到罢了。并行:指的是应用可以同时执行不同的任务,比如:吃饭的时候可以打电话,两件事可以同时执行。两者的区别:一个是交替执行,一个是同时执行。感觉是同时发生的,但微观上还是有区别的。并行性被同意在任何时候发生,并发是高并发同时交替执行的意思。由于多核多线程CPU的诞生,多线程、高并发编程越来越受到关注和关注。多线程可以给程序带来以下好处。1、充分利用CPU资源从上面CPU的介绍可以看出,市面上没有不使用多线程并发机制的CPU内核,尤其是服务器有多个CPU时,如果还是用单线程技术做思路,显然out了。因为一个程序的基本调度单位是线程,而一个线程只能运行在一个CPU的一个核心的一个线程上,如果你是i3CPU,最差的就是双核4线程的计算能力:如果它是线程的情况下,3/4的CPU性能被浪费了:如果设计多线程程序,可以同时运行在多个CPU的多个核的多个线程上,可以充分利用CPU,减少利用CPU的空闲时间,充分发挥其计算能力,增加并发量。就像我们平时坐地铁一样,很多人在坐长途地铁的时候都是在认真看书,而不是为了坐地铁而坐地铁,回到家再看书,那么你的时间相当于两倍的时间。这就是为什么有的人时间充裕,有的人总是说没时间。工作也是如此。有时我们可以同时做几件事以充分利用我们的时间。CPU也是一样,一定要充分利用。使用。2.加快响应用户的时间比如我们经常用迅雷下载,我们都喜欢开几个线程下载。没有人愿意使用一个线程来下载。为什么?答案很简单,就是多线程下载快。.我们在做程序开发的时候更应该这样做,尤其是在做互联网项目的时候,如果网页的响应时间增加1秒,如果流量大的话,会增加很多转化.做过高性能web前端调优的都知道,加载静态资源地址需要用到两三个子域名。为什么?因为每增加一个子域名,就会在浏览器加载你的页面时多开几个线程来加载你的页面资源,提高网站的响应速度。多线程和高并发真的是无处不在。3.它可以使你的代码模块化、异步化、简单化。比如我们在实现一个电子商务系统的时候,可以拆分订单,给用户发送短信和邮件。给用户发送短信和邮件这两个步骤是独立的,是一个单独的模块,交给其他线程执行。这样既增加了异步操作,提高了系统性能,又使程序模块化,清晰简洁。多线程应用开发的好处有很多,大家可以在以后写代码的过程中慢慢体会到它的魅力。多线程程序的注意事项1.线程间的安全从前面的章节我们都知道,同一个进程中的多线程是共享资源的,即它们都可以访问同一个内存地址的一个变量。例如:如果每个线程只有对全局变量和静态变量的读操作,而没有写操作,一般来说这个全局变量是线程安全的:如果多个线程同时进行写操作,一般需要线程同步考虑,否则可能会影响线程安全。2.线程间死锁为了解决线程间的安全,引入了Java锁机制,一不小心就会出现Java线程死锁的多线程问题,因为不同的线程在等待那些线程notatall锁可能会被释放,阻止所有工作完成。假设有两个线程,每个线程代表两个饥饿的人,他们必须共用刀叉轮流吃饭。他们都需要获得两把锁:共享刀和共享叉的锁。假设线程A拿刀,线程B拿叉。线程A会进入阻塞状态等待fork,而线程B会阻塞等待线程A拥有的刀。这只是一个人为的例子,但是虽然在运行时很难检测到,但这种情况还是会发生3、线程过多会耗尽服务器资源导致死机系统崩溃,那么我们如何解决此类问题呢?某些系统资源是有限的,例如文件描述符。多线程程序可能会耗尽资源,因为每个线程可能都需要这些资源之一。如果线程数非常大,或者资源的候选线程数远远超过可用资源数,则最好使用资源池。一个典型的例子是数据库连接池。每当一个线程需要使用一个数据库连接时,它就从池中取一个,用完后返回到池中。资源池也称为资源库。多线程应用程序的开发有很多注意事项。希望大家在以后的工作中能够慢慢的了解它的危害。本文由传智教育博学谷狂野建筑师教研团队发布。如果本文对您有帮助,请关注并点赞;有什么建议也可以留言或私信。您的支持是我坚持创作的动力。转载请注明出处!