CPU 和 CPU Core 有啥区别?多核 CPU?多个 CPU?单核 CPU 为何也支持多线程呢?

news/2024/5/22 0:27:08/文章来源:https://blog.csdn.net/agonie201218/article/details/127183870

由于现在大多计算机都是多核CPU,多线程往往会比单线程更快,更能够提高并发,但提高并发并不意味着启动更多的线程来执行。更多的线程意味着线程创建销毁开销加大、上下文非常频繁,你的程序反而不能支持更高的TPS。

CPU 组成

CPU 全称 Central Processing Unit,中央处理器,计算机的大脑,长这个样子:

图片

CPU 通过一个插槽安装在主板上,这个插槽也叫做 CPU Socket,它长这个样子:

图片

而我们说的多核 CPU,一个 CPU 有几个核,这个核就是 Core

其实在很久之前是没有 Core 的概念的,一个 CPU 就是一个完整的物理处理单元,之后由于多核技术的发展,CPU 的概念转变为了一个容器(container),而 Core 则变成了真正的物理处理单元

一个 CPU 中可以有多个 Core,各个 Core 之间相互独立且可以并行执行

图片

所以你说一个多核 CPU 支不支持多进程/线程并行?

当然是可以的,进程具体是由 Core 来执行的,并不是说 1 个 CPU 同时只能执行 1 个进程/线程。

A core can work on one task, while another core works a different task, so the more cores a CPU has, the more efficient it is(一个核心可以执行一项任务,而另一个核心执行不同的任务,因此 CPU 拥有的核心越多,它的效率就越高)

一般来说,我们可以将一个 Core 分为三个主要部分:控制单元(Control Unit,CU)、算术逻辑单元(Arithmetic-Logic Unit,ALU)和内存(Memory)

  • 控制单元:使 Core 与计算机系统的其他组件进行通信
  • 算术逻辑单元:这个单元由执行算术和逻辑运算的电子电路组成。通常,ALU 执行四种算术运算 - 加、减、乘、除。此外,它通常执行三个逻辑操作 - 等于、小于和大于
  • 内存:内核中构建的内存由寄存器和缓存(L1 Cache 和 L2 Cache)组成。寄存器用于保存地址、指令和核心处理计算结果。缓存是高速随机访问存储器,它保存 Core 可能会(重新)使用的数据

除了这三大块,Core 中还包括时钟和总线,就不详细说了,下图显示了一个抽象的 Core 架构:

图片

那这些 Core 互相独立的执行任务,谁负责来对他们进行协调呢?

没错,CPU 上剩余的部分,也就是 UnCore 部分就是干这个事儿的:Coordinates cores for executing tasks in a computer system. (常见的比如 L3 Cache 就是在这里,一个 CPU 上的所有 Core 共享一个 L3 Cache)

图片

可以配合下面这个图片理解下,来源 https://www.intel.com/content/www/us/en/developer/articles/technical/performance-counter-monitor.html

图片

对于我们做上层 Web 开发的话,关注的应该是 CPU Core 的数量,而非 CPU 数量,比如常见的线程池的 corePoolSize 设置为 CPU 个数 * 2,这里的 CPU 个数,其实指的就是 CPU Core 的个数

当然了,还有 Hyper-threading 超线程这种技术,在 Core 的基础上再做扩展,将一个 Core 分裂成多个虚拟核心 Virtual Core

超线程

现代 CPU 除了处理器核心之外还包括寄存器、L1、L2 缓存这些存储设备、浮点运算单元、整数运算单元等一些辅助运算设备以及内部总线等。一个多核的 CPU 也就是一个 CPU 上有多个处理器核心,就意味着程序的不同线程需要经常在 CPU 之间的外部总线上通信,同时还要处理不同 CPU 之间不同缓存导致数据不一致的问题。

超线程这个概念是 Intel 提出的,简单来说是在一个 CPU 上真正的并发两个线程,由于 CPU 都是分时的(如果两个线程 A 和 B,A 正在使用处理器核心,B 正在使用缓存或者其他设备,那 AB 两个线程就可以并发执行,但是如果 AB 都在访问同一个设备,那就只能等前一个线程执行完后一个线程才能执行)。实现这种并发的原理是 在 CPU 里加了一个协调辅助核心,根据 Intel 提供的数据,这样一个设备会使得设备面积增大 5%,但是性能提高 15%~30%。

