多处理器 与 多核的区别
首先要区分是多核,还是多cpu 这是两种不同的处理器架构,如下:
对于多核心的架构,由于共用一套MMU和cache,所以地址空间是一个,同一时刻只能运行一个进程,此时进程不能并行只能并发。同一个进程下的多线程可以并行执行,因为多线程共享同一套进程空间资源。
对于多cpu架构可以支持进程并行。
多核只能支持一个进程内的线程并行。进程并发。
多核CPU和多CPU的区别主要在于性能和成本 (?)
一般机器都为单cpu多核,平常说的4核8线程
线程和核的关系
线程需要 核 执行,一个核在同一时间只能执行一条线程,这里的核指逻辑核。
决定同时执行线程数的是逻辑核还是物理核
逻辑核心多少个,就可以 “同时” 执行多少线程。
n个物理核,一般有2n个逻辑核,如果只能同时运行物理核数个个线程(n),那超线程技术模拟出来的核有什么用? 况且很多CPU的商品也不标 “逻辑核数”,用的词是 “线程数”,意思应该就是逻辑核心多少个就能同时运行多少个线程(2n)。
x核y线程(y比x大)是什么意思
CPU商品说的2核4线程,指2个物理核,4个逻辑核。4线程就是4个逻辑核的意思。
进程和线程
进程是操作系统层面的概念,线程是CPU层面的东西,CPU真正执行的是线程而不是进程
进程是是静态的概念,是一些资源的集合,比如进程有自己的内存;而线程是动态的概念
进程可以有多个线程,这些线程共享同一份进程的资源
多进程,目前多核的情况下,可以做到多个进程同时执行;当然也就可以做到多个线程同时执行。但是单核的CPU无法做到 “同时”
进程是一定有端口号吗? 不一定,没网络暴露的就没有
————————————————
以下来自:
https://cloud.tencent.com/developer/article/1886157
区分 多CPU && 多核CPU
最早意识到这两个概念可能不一样是在什么时候呢,不是在买电脑的时候哈,是在安装虚拟机的时候。
安装虚拟机的时候,有一步是要我们选择虚拟机的CPU数量和核数的,我当时其实就有点懵,这俩有区别吗?2CPU各2核和1CPU4核有什么不一样吗?这还要选啊?
但是很快就打消了这个疑虑,没有太在意了。现在想想,错过了认知的机会啊。 一个CPU呢,可以由很多的核,但是,它依旧是一个CPU,不会因为它开了8个核就变成了八个CPU。
这里的CPU,是物理CPU,后面就以物理CPU来命名。此外,还有逻辑CPU,逻辑CPU数怎么算呢? 物理CPU数 * 每个CPU核数,如果支持超线程的话,再乘个2。
这些概念先记一下,后面要用。
多个物理CPU,CPU通过总线进行通信,效率比较低。
多核CPU,不同的核通过L2 cache进行通信,存储和外设通过总线与CPU通信。
CPU缓存
CPU缓存是位于CPU与内存之间的临时数据交换器,它的容量比内存小的多但是交换速度却比内存要快得多。CPU缓存一般直接跟CPU芯片集成或位于主板总线互连的独立芯片上。
随着多核CPU的发展,CPU缓存通常分成了三个级别:L1,L2,L3。级别越小越接近CPU,所以速度也更快,同时也代表着容量越小。L1 是最接近CPU的, 它容量最小,速度最快,每个核上都有一个 L1 缓存,L1 缓存每个核上其实有两个 L1 缓存, 一个用于存数据的 L1d Cache,一个用于存指令的 L1i Cache。L2 缓存 更大一些,速度要慢一些, 一般情况下每个核上都有一个独立的L2 缓存; L3 缓存是三级缓存中最大的一级,同时也是最慢的一级, 在同一个CPU插槽之间的核共享一个 L3 缓存。
读取数据过程。就像数据库缓存一样,首先在最快的缓存中找数据,如果缓存没有命中则往下一级找, 直到三级缓存都找不到时,向内存要数据。一次次地未命中,代表取数据消耗的时间越长。
计算过程。程序以及数据被加载到主内存;指令和数据被加载到CPU的高速缓;CPU执行指令,把结果写到高速缓存;高速缓存中的数据写回主内存。
多CPU && 多核CPU | 多进程 && 多线程 | 并行 && 并发 之间的关系
1、进程的运行不仅仅需要CPU,还需要很多其他资源,如内存啊,显卡啊,GPS啊,磁盘啊等等,统称为程序的执行环境,也就是程序上下文。
2、线程是CPU调度和分配的基本单位,一定要和 进程是操作系统进行资源分配(包括cpu、内存、磁盘IO等)的最小单位 区别清楚。有句话说CPU只能看到线程,可以这么理解,假设我是CPU,我闭着眼,操作系统调度器将一个进程分配给我之后,我拿到进程睁开眼,我看到的是什么?我看到的是进程中的很多线程,那么我现在能调度和分配的是什么?进程?不行,因为我看不到其他进程,何来调度分配,只能调度我看到的那些线程,如果我是4核的话,把线程ABCD分配到核心1234,其他的线程依然要等待分配,至于等待多久,如何分配,暂不在本文讨论范围。
3、多核心技术是将多个一样的CPU放置于一个封装内(或直接将两个CPU做成一个芯片),而英特尔的HT技术(超线程技术)是在CPU内部仅复制必要的资源、让一个核模拟成两个线程;也就是一个实体核心,两个逻辑线程,在一单位时间内处理两个线程的工作,模拟实体双核心、双线程运作。
4、一个进程最多在一个物理CPU上运行(能拿到资源不错了),如果这个CPU的空闲的核大于等于进程的线程数,就安排了,如果不够,那就先安排一部分线程,其余的等着。
多核CPU,可以并行执行多进程、多线程。多线程应该不用我解释了,多进程参考nginx架构。 多个CPU,可以并行执行多进程,自然可以并行多线程。怎么并行多进程呢?要么咱多手动多开几个进程,要么fork出子进程。
Linux下查看CPU相关信息
CPU的信息主要都在/proc/cupinfo中:
# 查看物理CPU个数
cat /proc/cpuinfo|grep "physical id"|sort -u|wc -l
# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo|grep "cpu cores"|uniq
# 查看逻辑CPU的个数
cat /proc/cpuinfo|grep "processor"|wc -l
# 查看CPU的名称型号
cat /proc/cpuinfo|grep "name"|cut -f2 -d:|uniq
Linux查看某个进程运行在哪个逻辑CPU上
ps -eo pid,args,psr
#参数的含义:
pid - 进程ID
args - 该进程执行时传入的命令行参数
psr - 分配给进程的逻辑CPU
例子: [~]
# ps -eo pid,args,psr | grep nginx
9073 nginx: master process /usr/ 1
9074 nginx: worker process 0
9075 nginx: worker process 1
9076 nginx: worker process 2
9077 nginx: worker process 3
13857 grep nginx 3
=========================================
这个得分情况讨论,如果是以前单核时代的CPU,那只能同时运行一个进程或者一个线程,因为这个时代的CPU只有一个MMU。
后来出现了多核CPU,假如现在有一个双核CPU,那这个CPU就能同时运行两个线程,但仍然只能同时运行一个进程,因为这个双核CPU仍然只有一个MMU。
再后来,CPU厂商为每个CPU核心配置了MMU,这个时候的CPU就能同时运行多个进程和多个线程。
后来又出现了超线程技术,比如inter的i3-5005u就是一个双核四线程的CPU,这个CPU就能同时运行四个进程,或者同时运行四个线程。
————————————————
参考:
https://www.zhihu.com/question/271821176
https://cloud.tencent.com/developer/article/1886157