GitHub B站UP主:sBobHuang

多线程 多进程

操作系统的设计,因此可以归结为三点:
(1)以多进程形式,允许多个任务同时运行;
(2)以多线程形式,允许单个任务分成不同的部分运行;
(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

CPU数、核数、processor数

一个CPU会说自己的线程,民用的往往是四核四线程,四核八线程

我们可以看看大佬的处理器,我的信息实在是太垃圾了

理论上来说,对于计算密集型的任务,线程数应该和CPU所能提供的并行数一致。那这里的“并行数”应该采取物理核数还是processor数呢,要根据实际情况来,看你使用的资源。

所以多核和超线程到底带来了什么,就是并发,但是还取决于其他资源,比如我们的IO资源还是有限的,甚至在操作系统谈到了专门搞一台机器进行IO的运算;比如你时常需要到硬盘上取东西,可能就需要一块ssd了。但是我需要取很多东西,我可以搞个中间件,每台都发出东西,使用普通硬盘,既便宜又安全。

我们CPU实际上要经过取指、解码、执行,而且其中还是有一个流水线的,可以改善性能,就是可以分别同时运行

关于CPU的多核和多线程

 

1、CPU的物理个数由主板上的插槽数量决定,每个CPU可以有多核心,每核心可能会有多线程。

 

2、多核CPU的每核(每核都是一个小芯片),在OS看来都是一个独立的CPU

 

3、对于超线程CPU来说,每核CPU可以有多个线程(数量是两个,比如1核双线程,2核4线程,4核8线程),每个线程都是一个虚拟的逻辑CPU(比如windows下是以逻辑处理器的名称称呼的),而每个线程在OS看来也是独立的CPU


这是欺骗操作系统的行为,在物理上仍然只有1核,只不过在超线程CPU的角度上看,它认为它的超线程会加速程序的运行。


 

4、要发挥超线程优势,需要操作系统对超线程有专门的优化。

 

5、多线程的CPU在能力上,比非多线程的CPU核心要更强,但每个线程不足以与独立的CPU核心能力相比较。

 

6、每核上的多线程CPU都共享该核的CPU资源
例如,假设每核CPU都只有一个"发动机"资源,那么线程1这个虚拟CPU使用了这个"发动机"后,线程2就没法使用,只能等待。
所以,超线程技术的主要目的是为了增加流水线上更多个独立的指令,这样线程1和线程2在流水线上就尽量不会争抢该核CPU资源。所以,超线程技术利用了superscalar(超标量)架构的优点。

 

7、多线程意味着每核可以有多个线程的状态。比如某核的线程1空闲,线程2运行。

 

8、多线程没有提供真正意义上的并行处理,每核CPU在某一时刻仍然只能运行一个进程,因为线程1和线程2是共享某核CPU资源的。可以简单的认为每核CPU在独立执行进程的能力上,有一个资源是唯一的,线程1获取了该资源,线程2就没法获取
但是,线程1和线程2在很多方面上是可以并行执行的。比如可以并行取指、并行解码、并行执行指令等。所以虽然单核在同一时间只能执行一个进程,但线程1和线程2可以互相帮助,加速进程的执行。
并且,如果线程1在某一时刻获取了该核执行进程的能力,假设此刻该进程发出了IO请求,于是线程1掌握的执行进程的能力,就可以被线程2获取,即切换到线程2。这是在执行线程间的切换,是非常轻量级的。(WIKI: if resources for one process are not available, then another process can continue if its resources are available)

 

9、多线程可能会出现一种现象:假如2核4线程CPU,有两个进程要被调度,那么只有两个线程会处于运行状态,如果这两个线程是在同一核上,则另一核完全空转,处于浪费状态。更期望的结果是每核上都有一个CPU分别调度这两个进程。

cacha我们知道就是为了加快运算速度设置的缓存器(因为寄存器>SRAM>DRAM>磁盘,当然也越来越便宜),为了更好使用,我们还有三级缓存,这个在多核里是怎样的呢

 

1、每核心都有一个自己的L1缓存。L1缓存分两种:L1指令缓存(L1-icache)和L1数据缓存(L1-dcache)。L1指令缓存用来存放已解码指令,L1数据缓存用来放访问非常频繁的数据。

 

2、L2缓存用来存放近期使用过的内存数据。更严格地说,存放的是很可能将来会被CPU使用的数据。

 

3、多数多核CPU的各核都各自拥有一个L2缓存,但也有多核共享L2缓存的设计。无论如何,L1是各核私有的(但对某核内的多线程是共享的)

 

1。被一个核挂起后到另一个核上开始跑。
2。一个进程的多个线程同时在多个核上跑

均可以,因为L3是共有的。缓存的一致性就要靠MESI协议来保证,我们在多线程中要使用rmp() wmb()保证

 

关于cache的连接也很奇特,有CCX、Ring Bus、Me (各有取舍,超多核的还不够优秀)

Ring Bus设计了两圈高速总线,将CPU、L3 Cache、外围和其他Ring联系起来。Ring有两种运行方法,一种为顺时针,一种为逆时针。

Mesh是intel将核心排布为棋盘状,比Ring架构自由的多,并支持连接更多的核心。

高级胶水,CCX和infinity fabric 

 

posted @ 2019-07-20 22:18  暴力都不会的蒟蒻  阅读(...)  评论(... 编辑 收藏
TOJ