时间片

多任务系统往往需要同时执行多道作业。作业数往往大于机器的 CPU 数,然而一颗 CPU 同时只能执行一项任务,如何让用户感觉这些任务正在同时进行呢? 操作系统的设计者 巧妙地利用了时间片轮转的方式

时间片是 CPU 分配给各个任务(线程)的时间!

思考:单核 CPU 为何也支持多线程呢?

线程上下文是指某一时间点 CPU 寄存器和程序计数器的内容,CPU 通过时间片分配算法来循环执行任务(线程),因为时间片非常短,所以 CPU 通过不停地切换线程执行。

换言之,单 CPU 这么频繁,多核 CPU 一定程度上可以减少上下文切换。

上下文切换

  • 线程切换,同一进程中的两个线程之间的切换
  • 进程切换,两个进程之间的切换
  • 模式切换,在给定线程中,用户模式和内核模式的切换
  • 地址空间切换,将虚拟内存切换到物理内存

CPU 切换前把当前任务的状态保存下来,以便下次切换回这个任务时可以再次加载这个任务的状态,然后加载下一任务的状态并执行。任务的状态保存及再加载, 这段过程就叫做上下文切换。

每个线程都有一个程序计数器(记录要执行的下一条指令),一组寄存器(保存当前线程的工作变量),堆栈(记录执行历史,其中每一帧保存了一个已经调用但未返回的过程)。

寄存器 是 CPU 内部的数量较少但是速度很快的内存(与之对应的是 CPU 外部相对较慢的 RAM 主内存)。寄存器通过对常用值(通常是运算的中间值)的快速访问来提高计算机程序运行的速度。

程序计数器是一个专用的寄存器,用于表明指令序列中 CPU 正在执行的位置,存的值为正在执行的指令的位置或者下一个将要被执行的指令的位置。

  1. 挂起当前任务(线程 / 进程),将这个任务在 CPU 中的状态(上下文)存储于内存中的某处
  2. 恢复一个任务(线程 / 进程),在内存中检索下一个任务的上下文并将其在 CPU 的寄存器中恢复
  3. 跳转到程序计数器所指向的位置(即跳转到任务被中断时的代码行),以恢复该进程在程序中

img

线程上下文切换会有什么问题呢?

上下文切换会导致额外的开销,常常表现为高并发执行时速度可能会慢于串行,因此减少上下文切换次数便可以提高多线程程序的运行效率。

  • 直接消耗:指的是 CPU 寄存器需要保存和加载, 系统调度器的代码需要执行, TLB 实例需要重新加载, CPU 的 pipeline 需要刷掉
  • 间接消耗:指的是多核的 cache 之间得共享数据, 间接消耗对于程序的影响要看线程工作区操作数据的大小

切换查看

Linux 系统下可以使用 vmstat 命令来查看上下文切换的次数, 其中 cs 列就是指上下文切换的数目**(一般情况下, 空闲系统的上下文切换每秒大概在 1500 以下)**

img

线程调度

抢占式调度

指的是每条线程执行的时间、线程的切换都由系统控制,系统控制指的是在系统某种运行机制下,可能每条线程都分同样的执行时间片,也可能是某些线程执行的时间片较长,甚至某些线程得不到执行的时间片。在这种机制下,一个线程的堵塞不会导致整个进程堵塞。

java 使用的线程调使用抢占式调度,Java 中线程会按优先级分配 CPU 时间片运行,且优先级越高越优先执行,但优先级高并不代表能独自占用执行时间片,可能是优先级高得到越多的执行时间片,反之,优先级低的分到的执行时间少但不会分配不到执行时间。

img

协同式调度

指某一线程执行完后主动通知系统切换到另一线程上执行,这种模式就像接力赛一样,一个人跑完自己的路程就把接力棒交接给下一个人,下个人继续往下跑。线程的执行时间由线程本身控制,线程切换可以预知,不存在多线程同步问题,但它有一个致命弱点:如果一个线程编写有问题,运行到一半就一直堵塞,那么可能导致整个系统崩溃。

img

线程让出 cpu 的情况

  • 当前运行线程主动放弃 CPU,JVM 暂时放弃 CPU 操作(基于时间片轮转调度的 JVM 操作系统不会让线程永久放弃 CPU,或者说放弃本次时间片的执行权),例如调用 yield() 方法。
  • 当前运行线程因为某些原因进入阻塞状态,例如阻塞在 I/O 上
  • 当前运行线程结束,即运行完 run() 方法里面的任务

