首页 > 其他分享 >全栈杂谈第一期:什么是计算机中的并发

全栈杂谈第一期:什么是计算机中的并发

时间:2024-08-24 10:50:51浏览次数:10  
标签:计算机 系统 并行 杂谈 同时 并发 全栈 线程

什么是计算机中的并发

计算机中的“并发”是一个听起来很复杂的词汇,但我们可以把它简单理解为“同时做很多事情”。想象一下你正在做晚饭:你可以在等水烧开的时候切菜,还可以在等待炖汤时洗碗。尽管你只有一双手,但通过合理安排时间,你可以看起来像是在同时完成多项任务。这就是“并发”的基本概念。

在这里插入图片描述

并发与并行的区别

在解释并发之前,我们需要了解另一个相关的词汇:“并行”。并发和并行有时会被混淆,但它们是不同的概念。

  • 并行:是指两个或多个任务在同一时刻真正地同时执行。想象一下,你有两个灶台可以同时用,一个在煮饭,另一个在煎鸡蛋。这两个操作是真正同时发生的,互不干扰。

在这里插入图片描述

  • 并发:并发并不一定要求任务在同一时刻执行。它更像是多个任务交替进行,比如你在一个灶台上先煮饭,然后趁着煮饭的时间去切菜,再回来搅拌锅里的饭。这些任务虽然不是严格意义上的同时进行,但它们是交替进行的,看起来像是同时进行的。

在这里插入图片描述

并发是两个队列交替使用一台咖啡机,而并行则是两个队列同时使用两台咖啡机。再用一个例子来解释:

  • 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
  • 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
  • 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

从上面的例子可以看出来,并发的关键就是需要能同时处理多个任务的能力,这个不一定是同时进行的。并行则关键是要能同时处理多个任务。二者的关键区别在于是否具备同时性。 这也很好的能在计算机上进行理解,在早期只有单核CPU的计算机上,随着系统CPU的时间片调度,系统可以支持并发和串行。而在目前多处理器的多核系统中,系统除支持并发与串行之外,还支持并行。

计算机中的并发是如何实现的

计算机中的并发通常通过操作系统和硬件的协作来实现。你可以把操作系统想象成一个非常高效的厨房主管,它会帮助你安排任务的顺序,并在你忙于一项任务时偷偷安排另一项任务。

在这里插入图片描述

多任务处理(Time-sharing)

大多数现代计算机可以同时运行多个程序。这是通过“时间片”来实现的,也就是操作系统把时间划分成非常短的片段(可能只有几毫秒),并让每个程序轮流使用CPU。虽然这些任务实际上是交替执行的,但由于时间片非常短,给人一种任务是同时进行的错觉。这就是多任务处理。

线程与进程

在计算机中,程序通常会被分成“进程”和“线程”来处理。

  • 进程:进程是程序运行时的实例,每个进程都有自己独立的内存空间。不同进程之间通常不会直接交互。
  • 线程:线程是进程内部的更小的执行单元。一个进程可以包含多个线程,这些线程可以共享进程的内存空间,这使得它们能够更加轻松地互相通信和共享数据。

通过使用多线程,一个程序可以看起来像是同时做多件事,例如,一个下载程序可以在下载文件的同时更新界面,给你实时显示下载进度。

在这里插入图片描述

同步与互斥

当多个进程或线程需要访问同一资源时,例如一个文件或一块内存,它们可能会产生冲突。为了避免这些冲突,计算机使用了一些机制来协调这些操作,其中最常见的两个概念是“同步”和“互斥”。

  • 同步:同步就像是一种协作协议,它确保多个线程在访问共享资源时能有序进行,而不会相互干扰。
  • 互斥:互斥是一种机制,确保在某一时刻只有一个线程可以访问特定资源。就像一间只有一把钥匙的房间,只有拿到钥匙的人才能进入,其他人必须等到钥匙归还后才能进入。

在这里插入图片描述

为什么并发很重要

并发使得计算机能够更加高效地利用资源。通过并发,一个计算机可以处理多个任务,即使这些任务本身可能比较小。比如,你可以在听音乐的同时进行文字处理,并且还能在后台下载文件。这一切都是通过并发来实现的。

此外,并发对于服务器和网络应用程序非常重要。比如,在处理网络请求时,服务器需要同时处理来自多个用户的请求,使用并发技术可以让服务器在短时间内处理更多的请求,从而提高效率和用户体验。

什么是高并发

高并发(Hight Concurrnet),从字面上来理解就是让单位时间同时处理任务的能力尽可能的高。对应到我们研发系统中,也就是说: 我们所开发的系统,要在短时间能能支持大量访问请求的情况。这种情况比如双十一活动,或者12306的抢票、以及秒杀等活动。 这要求我们的业务系统,在短时间内,尽可能多的接收来自客户端的请求,并做出准确的响应。

实际上,从另外一个角度考虑,我们所说的高并发,并行已经是其一个子集。毕竟,单个CPU或者单个系统节点的处理能力有限,而且成本昂贵, 我们需要通过多个节点,采用可扩展的方式,来实现支撑尽可能高的并发能力。而水平扩展的能力,实际上从另外一个角度来说,并行是提升系统并发能力的重要手段。

那么,既然是高并发,那么多高才算高呢?为了更好的对系统的高并发性进行评价,需要对如下指标进行了解:

  • 响应时间:系统对请求做出响应的时间,既然是高并发系统,这个响应时间就不可能太长,需要尽可能的短。
  • 吞吐量:系统单位时间内支持的最大请求数,当然越多越好。QPS是吞吐量最常用的量化指标之一。
  • 并发用户数:系统同时承载的正常使用功能的用户数量。如通信系统的同时在线人数。反应了系统的负载能力。这个指标当然越大越好。

