对计算器的框架进行介绍。
1 计算机整体架构
CPU,内部存储器和I/O设备是计算机三大核心器件,
- cpu主要分为三部分,即控制单元,存储单元(寄存器单元)和运算单元。
- 内存则是分为指令存储(代码)和数据存储。
总的来说就是CPU从内存中的指令存储读取命令,解码得到数据地址,在到相应的数据存储读取数据,进行计算,存储单元(寄存器)用于运算单元的数据缓存和其他缓存,它和CUP数据交换时间最短。如下图:
1.1 冯·诺依曼结构
早期提出的一种结构,也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的电脑设计概念结构。
最显著特点是程序线和地址线共用,制作简单,但存在高速瓶颈。
1.2哈佛结构
是一种将程序指令储存和数据储存分开的存储器结构.
哈佛结构的微处理器通常具有较高的执行效率。其程序指令和数据指令分开组织和储存的,执行时可以预先读取下一条指令。
2 CPU
CPU从内存或高速缓存(高速缓存信息传递快)读取指令,然后将其解码后分解成一系列微操作执行。CPU依靠指令控制计算机。指令集主要分为复杂指令集CISA(
Complex Instruction Set Computing)和精简指令集RISC(
Reduced Instruction Set Computing)
2.1 CISA
指令集数量较多,一个指令集可以处理一件很复杂的事情,如加乘命令(1+1)*(1+1)
在一个时钟周期就可以完成
优点:处理速度快,效率高
缺点:硬件设计复杂,处理器成本高,功耗大
代表:x86
2.2 RISA
John Cocke研究研究发现在CISA中,最常用的20%的指令占了80%的时间,因此诞生RISA,简化了指令集,但(1+1)*(1+1)
这样一条命令就需要先进行两次加法,再进行一次乘法才能得到结果,处理速度慢。
其优缺点与CISA相反
2.3 两种指令集评价
CISA处理功能强大,因此常用在服务器,笔记本等领域,而RISA凭借低功耗、低成本,常用在嵌入式开发领域,如手机
3 存储
3.1 大端存储和小端存储
在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
以0x1234在内存中的存放位置解释大端存储和小端存储(假设从地址0x4000开始存放)
内存地址 | 小端模式 | 大端模式 |
0x4000 | 0x 34 | 0x 12 |
0x4001 | 0x 12 | 0x34 |
3.2 内存和硬盘(外存)
CPU和存储的交互都是通过内存完成的,数据保存在硬盘中,打开软件时,将数据复制到内存,然后内存与CPU交互,这就是为什么一些大型软件打开慢,但使用流程的原因。
(手机中的RAM和ROM分别对应电脑的内存和硬盘)
注意只是对应,硬盘并不是ROM,可以进行写
具体如下图:
3.3 内存中的堆栈
堆栈即使一种数据结构,也是内存中的存储位置
3.3.1 数据结构中的堆栈
栈(stack),是一种后入先出的线性数据格式
堆是利用完全二叉树的结构来维护一组数据,然后进行相关操作。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆
如下图
3.3.2 内存分配中的堆栈分配
C语言中的一个经典案例
`
main.cppi
nt a = 0; 全局初始化区
char *p1; 全局未初始化区
main(){int b; 栈
char s[] = “abc”; 栈
char *p2; 栈
char *p3 = “123456”; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10); 堆
p2 = (char *)malloc(20); 堆
}
`
堆和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a;系统会自动在栈上为其开辟空间。而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。
3.3.3 LInux存储映像
- 当程序开始运行时,加载器在可执行文件中段头部表的指引下,将可执行文件的相关内容拷贝到代码段和数据段。
- 代码段总是从地址0x08048000处开始。
- 数据段在接下来的下一个4KB对齐的地址处。
- 运行时堆在读/写段(数据段)之后接下来的第一个4KB对齐的地址处,并通过malloc库往上(高地址方向)增长。中间还有一个段是为共享库(shared library)保留的。
- 用户栈总是从最大的合法用户地址开始,向下增长(低地址方向)栈上方的段是为操作系统驻留存储器部分(也就是内核)的代码和数据保留的。
4 I/O设备
硬件工程师来说,I/O设备是电子芯片、导线、电源、电子控制设备、电机等组成的物理设备。而对于程序员来说,关注的只是I/O设备的编程接口
4.1 I/O设备分类
- 块设备: 块设备把信息存放在固定大小的块中,每个块都有自己的地址,独立于其他块,可寻址。例如磁盘,USB闪存,CD-ROM等。
- 符号设备:字符设备以字符为单位接收或发送一个字符流,字符设备不可以寻址。列入打印机、网卡、鼠标键盘等。