引起线程上下文切换的因素

  • 当前执行任务(线程)的时间片用完之后,系统 CPU 正常调度下一个任务
  • 中断处理,在中断处理中,其他程序” 打断” 了当前正在运行的程序。当 CPU 接收到中断请求时,会在正在运行的程序和发起中断请求的程序之间进行一次上下文切换。中断分为硬件中断和软件中断,软件中断包括因为 IO 阻塞、未抢到资源或者用户代码等原因,线程被挂起。
  • 用户态切换,对于一些操作系统,当进行用户态切换时也会进行一次上下文切换,虽然这不是必须的。
  • 多个任务抢占锁资源,在多任务处理中,CPU 会在不同程序之间来回切换,每个程序都有相应的处理时间片,CPU 在两个时间片的间隔中进行上下文切换

因此优化手段有:

  • 无锁并发编程,多线程处理数据时,可以用一些办法来避免使用锁,如将数据的 ID 按照 Hash 取模分段,不同的线程处理不同段的数据
  • CAS 算法,Java 的 Atomic 包使用 CAS 算法来更新数据,而不需要加锁
  • 使用最少线程
  • 协程,单线程里实现多任务的调度,并在单线程里维持多个任务间的切换

合理设置线程数目既可以最大化利用 CPU,又可以减少线程切换的开销。

  • **高并发,低耗时的情况,**建议少线程。
  • 低并发,高耗时的情况:建议多线程。
  • **高并发高耗时,**要分析任务类型、增加排队、加大线程数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_19417.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaSE --- 学Java你应该知道的历史

目录 一. Java的历史 1. Java的发明人詹姆斯高斯林 2. Java的logo 3. java的发展 二. Java 语言的特性 🐖🐖🐖🐖如果喜欢!!🐂🐂🐂🐂 🐖&#x1f4…

创建PyQt项目需要配置三个的External Tools

1. Qt Designer:Qt设计器 Qt Designer D:\PyQtLearning\venv\Lib\site-packages\QtDesigner\designer.exe $ProjectFileDir$ 2. PyUIC:将.ui文件转换为.py文件 PyUIC D:\PyQtLearning\venv\Scripts\pyuic5.exe -o $FileNameWithoutExtension$.py $Fi…

Apache HBase API及备份与还原

一、Apache HBase API Apache HBase也适用于多个外部API。有关更多信息,请参阅Apache HBase外部API(将在下一节的内容中介绍)。 有关使用本机HBase API的信息,请参阅User API Reference和HBase API章节。 示例: 使…

JVM-2.垃圾回收

目录 一、如何判断对象可以回收 1.1 引用计数法 1.2 可达性分析算法 二、五种引用 2.1 强引用 2.2 软引用(SoftReference) 2.3 弱引用(WeakReference) 2.4 虚引用(PhantomReference) 2.5 终结器引…

07 hook学习01

hook学习01Hooks理解useStateuseEffect自定义hook函数Hooks理解 react组件分为类组件和函数组件 函数组件是一个更加匹配react的设计理念UI f(data),利于逻辑拆分与重用的组件表达形式,而之前的函数组件是不可以有自己的状态的,为了能让函…

第二章:微服务架构构建

第二章&#xff1a;微服务架构构建 2.1&#xff1a;IDEA新建project工作空间 父工程步骤 New Project 聚合总父工程名字 Maven版本选择 字符编码 注解生效激活 Java编译版本选择8 父工程pom文件 <?xml version"1.0" encoding"UTF-8"?&g…

谷粒商城 nacos

下载nacos&#xff1a;https://github.com/alibaba/nacos/releases启动 startup.cmd -m standalone依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></depende…

(附源码)计算机毕业设计ssm大学生健康系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Vue学习第37天——.sync修饰符、$attrs和$listeners属性的使用场景和案例

目录一、.sync修饰符作用使用场景使用方法案例.sync修饰符的优势二、$attrs作用使用场景使用方法案例$attrs注意点三、$listeners作用使用场景使用方法案例$listeners注意点一、.sync修饰符 作用 之前组件进行双向绑定时&#xff0c;需要通过proos进行父传子&#xff0c;再通…

