并发、并行、异步、同步

并发、并行、异步、同步

b站 奇乐编程学院 一个视频告诉你“并发、并行、异步、同步”的区别

并发:concurrency

并行:parallelism

异步:asynchronous

同步:synchronous

  • 并发:表示计算机能够同时执行多项任务。对单核处理器来说,用的是分配时间片的方法,上下文切换(context switching)(任务1执行一段时间切换到任务2,任务2执行一段时间切换到任务1);
  • 并行:对多核来说,在不同核心执行不同任务,并行处理多个任务。
  • 同步:编程模型,等到前一个任务执行完成后,才能进行下一个任务,没有并发、并行的概念。
  • 异步:编程模型,不同任务之间不会相互等待、先后执行,运行任务1也可以同时运行任务2。典型实现异步的方式是“多线程”编程(multithreading),python里的asyncio、C++20里的co_await。

创建多个线程并启动,在多核环境下每个线程会被分配到独立的核心上运行,实现“并行”,在单核环境下,操作系统会通过分配时间片的方式来执行这些线程,“并发”。

通过“函数回调” function callback机制,实现单线程的并发,比如javascript里的fetch()函数。

多线程编程 VS. (单线程)异步编程:

对于I/O密集型的应用程序,比如web应用经常执行网络操作,适合使用异步编程。此时如果使用多线程,会浪费系统资源,因为每个线程的绝大多数时间都是在等待这些I/O操作,而线程自身会占用额外的内存,线程的切换也会有额外的开销、以及线程资源竞争。

对于计算量密集的应用,适合多线程编程。

对于I/O操作密集的应用,大多数时间CPU都是在等待这些IO操作的完成,CPU会处于空闲操作,如果使用多线程等待线程自身还有切换+内存开销,会浪费系统资源。所以服务器程序通常都是1个线程处理一个客户端请求,在“这个”线程中会完成所有的数据库/文件系统/网络等待操作。

其实没有看很懂。

多线程编程:一次性搞懂线程同步机制

b站 奇乐编程学院 多线程编程:一次性搞懂线程同步机制

看完感觉不是非常明白。

同步和异步,阻塞和非阻塞

b站 同步和异步,阻塞和非阻塞-结合一个例子简单说明

  • 同步客户端有一个请求的连接,请求服务器端处理一个数据、返回一个结果,但是服务器端计算这个结果的过程很长,连接就要处于一直等待的状态下。
  • 异步客户端有一个请求的连接,请求服务器端处理一个数据、返回一个结果,但是服务器端计算这个结果的过程很长,客户端不想等待,直接连接返回(直接返回,此时并没有真正得到服务器端返回的结果),因此还有一个消息,消息回写的接口或服务,用来当服务器端把结果算出来后,通过消息回写把数据给客户端。

请求线程:客户端发一个请求给服务端,服务端接收到这个叫请求线程。

处理线程:服务端接收到后,去进行处理数据的过程叫处理线程。(比如处理完的结果再返回给客户端)

  • 阻塞:针对服务器端的请求线程、处理线程来说的,线程不能做别的事,请求线程要一直处于等待状态
  • 非阻塞:针对服务器端的请求线程、处理线程来说的,请求线程发出请求给处理线程之后,不用一直等待,这个请求线程可以快速释放回资源池,去处理其它请求。但是这个请求线程每隔10s、或20s,要轮询一下处理线程,去查看处理线程完成了没有。如果完成了,请求线程就拿着结果返回给客户端。

消息队列。