重学Linux原理之一

硬件:

CPU是怎么运行的?

这个问题在写并发程序的时候困惑过我,  我一直搞不清楚并发的  可见性 和 volatile 到底是怎么实现的。

虽然看过很多帖子 , 但是模糊不清。

研究了 CPU 和 Linux的内存模型才有了一下见解。

首先CPU如同一个资源嵌在主板上,处理器的执行由外部时钟来监控。这个时钟称为系统时钟,它每隔相同的时间间隔就向CPU发送一个脉冲。在每个时钟脉冲上,处理器都会做一些工作。比如,处理器每个时钟脉冲上执行一条指令。处理器的速度一般以系统时钟的速率来描叙(说到这里,我知道了以前玩超频到底怎么回事, 提高)。一个100MHz的处理器每秒将接收100,000,000 个时钟滴答。但是用CPU的时钟频率来描叙CPU的工作能力是不正确的,因为它们执行的指令不相同。另外CPU并不总是100%工作的,它取决于操作系统分配给它的用户指令。(CPU有两种执行指令方式:内核和用户,支持VM的CPU还有客户模式用来运行虚拟机指令)

然而,快速的时钟可以在某种程度上代表高性能的CPU。处理器执行的指令是非常简单的;例如"将内存X处的内容读入寄存器Y"。寄存器是微处理器的内部存储部件,用来存储数据并对数据执行某些指令。寄存器依据存储内容不同分为多种,常见如:PC(程序计数器,记录下条指令地址,执行指令后自增长),SP(堆栈指针),PS(处理结果,执行方式等)。有些指令有可能使处理器停止当前的工作而跳转到内存中另外一条指令执行(操作系统就是这样进行进程切换的) 。

在CPU的外部还有一些缓存, 如 一级缓存, 二级缓存,  他们快于内存, 慢于寄存器,  主要作用就是提高速度。

在Java中不同线程也同进程一样被CPU在不同时刻或同时执行,  内存中的数据必须读入寄存器中才能被运算, 当先一个线程改变寄存器中的数据但没有同步到内存中时,其他线程重复从内存相同位置读取数据到寄存器,使得在寄存器中不同时刻代表相同意义的数据不一致, 而且 volatile关键字就是标志JVM保证变量在寄存器中的改变和内存是保持一致的。

而Java中的锁都是在JVM级别直接避免不同线程在同一时刻操作相同数据的机制。

猜你喜欢

转载自mudiyouyou.iteye.com/blog/1638830