精华内容
下载资源
问答
  • 并发

    2018-07-11 17:44:44
    并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了。Go的并发同步模型来自通信顺序进程(Communicating Sequential Processes,CSP)的范型。CSP是一种消息...

    Go语言的并发是是指goroutine运行时是相互独立的,能让某个函数独立于其他函数运行。

    并发不是并行。并行是让不同的代码片段同时在不同的物理处理器上执行。并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了。


    Go的并发同步模型来自通信顺序进程(Communicating Sequential Processes,CSP)的范型。CSP是一种消息传递模型,通过在goroutine之间传递数据。而不需要对数据进行加锁来实现同步访问。

    通道(channel)用于goroutine之间同步和传递数据的数据类型。


    goroutinue本质上是协程,但有两点不同:

    1. goroutinue可实现并行;多个协程可在多个处理器同时跑。而协程同一时刻只能在一个处理器跑。
    2. goroutinue之间的通信是通过channel(消息队列);而协程的通信是通过yield和resume()操作。

    ---------------------------------

    当一个正在运行的goroutine需要执行一个系统调用,如打开一个文件,线程会和goroutine从逻辑处理器上分离,该线程会继续阻塞,等待系统调用的返回。与此同时,调度器会创建一个新线程,并将其绑定在逻辑处理器上。

    之后,调度器会从本地运行队列里选择另一个 goroutine 来运行。一旦被阻塞的系统调用执行完成并返回,对应的 goroutine 会放回到本地运行队列,而之前的线程会保存好,以便之后可以继续使用。


        WaitGroup是计数信号量,可以用来维护运行的goroutine。

    //wg用来等待程序完成
    //计数加2,表示等待两个goroutine
    var wg sync.WaitGroup
    wg.Add(2)

    修改逻辑处理器数量

    runtime 提供了修改 Go 语言运行时配置参数的能力。

    runtime.GOMAXPROCS(runtime.NumCPU())



    通道

        通过使用管道发送和接收需要共享的资源,在goroutine之间做同步。

    声明通道时,需要指定将要被共享的数据的类型。可共享内置类型、命名类型、结构类型、引用类型或指针。

    使用make创建管道,

    //无缓冲的整形管道
    unbuffered := make(chan int)
    
    //无缓冲的字符串通道
    buffered := make(chan string, 10)

        make的第一个参数需要是关键字chan,之后跟着允许通道交换的数据类型。

        向通道发送值或指针需要用到<-操作符。


    无缓冲的通道(unbuffered channel):指在接收前没有能力保存任何值。要求发送goroutine和接收goroutine同时准备好,才能进行发送和接收操作。

    如果两个foroutine同时没有准备好,通道会导致先执行发送或接收操作的goroutine阻塞。


    有缓冲的通道(buffered channel):是一种在被接收前能存储一个或者多个值的通道。

    不强制要求 goroutine 之间必须同时完成发送和接收。

    只有在通道中没有要接收的值时,接收动作才会阻塞。


    两者区别:

        无缓冲的通道保证进行发送和接收的 goroutine 会在同一时间进行数据交换;有缓冲的通道没有这种保证。






















    展开全文
  • ⚠️ 并发是指,多个线程共享同一个变量,并且对该变量有修改值的操作,才会发生并发。

    ⚠️

    • 并发是指,多个线程共享同一个变量,并且对该变量有修改值的操作,才会发生并发。
    展开全文
  • 并发是指在一个时间段内有多个进程在执行。 并行指的是在同一时刻有多个进程在同时执行。 如果是在只有一个CPU的情况下,是无法实现并行的,因为同一时刻只能有一个进程被调度执行,如果此时同时要执行其他进程...

           并发是指在一个时间段内有多个进程在执行。

           并行指的是在同一时刻有多个进程在同时执行。

           如果是在只有一个CPU的情况下,是无法实现并行的,因为同一时刻只能有一个进程被调度执行,如果此时同时要执行其他进程则必须上下文切换,这种只能称之为并发,而如果是多个CPU的情况下,就可以同时调度多个进程,这种就可以称之为并行。

    什么是高并发

           定义:

           高并发(High Concurrency)是使用技术手段使系统可以并行处理很多请求。

           关键指标:

            -响应时间(Response Time)

            -吞吐量(Throughput)

            -每秒查询率QPS(Query Per Second)

            -每秒事务处理量TPS(Transaction Per Second)

            -同时在线用户数量

            关键指标的维度:

            -平均,如:小时平均、日平均、月平均

            -Top百分数TP(Top Percentile),如:TP50、TP90、TP99、TP4个9

            -最大值

            -趋势

    如何应对高并发?

           高并发意味着单位时间内系统能处理的请求数很高,也就是说系统所能承载的HTTP请求很多,那要应对高并发,就要从HTTP请求处理层面开始,如下是我理解的一个完整的HTTP请求所经历的流程:

            1、DNS域名解析将请求域名解析为IP地址。

            2、与IP地址对应的服务器网卡建立连接,TCP的三次握手,连接建立并占用

            3、服务器操作系统通过连接读取和处理请求

                  3.1 从连接中读取字节流(IO密集)

                  3.2 将读取到的字节流转换成HTTP请求(CPU密集)

            4、服务器操作系统将HTTP请求转发给WEB Server或者Application Server

                 4.1 Application在开发逻辑架构中一般会分层,分为表现层、业务层和持久层

            5、Application进行业务逻辑处理并准备响应Response

            6、Response准备完成,Response通过网卡回写到用户的浏览器(IO密集)

            7、TCP连接三次挥手,断开连接

             从这个过程中,我们对一个HTTP的请求能有一个感性的认识,基于这个感性的认识,我们能知道这里面几个关键的点:域名解析、连接处理、系统分层,从这几个关键点其实就可以提取出一些应对方法。

            域名解析

            域名解析这个环节有一个应对高并发的方法就是CDN,CDN 就是将静态的资源分发到位于多个地理位置机房中的服务器上,因此它能很好地解决数据就近访问的问题,也就加快了静态资源的访问速度。搭建CDN主要有两个关键点,一是如何将用户的请求映射到 CDN 节点上,二是如何根据用户的地理位置信息选择到比较近的节点。

    将用户的请求映射到 CDN 节点其实就是域名解析(DNS)的过程,DNS解析的过程大致如下:

            首先查看本机的host文件,查看是否有该域名对应的IP地址;

            如果没有就请求Local DNS是否有域名解析结果的缓存,如果有就返回标识是否从非权威DNS返回的结果;

            如果还是没有就进入DNS迭代查询的过程,先查询根DNS的地址(如.com/.cn/.org), 再请求顶级DNS得到二级域名服务器地址(如baidu.com);再从二级域名服务器中查询到 子域名对应的 IP 地址(如www.baidu.com),返回这个 IP 地址的同时标记这个结果是来自于权威 DNS 的结果,同时写入 Local DNS 的解析结果缓存,这样下一次的解析同一个域名就不需要做 DNS 的迭代查询了。

            根据用户的地理位置信息选择到比较近的节点则是GSLB的作用,GSLB(Global Server Load Balance,全局负载均衡)的含义是对于部署在不同地域的服务器之间做负载均衡,下面可能管理了很多的本地负载均衡组件。它有两方面的作用:一方面,它是一种负载均衡服务器,指的是让流量平均分配使得下面管理的服务器的负载更平均;另一方面,它还需要保证流量流经的服务器与流量源头在地缘上是比较接近的。

            连接处理

             这一节,我们关注网络连接处理IO层面的一些应对之策。

            Tomcat如何应对

            实际工作当中,Tomcat作为容器承担着与用户建立连接、解析请求、转发请求、回写响应的工作,Connector作为Tomcat两个核心组件之一,主要任务是实际负责接收浏览器发来的连接请求,创建一个Request和Response对象分别用于和请求端交换数据,把产生的Request和Response对象传给后续处理这个请求的工作线程。先给个结论,默认情况下Tomcat7.0应对大量连接的能力不如Tomcat8.5,为什么呢?可以来看下Connector中关于protocol的设置:

    7.0 protocol- The default value is HTTP/1.1 which uses an auto-switching mechanism to select either a blocking Java based connector or an APR/native based connector.

    8.5 protocol- The default value is HTTP/1.1 which uses an auto-switching mechanism to select either a Java NIO based connector or an APR/native based connector.

            APR/native全称Apache Portable Runtime,由Apache基金会提供维护支持,非tomcat自带的组件,需要独立安装,能应对大量的连接,但是如果在未安装该组件的情况下,我们可以发现默认情况下7.0使用的是blocking Java而8.5使用的是Java NIO,由此是不是可以猜想是IO处理方式的不同决定了应对高并发的效果不一样。

          IO模型

          在继续探讨连接处理层面的应对之策前,我们先来回顾一下Unix环境下的网络IO模型。

           阻塞式IO模型(blocking I/O):

     

            进程阻塞调用,一旦线程创建过多,线程的创建销毁成本高,线程本身的内存占用大,CPU不断的进行线程的上下文切换。

            非阻塞式IO模型(nonblocking I/O):

     

             应用线程在IO数据准备阶段,忙等待。

             IO多路复用模型(I/O multiplexing):

     

             相对于同步阻塞IO模型,借由操作系统提供的select/poll功能使用少量线程管理大量连接,用户进程通过select/poll获取当前实际ready的socket,然后在进程中阻塞的将内核态拷贝到用户态。在Linux系统中,有更高效的epoll实现。实际使用中,socket常会被设置成以non-blocking方式访问。

    信号驱动式IO模型(signal-driven IO):

     

            异步IO模型(asynchronous I/O):

     

             IO模型区别总览:

     

                Java NIO

               在了解完网络IO模型之后,我们再回来看下Tomcat中的Java NIO是如何体现这个IO模型的。

               Java NIO中的三个核心概念:Channel、Selector和Buffer。

                        Channel是可IO操作的硬件、文件、socket、其他程序组件的包装。

                        Selector是select/poll/epoll包装。

                        Buffer是数据容器,和Channel成对出现,数据只能从Channel中读取和写入。

               JDK1.4引入的NIO,Selector使用Linux poll实现。

              JDK6 & JDK 5 update 9支持epoll(Linux Kernel >= 2.6)。

              JDK7 支持NIO2,引入异步IO的四个通道:

                   AsynchronousSocketChannel

                  AsynchronousServerSocketChannel

                  AsynchronousFileChannel

                  AsynchronousDatagramChannel

              值得注意的是,这四个通道运行在Linux中仍是通过epoll实现,并非真正意义的异步IO。

              至此我们可以知道我们工作中经常使用的Tomcat是如何在IO模型上应对高并发了。

          再谈Tomcat 线程模型

     

     

               Acceptor负责接收Socket并将之封装为NioChannel,通过NioChannel的register注册到Poller中。

               Poller实际是基于Java NIO Selector实现的,主要功能为获取当前可读取的NioChannel并将其分发给实际的Worker。

               Worker是实际负责请求处理的线程池,将请求转发给应用层处理。

        一个新的问题

              高并发带来的请求流量都很大,巨大的流量冲击到Tomcat后,如果Worker处理不过来,系统会发生什么呢?

                       三个重要的tomcat connector参数:acceptCount,maxConnections,maxThreads

                       若没有空闲的Worker(即到达了maxThreads),新来的请求不得不接受长时间的等待,一直等到有新的Worker为止。更多的请求到达,Acceptor发现创建的NioChannel抵达maxConnections时,阻塞。更多的请求到达,OS层面的连接仍会继续进行,抵达acceptCount时,OS拒绝连接,Client端显示Connection refused。这个时候一个新的应对方式也就产生了-异步化。

        基于Servlet API的异步方式

              在servlet3.0引入了基于servlet API实现的异步处理方案,流程图如下:

     

          Tomcat的工作线程(Worker)在支持异步的Servlet中通过调用如下命令开启异步处理:

                AsyncContext ServletRequest.startAsync(Request request,Response response)

                Tomcat的工作线程会将当前的request,response对象的引用放入AsyncContext中,并将AsyncContext交付给一个新的线程处理,保持response的打开状态,然后立即返回Tomcat工作线程池等待处理其他的请求。

            新的线程应该是什么?

                  新的线程是业务线程池产生的,并且不是一个线程池,而是根据业务设计的多级线程池组。例如区分核心业务和非核心业务线程池。通过线程池的隔离,保证非核心业务的抖动不会影响到核心业务,另一个好处就是保留对业务线程池的监控、运维、降级等。新的线程主要做业务处理,通过response回写响应并且关闭response。

                  AsyncContext.complete()

                 Spring 3.2开始支持Servlet 3.0,通过异步化,我们将解析和业务处理彻底剥离,同时业务处理间区分不同的线程池保证隔离性。

                  异步处理不会降低响应的时间,但是会提高吞吐量,从而应对高并发。

             Reactive Stack

                    一个相对于servlet-stack独立的全新的技术栈reactive stack:Spring-WebFlux。

     

                    从图中可以看出这个全新的stack是基于Reactive Streams。

            最后总结一下,连接处理层面应对高并发的思路就是:

                    阻塞变非阻塞,同步变异步,核心就是充分利用单机性能,压榨CPU。

           系统分层

                  这一节,我们将从系统分层这个层面来看每一层可以采用的应对之策。

            业务层

                  本节主要关注在业务层,面对高并发场景下对于业务逻辑实现相关的处理方案。

             缓存

             缓存是一种存储数据的组件,它的作用就是让对数据的请求能更快的返回。高并发的场景下,如果能快速的返回请求所需要的数据,对于系统持久层是一种相当好的保护措施,对于系统来说也能提升吞吐量。常见的缓存技术有静态缓存、分布式缓存和热点本地缓存。

             静态缓存在 Web 1.0 时期是非常著名的,它一般通过生成 Velocity 模板或者静态 HTML 文件来实现静态缓存,在 Nginx 上部署静态缓存可以减少对于后台应用服务器的压力。这种缓存只能针对静态数据来缓存,对于动态请求就无能为力了。那么我们如何针对动态请求做缓存呢?这时你就需要分布式缓存了。

              分布式缓存性能强劲,通过一些分布式的方案组成集群可以突破单机的限制。所以在整体架构中,分布式缓存承担着非常重要的角色。

              对于静态的资源的缓存可以选择静态缓存,对于动态的请求可以选择分布式缓存,那么什么时候要考虑热点本地缓存呢?答案是当我们遇到极端的热点数据查询的时候。热点本地缓存主要部署在应用服务器的代码中,用于阻挡热点查询对于分布式缓存节点或者数据库的压力。 

            消息队列

            系统的初级阶段基本上是读多写少,所以在应对高并发时业务层会先加入缓存组件,希望通过缓存阻挡大量的读请求。随着系统的不断发展,高并发系统开始涌入大量的写请求,此时会使用到消息队列来应对高并发的场景。

            异步解耦和削峰填谷是消息队列的主要作用,其中异步处理可以简化业务流程中的步骤,提升系统性能;削峰填谷可以削去到达秒杀系统的峰值流量,让业务逻辑的处理更加缓和;解耦可以将系统和其他系统解耦开,这样一个系统的任何变更都不会影响到另一个系统。

           业务拆分

           正常情况下,初期为了系统能尽快上线,都会是以单体架构的形式出现,而随着流量和请求的增多,单体架构开始出现一些问题:

            数据库连接数可能会成为系统的瓶颈;

            内部成员的沟通成本问题;

            代码提交,分支管理,项目编译等问题;

            模块相互依赖,强耦合,一旦出问题容易牵一发而动全身;

            ………

            这个时候,为了系统能达到支撑高并发的效果,便会对系统做业务拆分,以应对上述众多问题,拿我们保险系统来说,最早期的保险核心系统,其实契约、保全、财务、理赔甚至是各种报表都是集中在一个系统中,虽然保险是一个低频行为,不太具有高并发的特性,但是在系统发展的过程中,也会有类似的拆分,将契约、保全、财务、理赔等从一个系统拆分成多个系统,而高并发系统则是使用了更细粒度的拆分,以提供服务的形式来应对高并发,在流量高峰期可以动态扩容,平稳流量,避免系统崩溃。 

            RPC

            服务拆分之后,原本的单体系统就会变成分布式系统,原来在同一个进程里面两个方法调用就会变成跨进程跨网络的两个方法调用,此时就会引入RPC框架来解决跨网络通信问题。RPC框架封装了网络调用的细节,可以实现像调用本地服务一样调用远程部署的服务。

            一个完整的RPC的步骤如下:

              在一次 RPC 调用过程中,客户端首先会将调用的类名、方法名、参数名、参数值等信息,序列化成二进制流;

              然后客户端将二进制流通过网络发送给服务端;

              服务端接收到二进制流之后将它反序列化,得到需要调用的类名、方法名、参数名和参数值,再通过动态代理的方式调用对应的方法得到返回值;

              服务端将返回值序列化,再通过网络发送给客户端;

             客户端对结果反序列化之后,就可以得到调用的结果了。

             从这个过程中,我们可以提取出RPC的核心过程就是网络传输和序列化。其中网络传输可以选择Netty,而序列化则可以选择Thrift或者Protobuf。

             RPC能够解决服务之间跨网络通信的问题,但是对于RPC来说,又是如何知道自己该调用谁或者谁会调用自己呢?这个时候就会引入注册中心来解决这个问题,比如ZooKeeper、ETCD、Eureka等。 

           API网关

           API 网关(API Gateway)不是一个开源组件,而是一种架构模式,它是将一些服务共有的功能整合在一起,独立部署为单独的一层,用来解决一些服务治理的问题。你可以把它看作系统的边界,它可以对出入系统的流量做统一的管控。对于高并发系统,API网关的搭建是非常有必要的,因为它可以实现如下作用:

               1、提供客户端一个统一的接入地址,API 网关可以将用户的请求动态路由到不同的业务服务上,并且做一些必要的协议转换工作。在系统中,微服务对外暴露的协议可能不同:有些提供的是 HTTP 服务;有些已经完成 RPC 改造,对外暴露 RPC 服务;有些遗留系统可能还暴露的是 Web Service 服务。API 网关可以对客户端屏蔽这些服务的部署地址以及协议的细节,给客户端的调用带来很大的便捷。

               2、在 API 网关中,可以植入一些服务治理的策略,比如服务的熔断、降级、流量控制和分流等等。

               3、客户端的认证和授权的实现,也可以放在 API 网关中。不同类型的客户端使用的认证方式是不同的。手机 APP 可以使用 Oauth 协议认证,HTML5 端和 Web 端使用 Cookie 认证,内部服务使用自研的 Token 认证方式。这些认证方式在 API 网关上可以得到统一处理,应用服务不需要了解认证的细节。

               4、API 网关还可以做一些与黑白名单相关的事情,比如针对设备 ID、用户 IP、用户 ID 等维度的黑白名单。

               5、在 API 网关中也可以做一些日志记录的事情,比如记录 HTTP 请求的访问日志。

             持久层

                本节主要关注在高并发场景下,数据持久化层所需要关注的内容。

            读写分离

             持久层最先可能会用到的应对高并发的方法就是读写分离。对于高并发系统来说,一开始都是读多写少,大量的读请求经过业务层到达持久层之后对数据库产生了极大的压力,此时就会准备一个和生产库一致的数据库来单独接收处理读请求,一般这个叫做从库,也会被称为读库,高并发流量中的读请求会被引流到从库,而写请求还是在主库写,主库和从库之间依靠主从复制机制来确保两个库的数据近乎实时一致,这样用户在读请求的时候几乎发现不了数据的不一致。

             分库分表

            读写分离主要是为了应对读请求,那如果写请求的流量大,此时又会有什么应对的方案呢?常见的一种处理方法就是分库分表。

             分库分表是一种常见的将数据分片的方式,它的基本思想是依照某一种策略将数据尽量平均地分配到多个数据库节点或者多个表中。不同于主从复制时数据是全量地被拷贝到多个节点,分库分表后,每个节点只保存部分的数据,这样可以有效地减少单个数据库节点和单个数据表中存储的数据量,在解决了数据存储瓶颈的同时也能有效地提升数据查询的性能。同时,因为数据被分配到多个数据库节点上,那么数据的写入请求也从请求单一主库变成了请求多个数据分片节点,在一定程度上也会提升并发写入的性能。

             数据库分库分表的方式有两种:

                     一种是垂直拆分,垂直拆分的原则一般是按照业务类型来拆分,核心思想是专库专用,将业务耦合度比较高的表拆分到单独的库中。比如前面业务拆分时提到的将保险核心拆成契约、保全、财务和理赔等各大核心系统,这就是一种垂直拆分。和垂直拆分的关注点不同,垂直拆分的关注点在于业务相关性。

                    一种是水平拆分。而水平拆分指的是将单一数据表按照某一种规则拆分到多个数据库和多个数据表中,关注点在数据的特点。

             拆分的规则有下面这两种:

                 1、 按照某一个字段的哈希值做拆分,这种拆分规则比较适用于实体表,比如说用户表,内容表,我们一般按照这些实体表的 ID 字段来拆分。

                 2、另一种比较常用的是按照某一个字段的区间来拆分,比较常用的是时间字段。你知道在内容表里面有“创建时间”的字段,而我们也是按照时间来查看一个人发布的内容。我们可能会要看昨天的内容,也可能会看一个月前发布的内容,这时就可以按照创建时间的区间来分库分表,比如说可以把一个月的数据放入一张表中,这样在查询时就可以根据创建时间先定位数据存储在哪个表里面,再按照查询条件来查询。

               NoSQL

                读写分离和分库分表是改善数据库持久层应对并发能力的利器,但是在高并发的持续不断的积累下,传统关系型数据库已经很难应对数据量上的瓶颈,此时便可以利用NoSQL来帮助解决这些问题,因为它有着天生分布式的能力,能够提供优秀的读写性能,可以很好地补充传统关系型数据库的短板。

    参考资料:

           https://www.cnblogs.com/Leo_wl/p/12565876.html

           https://www.cnblogs.com/xiexj/p/10399385.html

           https://blog.csdn.net/weixin_33916256/article/details/93909627

    展开全文
  • 点击上方“晏霖”,选择“置顶或者星标”曾经有人...百度百科中,并发是指在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有...

    点击上方晏霖”,选择“置顶或者星标”

    曾经有人关注了我

    后来他有了女朋友

    2.2.1认识并发与并行

    我们理解了什么是线程,以及线程与进程对关系,那么我们现在可以简单理解为,并发就是在同一时刻多个线程操作同一物理CPU(或多个物理CPU)上的资源。

    百度百科中,并发是指在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

    同样,为了方便理解,我们利用生活中的一种模型去解释,把线程比作汽车,汽车通过高速收费站,假设收费站只开了一个收费口,这时所有车道上的汽车交替并入收费口通过,这个场景就是并发。这时我们脑子里马上就会反应出,如果只开一个收费口那么多的汽车肯定不是一个好方法,所以实际情况往往是开多个收费口,这就叫并行,所以我们概念性总结什么是并行?并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。在开发中也是无时无刻用到并行操作,例如处理集合我们可以使用parallelStream()并行流处理方法,他是线程不安全,用的时候要注意。

    我们用下面两个图形象说明并发和并行。

    ff091bdb9b9d218d93c9b4b96746c098.png

    2-2     

    55946f39d7db26e12c42a161a097f6e8.png

      2-3

    2.2.2并发、并行、线程之间的关系

    我们利用一组图说明并发、并行和多线程的关系

    51a678579208a40f6cc285f38541c97d.png

              2-4          

    c347d69827b8e49a3f90ae0e3779451f.png

     2-5

    从图2-2我们看出并发是一个处理器在同一时间内处理多个事件,但并不是同时,其实是线程ABC是处理器通过时间片进行切换,实际情况中我们感觉好像是多个线程同时处理,那是因为处理器切换速度快。

    从图2-3我们看出并行需要两个或两个以上的线程跑在不同的处理器上,因此并行是物理上的同时发生,是真实的同时。

    通过上面的解释我们应该对线程、并发和并行有了一定认识,因此并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。并行包含并发,但并发小于并行。不管并发还是并行,都提高了程序对CPU资源的利用率,最大限度地利用CPU资源。

    2.2.3并发和并行的区别

    此小章节的内容是对上面并发与并行找出不同点,并发与并行本身就是一种概念性的理解,他可以理解成程序执行的一种模型,并发和并行离不开线程,无论是并发还是并行都是多核CPU在多线程下的执行形式。

    区别一:并发是指一个处理器同时处理多个任务。并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。

    区别二:并行(parallel)指在同一时刻,有多条指令在多个处理器上同时执行。无论从微观还是从宏观来看,二者都是一起执行的。并发(concurrency)指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行

    我所指宏观是站在系统层面上看多个程序运行情况,微观是站在每一个线程对角度上看线程的执行情况。

    区别三:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态。这种方式我们称之为并发(Concurrent)。当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。

    2847be7de78bf81253be7b735f1a47cc.png

    胖虎

    热 爱 生 活 的 人

    终 将 被 生 活 热 爱

    我在这里等你哟!

    dca98056a207a81d63009d271b17f71d.png

    804c080a088d9693154888cabfc8db1b.gif
    展开全文
  • 并发是指两个或多个事件在同一时间间隔发生。 解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。 解释三:并行是在一台处理器上“同时”处理多个任务,并发是在多台处理器上同时处理多个...
  • Python并发简介

    2018-11-06 09:55:18
    简而言之,并发是指同时发生两个或多个事件。 并发是一种自然现象,因为许多事件在任何给定的时间同时发生。就编程而言,并发是两个任务在执行过程中重叠的时候。 通过并发编程,我们的应用程序和软件系统的性能可以...
  • 并发与并行

    2021-01-20 11:50:02
    并发是指:在同一个时间段内,两个或多个程序执行,有时间上的重叠(宏观上是同时,微观上仍是顺序执行)。并行也指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为...
  • 并发测试可以说是压力测试中的重点,很大一部分测试人员优先考虑的就是进行并发压力测试,意在测出系统所能够承受的最大用户同时发送请求。不知道大家有没有像我一样的疑惑,所谓的并发指的究竟时间点还是时间段?
  •   并发是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能只有一道程序在执行,故微观上这些程序只能是分时交替...
  • 1、何为并发 在操作系统中,是指一个时间段...而并发是指两个或多个事件在同一时间间隔发生。 解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。 解释三:在一台处理器上“同时”处理多个任...
  • JMeter实现相对并发和绝对并发

    千次阅读 2020-01-11 17:20:28
    1.相对并发是指在一个时间段内发生的事务 举例如下:在jmeter的测试计划中添加线程组,设置线程属性,2秒之内启动10个线程,其对应的相对并发为5(线程数/启动时间),在没有添加其他逻辑控制器或定时器的情况下,...
  •   并发是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能只有一道程序在执行,故微观上这些程序只能是分时交替...
  • 浅析并发

    2017-12-15 11:54:27
    写在前面最近因为自己毕业的一些事情断更了简书,一转眼已经有两个月了,是时候给自己充一波电了。本篇主要 复习 总结一些多线程中的基础知识,开篇打算...并发是指在一段时间内宏观上有多个程序在同时运行,但实际上每
  • 并行和并发

    2021-02-28 22:50:04
    并行和并发有什么区别: 1.并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。 2.并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。 ...
  • Golang 并发编程

    千次阅读 2020-08-04 10:58:37
    前言 简而言之,所谓并发编程是指在一台处理器上“同时”处理多个任务。...宏观的并发是指在一段时间内,有多个程序在同时运行。 并发在微观上,是指在同一时刻只能有一条指令执行,但多个程序指令被快速的轮换
  • 并发是指两个或多个事件在同一时间间隔发生。 解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。 解释三:并行是在多台处理器上同时处理多个任务。如 hadoop 分布式集群,并发是在一台...
  • 什么是并发

    千次阅读 2019-02-02 16:51:44
    并发系统能够同时处理请求的数目,这个数字也反映了系统的负载特性。对网站而言,并发数即网站并发用户数,同时提交请求的用户数目。 与网站并发用户数相对应的还有网站的在线用户数(当前登录网站的用户总数...
  • 并发是指两个或多个事件在同一时间间隔发生。解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。解释三:并行是在多台处理器上同时处理多个任务。如 hadoop 分布式集群,并发是在一台处理器上...
  • 并发和并行

    2018-02-07 09:25:54
    并发(concurrency)是逻辑上同时发生;并行(parallelism)是物理上同时发生。 ...并发是指程序结构,并行是指程序的运行状态。 并发使多个操作能够在重叠的时间段内执行,即协程。 在任何
  • java中的并发是什么发布时间:2020-06-10 19:20:22来源:亿速云阅读:190作者:鸽子并发是什么?并发:是指在某个时间段内,多任务交替的执行任务。当有多个线程在操作时,把CPU运行时间划分成若干个时间段,再将时间...
  • 有的参考资料里面会提到用postman的iteration进行高并发测试,但实际上postman的测试串行的,实际跑下来1000个请求时间拉得很长,服务器气都不喘全都能pass,参考意义不是特别大,但也简单介绍一下。 另外的方法还...
  • 并发是指较多用户同时访问服务。高并发可以由多线程实现,但是多线程不代表就是高并发。在会计汇有个投票调查项目,是和财政部合作的,会计人员进行填写完调查结果后,将获得5个学分。通过短信向全国500万会计人员...
  • 物联网并发是指大量硬件设备,同时接入到现有的系统(Linux, Windows)上,与程序进行通信(TCP,UDP)交互。 Web网页并发指用户通过浏览器,同一时刻或时间段内针对某些功能有大量交互操作(HTTP),从而产生并发...
  • 摘要:并发与并行是两个既相似而又不相同的... 并发是指:在同一个时间段内,两个或多个程序执行,有时间上的重叠(宏观上是同时,微观上仍是顺序执行)。  并发的实质是一个物理CPU(也可以多个物理CPU) 在若干
  • 1 引言  并发、并行、串行、同步、异步、阻塞、非阻塞、进程、线程、协程是并发编程中的常见... 并发是指在同一个处理器上通过时间片轮转的方式在多个线程之间频繁切换,由于切换速度极快,所以看似多个线程似...
  • 并发是指两个或多个事件在同一时间间隔发生。解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。解释三:在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如...
  • 且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行里面的一个时间段内说明非常重要,这里假设这个时间段是一秒,所以本文指的并发是指服务器在一秒中处理的请求数量,即rps,那么rps高...
  • 并发&并行

    2017-04-05 16:09:39
    做并发编程之前,必须...而并发是指两个或多个事件在同一时间间隔发生。 解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。 解释三:在一台处理器上“同时”处理多个任务,在多台处理器上...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,447
精华内容 7,378
关键字:

并发是指