计算机组成原理 rics-v 篇
计算机抽象及相关技术
八个伟大思想
-
存储分层
-
冗余提高可靠性
-
抽象简化设计
-
面向摩尔定律的设计
-
流水线
-
并行
-
加速经常性事件
-
预测
记忆:一个分层,一个冗余, 两个设计, 四个提高性能
八个伟大思想是计算机体系结构的核心,外在的各种汇编语言只是体系结构的外壳,我们学习这些汇编,能用这些汇编语言写程序,然而我们也仅仅只是应用者,深刻理解体系结构中的八个伟大思想是对体系结构设计者的基本要求,作为程序员,all depends youself。
C-A-L-L CALL
foo.c-----Compiler-----> foo.s----- Assember------>foo.o(可重定位目标文件)-------Linker----->foo.o(可执行目标文件) ------Loader-----------> 加载到内存中运行
源文件先经过编译器,编译为汇编程序,再经过汇编器,汇编为可重定位目标文件,最后由链接器将其于其他的库文件链接,生成可执行目标文件,由链接器加载到内存中运行
可重定位目标文件于可执行目标文件的区别:核心是理解重定位这个词,简单的说,可重定位目标文件中引用了外部文件(比如系统库函数,printf,scanf,或者是你自己写的当前目录下的另外一个文件,也就是你用 #include 或者 import 导入的文件)的函数或者全局变量等(我们称之为符号symbol),而重定位相当于在你引用外部符号的时候做一个标记,由链接器在将其他源文件和当前源文件链接的时候在其他文件中查找标记对应的外部符号。
如果 链接器在其他文件中没找到这个标记对应的符号就会报错,ld can’t find symbol 链接器(ld)找不到符号。
可重定位目标文件往往不能单独运行,可执行目标文件就可以运行了。windows上点一下exe文件的时候,(linux shell 输入“ ./可执行目标文件名”)加载器就会把文件加载到内存中去,最后的最后由cpu执行.
CALL 可以理解为从源文件到程序的四个过程(compile assembly link load),也可以理解为编译器到加载器四个器件,call 本身这个单词叫调用,调用程序需要上面的步骤, 所以这些很好记忆。
体系结构
硬件与软件之间不是相互独立的,但也不是直接依赖的,用java的理解方式,就像是硬件与软件之间有一层接口,它们分别对接口实现,而不用了解互相内部的结构,从而简化设计,体现了抽象的伟大思想。而这层接口就是我们所学习的计算机指令体系结构(ISA), instruction set architecture ,也叫指令集架构, 简称 体系结构。
例如:risc-v , x86, mips就是三种体系结构
性能公式
在同一台机器上执行时间越短的性能就越好 ------>> 性能等于执行时间的倒数, 显然对于不同的机器该等式也成立。
时钟周期(T): 计算机内部时钟一个周期的时间长度
时钟频率(f):时钟周期的倒数,比如 4G Hz 等于 4e9 (基为10的科学计数法)Hz, 对应0.25 ns (纳秒)或者 250 ps (皮秒) 。例如计算机的主频就是指它
一个程序CPU执行时间 : 时钟周期的长度与该程序执行的时钟周期的数目(n)
t
=
T
∗
n
t = T * n
t=T∗n
等价于
t
=
n
/
f
t = n / f
t=n/f
为了不与计算机的具体实现挂钩,n 可以用 指令的数目 * 每条指令执行所需要的时钟周期的个数的平均数(CPI)替代
n
=
指令数
∗
C
P
I
n = 指令数 * CPI
n=指令数∗CPI
根据性能等于时间的倒数,得到了重要的性能公式
性能
=
时钟频率
/
(
C
P
I
∗
指令数
)
性能 = 时钟频率/(CPI*指令数)
性能=时钟频率/(CPI∗指令数)
对性能公式的理解:当其他因素不变的时候,主频越大性能越高;同理,在其他因素不变的情况下,CPI和指令数越少越好,主频往往受制于硬件实现,指令数则依赖于体系结构的设计,而CPI则由硬件与体系结构共同作用。
risc-v之所以好,一个重要原因就是虽然其所需指令数更多,但是因为其设计规整简单,CPI相对来说非常小。
其他常见的公式:
MIPS: 每秒执行多少百万条指令
M
I
P
S
=
指令数
/
(
执行时间
∗
1
0
6
)
MIPS = 指令数 / (执行时间 * 10^6)
MIPS=指令数/(执行时间∗106)
根据性能公式
M
I
P
S
=
时钟频率
/
(
C
P
I
∗
1
0
6
)
MIPS = 时钟频率/(CPI * 10^6)
MIPS=时钟频率/(CPI∗106)