初识并发编程

并发是同一时间应对多件事情的能力------Rob Pike

并发编程是指在软件开发中处理多个任务或线程的方式 。它涉及到同时执行多个任务,而不是一个接一个地执行。并发编程的目标是提高程序的效率和响应能力 ,使得程序能够更好地处理用户的请求,提高系统的吞吐量和并发性能

CPU 架构

CPU(Central Processing Unit)是计算机中的中央处理器,它是计算机的大脑,负责执行程序指令、进行算术和逻辑运算,控制数据传输和处理。

单核 CPU 与多核 CPU

单核CPU

  • 单核 CPU 是一种最基本的 CPU 架构,它只有一个处理器核心。
  • 单核 CPU 通常只能同时执行一个任务,因此在执行多个任务时,会进行任务的排队和切换,从而导致任务执行的不连续和效率低下。

单核CPU的优势在于价格低廉和简单的结构,一般适用于个人电脑、平板电脑和一些轻量级设备。

多核CPU

  • 多核 CPU 是一种具有多个处理器核心的 CPU 架构。
  • 多核 CPU 可以同时执行多个任务,提高了计算机的处理能力和性能。

单核 CPU 和多核 CPU 的区别及优势

区别

  • 单核 CPU 只有一个处理器核心,而多核 CPU 具有多个处理器核心。
  • 单核 CPU 只能同时执行一个任务,而多核 CPU 可以同时执行多个任务。
  • 单核 CPU 的处理能力相对较低,而多核 CPU 的处理能力更高。

优势

  • 多核 CPU 相比单核 CPU 具有更高的处理能力和性能,能够更好地利用系统资源,提高计算机的吞吐量和响应速度。
  • 多核 CPU 可以同时执行多个任务,提高了计算机的并发处理能力。
  • 多核 CPU 通过超线程技术可以提高单个任务的执行效率。
  • 多核 CPU 的价格相对较高,但对于需要高性能计算和多任务处理的场景,它是一个很好的选择。

多核CPU如何实现并行处理

在早期只有一个 CPU 核心时,我们的任务是怎么处理的呢?是的,并发解君愁。当然,这里还得提到操作系统的多线程,正是操作系统多线程 + CPU 核心,才实现了现代化的多任务操作系统。在 OS 级别,多线程负责管理我们的任务队列,你可以简单认为一个线程管理着一个任务队列,然后线程之间还能根据空闲度进行任务调度。我们的程序只会跟 OS 线程打交道,并不关心 CPU 到底有多少个核心,真正关心的只是 OS,当线程把任务交给 CPU 核心去执行时,如果只有一个 CPU 核心,那么它就只能同时处理一个任务

多核心并行

当 CPU 核心增多到 N 时,那么能够在同一时间就能有 N 个任务被处理,则并行度就是 N,相应的处理效率也变成了单核心的 N 倍。

多核心并发

当电脑的处理器核心增多时,操作系统需要处理的任务也会增多。这些任务被分成几个队列,然后交给处理器核心去执行。虽然看起来好像所有任务都在同时进行,但实际上,每个核心在同一时刻只能处理一个任务。所以,虽然任务都在同时进行,但实际上只有少数任务能够真正地同时被处理。

进程与线程

进程和线程是操作系统中用于执行任务的基本单位。它们之间有一些重要区别:

进程

  • 进程是程序的一次执行实例,拥有独立的内存空间和资源。
  • 每个进程都有自己的地址空间、文件描述符、环境变量等。
  • 进程之间通常是相互独立的,彼此不会影响。
  • 进程之间的通信需要使用 IPC(Inter-Process Communication)机制,如管道、消息队列、共享内存等。

线程

  • 线程是在进程内部执行的轻量级任务单元,共享进程的资源。
  • 线程共享相同的地址空间和文件描述符,可以直接访问进程的全局变量和数据。
  • 线程之间的切换比进程之间的切换更快速,因为不涉及地址空间的切换。
  • 线程之间的通信更容易,可以直接通过共享内存等方式进行通信。

并发与并行

  • 究竟什么是并发?
  • 它与并行有什么区别?

理解并发编程的关键是理解并发的概念。

  • 并发是指在同一时间处理多个任务;并发编程主要关注如何处理多个任务。
  • 并行是指真正同时执行多个任务;并行编程则关注如何真正同时执行多个任务。

Erlang 之父约瑟夫·莱斯利·阿姆斯特朗用一张很形象的图片解释了并发与并行的区别:

从上图可以看出:

  • 并发是多个队列使用同一个咖啡机,然后两个队列轮着使用(未必是1:1 轮换,也有可能是其他轮换规则),但最终每个人都能接到咖啡
  • 并行是每个队列都拥有一个咖啡机,最终也是每个人都能接到咖啡,但是效率更高,因为同时可以有两个人在接咖啡

并发和并行都是对"多任务"处理的描述,其中并发是轮流处理,而并行是同时处理 。正如 Go 语言之父 Rob Pike 曾说过:并发不是并行,并发关乎结构,并行关乎执行

相关推荐
qw9494 分钟前
SpringMVC
java·后端
customer0823 分钟前
【开源免费】基于SpringBoot+Vue.JS医疗报销系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
B站计算机毕业设计超人27 分钟前
计算机毕业设计SpringBoot+Vue.jst房屋租赁系统(源码+LW文档+PPT+讲解)
vue.js·spring boot·后端·eclipse·intellij-idea·mybatis·课程设计
白起那么早1 小时前
idea插件之GoGenerator
go·intellij idea
m0_748248652 小时前
SpringBoot整合easy-es
spring boot·后端·elasticsearch
一个热爱生活的普通人2 小时前
golang的切片(Slice)底层实现解析
后端·go
红目香薰2 小时前
Trae——慧码速造——完整项目开发体验
后端
Vcats3 小时前
深入浅出:基于SpringBoot和JWT的后端鉴权系统设计与实现
java·spring boot·后端
~kiss~3 小时前
Rust~二刷异步逻辑
开发语言·后端·rust
SomeB1oody3 小时前
【Rust中级教程】2.7. API设计原则之灵活性(flexible) Pt.3:借用 vs. 拥有、`Cow`类型、可失败和阻塞的析构函数及解决办法
开发语言·后端·性能优化·rust