重要参数如下:

  • QPS(TPS):每秒的Request/事务的数量
  • 并发数:系统同时处理的request/事务数量
  • 响应时间:平均的响应时间

QPS(TPS) = 并发数/平均响应时间

此外还有些相关的指标也需要了解:

  • PV(Page View): 页面访问量,即页面浏览量或点击量。
  • UV(Unique Visitor): 独立访客,统计1天内访问某站点的用户数。即按人按天去重。
  • DAU(Daily Active User):日活跃用户数量。通常统计一日(统计日)之内,登录或使用了某个产品的用户数,与UV概念相似。
  • MAU(Month Active User):月活跃用户数量,指网站、app等去重后的月活跃用户数量。

上述指标内容,主要是反映了高并发系统在高性能上的要求。做为高并发系统,需要实现的目标为:

  • 高性能:这体现了系统的并行处理能力,在有限资源的情况下,提升性能能节省成本。同时也给用户带来了更好的用户体验。
  • 高可用性:系统可以正常服务的时间,尽量避免系统的事故和宕机从而影响正常的业务。
  • 高扩展性:表示系统的扩展能力,系统具备更好的弹性,在流量高峰期能否短时间完成扩容,更平稳的承接流量峰值。

结语

尽管“并发”这个词在计算机领域中听起来很技术性,但它的核心思想并不难理解。通过类似于你在厨房里多任务处理的例子,我们可以看到并发实际上是让计算机看起来像是在同时做多件事的技术手段。理解了这些概念,不仅有助于更好地理解计算机的工作原理,还可以帮助你更有效地使用计算机资源。

欢迎关注公众号:“全栈开发指南针”
这里是技术潮流的风向标,也是你代码旅程的导航仪!

标签:计算机,系统,并行,杂谈,同时,并发,全栈,线程
From: https://blog.csdn.net/m0_46580983/article/details/141496208

相关文章

  • spring如何实现高可用高性能高并发
    在SpringBoot和SpringCloud中,可以通过以下方式实现高并发、高可用和高性能: 一、高并发 1. 异步处理-使用Spring的异步方法执行(@Async注解),将耗时的操作异步执行,不阻塞主线程,从而提高系统的并发处理能力。例如,对于一些数据处理、文件上传等操作,可以在后台异步进......
  • 高并发内存池-TCMalloc
    目录项目介绍什么是内存池定长内存池高并发内存池基数树结构申请和释放接口多线程并发环境测试全文件扩展和不足参考资料1.项目介绍1.这个项目做的是什么?当前项目是实现一个高并发的内存池,它的原型是google的一个开源项目tcmalloc,全称Thread-CachingMalloc,即线程缓......
  • 并发编程[10]_线程池
    本文介绍java中的线程池类ThreadPoolExecutor。我们可以利用ThreadPoolExecutor创建线程池,这个类中有多个构造方法。ThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueue<Runnable>workQueue)ThreadPoolEx......
  • 并发编程[5]_wait和notify
    1.wait和notifywait()方法是Object类中的方法,他的作用是让当前线程进入等待状态,而使用notify()方法可以唤醒。wait(long):void,参数是毫秒,表示等待毫秒数,直到时间结束或被唤醒;wait(long,int):void,第一个参数是毫秒,第二个参数是纳秒,如果纳秒在0-999999之间,则第一个......
  • 并发编程[2]_线程的常用方法
    介绍一下线程常用的一些方法1.run()和start()start()方法让线程进入就绪状态run()方法是Runnable中的一个抽象方法,线程启动时就会调用run()方法(1)如果直接调用run()方法,是不会启动新线程的publicclassTest1{privatestaticfinalLoggerlog=LoggerF......
  • 并发编程[1]_线程的创建
    介绍线程创建的两种基本的方法:继承Thread类和实现Runnable接口1.继承Thread类自定义类继承Thread类,重写run()方法importorg.slf4j.LoggerFactory;/***@author:yt*@date:2021/4/1222:09*@description:创建Thread类继承Thread*/publicclassMyTh......
  • 并发编程[3]_java线程的六种状态
    java线程状态1.操作系统进程的五种状态网上找了一张图:2.java线程的六种状态Thread类中getState()方法可以获取线程的状态,返回值是Thread类中的enum类型,取值有NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED六种状态。java的线程状态将阻塞状态细分为BLOCKED,WAITING......
  • 干货-并发编程提高——线程池(十二)
    提到线程池就不得不说池化技术,那么什么是池化技术呢?池化技术能够减少资源对象的创建次数,提高程序的性能。特别是高并发下这种提高更加明显。使用池化技术缓存的资源有如下特点:对象的创建时间长对象创建需要大量资源对象创建后可被重复使用有没有点儿像共享单车?一个资......
  • Java并发编程(八)
    1、volatile有什么用?能否用一句话说明下volatile的应用场景volatile保证内存可见性和禁止指令重排。volatile用于多线程环境下的单次操作(单次读或者单次写)。2、为什么代码会重排序在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排......
  • 仿Muduo库实现高并发服务器——Connection模块
            这个模块看着代码挺多的实则真的很多,但是不难,我为大家将各个函数拿出来理一理。    connection就是将主线程监听的网络套接字上的客户端套接字进行包装,使被包装的套接字可以进行,各种事件的处理,比如读写事件。下面就来详细看看。 这是connection模......