计算机组成
上图为计算机的基本组成。
计算机有cpu 内存 硬盘等结构通过总线进行关联起来,总线传输着各种各样的数据。总线还连接着一些外部设备usb、显卡、网卡等等。
一个程序是如何让cpu给运行起来的呢?
先来讲一下程序、进程、线程、指令的关系:
在硬盘里的可执行文件叫程序
跑在内存里分配了一些内存资源让cpu去执行他叫做进程,一个程序是可以有多个进程的。
这个进程中的线程对于cpu来说就是一条一条的指令
一个进程里面不同的执行路径叫线程,一个程序可以有多个进程。
拿qq程序举例:
CPU
当我们点击qq.exe时操作系统就把qq.exe从硬盘里面放到内存里面映射成了一个进程,这个进程中的线程相对于cpu而言是一个一个的指令然后cpu去执行它。
PC (Program Counter 程序计数器)
cpu是如何去执行这些指令的呢?
cpu有个组成部分叫 pc 这个pc里面记录这一个地址存放下一条执行的指令在哪里,cpu执行完一条就去内存取下一条。
Register 寄存器
执行指令过程中少不了一些数据放到cpu来执行 ,那这些数据就放在寄存器(registers)里面。
alu (Arithmetic Logic Unit)运算单元
数据放到寄存器之后使用运算单元alu来运算,运算完写回到寄存器,寄存器再写回到内存里面去。
比如:2+3这条在内存上的指令 首先pc指向2+3这条指令 然后2和3会放到寄存器里面 然后alu会进行计算然后把计算结果放回到寄存器里面 然后寄存器写回到内存里面
cache重点讲一下
L1、L2是缓存 一般位于cpu内部,L3会位于主板或者cpu内。
由上图可以得知,如果寄存器想要得到存储在内存的数据是需要经历三层(不同cpu不同层,一般是三层)缓存,先进入L3再进入L2再进L1。
缓存行
寄存器要从内存中读数据的时候是,并不是一个字节一个字节的读取的而是通过总线一块一块的进行读取数据的,这里就有了缓存行的概念。缓存行越大 局部空间效率越高 但读取数据慢反之。目前多用的是64字节。
一块cpu里面有好多的核,每个核里面都有自己的内存单元自己的寄存器自己的pc。
小细节:经常写与经常读的数据单独存与缓存行中可以提高速度。
比如:long类型占4字节那么,前面申请56字节字段后面申请56字节字段,不论在哪里取此long类型数据都是单独在一个缓存行中。
MESI协议
如果一个线程或者cpu需要xy另外一个线程或者cpu也需要xy,那么第一个线程修改了xy后就必须通知另外一个线程使用最新的值,就产生了线程的可见性,怎么做呢?intel使用的是MESI Cache一致性,具体可参考下面文章链接,讲的特别细:
https://juejin.im/post/5d67e75a5188256db0644778
整理不易,给个赞吧!