Python 实现DNS查询放大攻击

查询放大攻击的原理是&#xff0c;通过网络中存在的DNS服务器资源&#xff0c;对目标主机发起的拒绝服务攻击&#xff0c;其原理是伪造源地址为被攻击目标的地址&#xff0c;向DNS递归服务器发起查询请求&#xff0c;此时由于源IP是伪造的&#xff0c;固在DNS服务器回包的时候&…

六自由度模拟飞行C++教程

六自由度模拟飞行C教程 带引导、控制和导航 课程英文名&#xff1a;Flight Dynamics in Six Degrees of Freedom 此视频教程共14.5小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c;源码附件全 下载地址 百度网盘地址&#xff1a;https://pan.baidu.com…

云原生|kubernetes|k8s集群测试时的一些基本操作

前言&#xff1a; kubernetes集群作为一个能够明显提升生产力的工具&#xff0c;还是需要多多练习一些基本操作的&#xff0c;我说的基本操作主要是针对基本的测试环节而不是生产环境下的操作。例如&#xff0c;在生产环境下用命令行启动一个pod并通过NodePort把这个pod运行的…

前端性能优化 - 华为面试题

前端性能优化面试题 前端性能优化总体来说分为 &#xff1a;优化请求、打包优化、代码优化 。 文章目录前端性能优化面试题Ⅰ、如何优化请求图片方面① 精灵图 ② 小图标 Base64③ 图片懒加载④ 图标库 采用 svg请求内容方面 ① 减少请求内容大小 ②更改请求方式③ 防抖节流④…

PyCharm 的初始设置

PyCharm 的官方网站地址&#xff1a;https://www.jetbrains.com/pycharm/ 教育版下载地址&#xff1a;https://www.jetbrains.com/pycharm-edu/download/#sectionlinux 专业版下载地址&#xff1a;https://www.jetbrains.com/pycharm/download/#sectionlinux 1、恢复 PyCharm …

视觉里程计

2D-2D&#xff1a;对极几何 C0, C1分别是两个位置中相机的光心&#xff0c;也就是针孔相机模型中的针孔 P是空间中的一个三维点&#xff0c;p0, p1分别是P点在不同成像平面上对应的像素点 C0-C1-P-p0-p1他们都是在同一个平面上的&#xff0c;你可以想象C0-C1-P组成的平面是一个…

5_循环神经网络 RNN

RNN什么是RNN序列数据处理序列数据的神经网络RNN弊端LSTM什么是RNN 循环神经网络RNN用于语言分析, 序列化数据。 序列数据 有一组序列数据 data 0,1,2,3. 在当预测 result0 的时候,我们基于的是 data0, 同样在预测其他数据的时候, 我们也都只单单基于单个的数据. 每次使用的…

零基础小白复现Java 若依项目

若依项目1 概述2 环境配置3 打包项目4 导入项目5 配置项目数据库连接&#xff0c;数据源配置6 然后运行代码1 概述 RuoYi-Vue 是一个 Java EE 企业级快速开发平台&#xff0c;基于经典技术组合&#xff08;Spring Boot、Spring Security、MyBatis、Jwt、Vue&#xff09;&#x…

redis常用命令,redis入门,启动redis,启动哨兵

Redis服务器默认使用6379号端口&#xff0c;通过–port参数可以自定义端口号&#xff1a; 正确停止Redis的方式应该是向Redis发送SHUTDOWN命令&#xff0c;方法为&#xff1a; Redis可以妥善处理SIGTERM信号&#xff0c;所以使用kill Redis进程的PID也可以正常停止Redis&#…

yolov3 spp讲解

1、yolov3 spp各个版本对比 yolov3 spp版本主要在以下几个方面做了改进&#xff1a;(1)、Mosaic图像增强&#xff1b;&#xff08;2&#xff09;、SPP模块&#xff1b;&#xff08;3&#xff09;、CIOU Loss ;&#xff08;4&#xff09;、Focal Loss . 2、Mosaic图像增强 Mosai…

聊一聊ShardingSphere的读写分离

什么是 ShardingSphere Apache ShardingSphere 是一款分布式的数据库生态系统&#xff0c; 可以将任意数据库转换为分布式数据库&#xff0c;并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。 ShardingSphere-JDBC ShardingSphere-JDBC 定位为轻量级 Java 框架&…