如果有一个全新的对象在并发标记阶段产生进入老年代,但没有被标记,CMS如何知道这个对象的存在?是重新标记会从GC root重新扫描吗? 如果是的话还何…
顺晟科技
2021-06-28 19:38:24
161
看了很多文章,还是没搞懂 多 CPU、多 CPU 核心 和 进程、线程的关系。 最开始个人理解是 多 CPU 是有多个 CPU 芯片(以下的 CPU …
首先作一个假定:下文的cpu代指cpu内核,多内核cpu直接理解成多cpu。
下面开始论述
对cpu而言,没有什么线程进程,只有正在执行的指令。同一个cpu一次只能执行一条指令。
线程进程是os的概念。一个进程包括独立内存空间下的线程和数据
os在调度时会将进程的内存空间映射好,然后胺(笔误,是按)自身逻辑选择适当的线程交给cpu,cpu执行其指令代码。
因此,对cpu来说,既可执行单一进程的指令,也可执行os调度后的不同进程指令。这两者对cpu本身没有任何不同。
对os而言,调度不同进程下的线程时需要切换内存映射,调度同一进程内的线程不需要切换内存映射。
仅此而已
这些都是操作系统的基本概念:
线程,操作系统调度最小单位就是线程,也就是说,无论是a进程的线程,还是B进程的线程,在线程调度器面前都是一样的,调度器会按照一定规则, 安排这一堆线程轮流到CPU上运行。
进程,是操作系统为了方便管理资源的一个容器。简单的理解,就是给多个线程进行分个组,进程就是这个组起的一个名字,跟调度没啥关系。
CPU ,无论是多核CPU,还是多个CPU,操作系统层面,都是把它看成一个可以执行线程的单元。也就是说,如果一台电脑,只有一个CPU,这个CPU是8核的,操作系统的调度器面前,看到的就是有8个执行单元,同一时刻,就可以安排8个线程进行运行。所以操作系统,不看CPU的个数,也不看 CPU的核心数(现代CPU一般还有超线程技术,一个核心还能虚拟成多个执行单元),只看CPU的执行单元有多少个,来决定同一时刻可以安排多少线程运行。
你是多加了一层戏。
CPU和CPU核心不要分成两层理解,你就当作每个CPU单独就是一个核心即可。
至于市面上卖的多核CPU,你就当作买了多个单核CPU即可,它只是正好装在一个盒子里。至于电气上怎么实现的,是卖主板的人实现的,和你无关。
这样就不存在CPU和进程的绑定关系了,每个进程至少会有一个线程,但也可以有多个线程,可以分配给多个核心。
那么一个进程的多个线程,在针对同一份共享的数据操作的时候,就可能存在可见性问题,因为CPU在执行指令的时候,是先将内存里的数据读取到核心内置的缓存里面的,那么刚算出来的结果,未必保证能当场写回主内存,另一个核心不知道有这事,也访问不到其他核心的缓存,必须从内存中读取数据,这就要闯祸。
现代CPU,至少有3层缓存,L1和L2一般是每个核心独有的,但L3缓存就是一整块CPU共享的,到这层就容易出问题了,再往下还有内存,问题更复杂化。
26
2022-09
28
2021-06
28
2021-06