1.计算机的发展史

早期的计算器

算盘

西亚人的发明,珠子制成

算筹

是第一种有进位的10进制记数法

纳皮尔算筹

主要用来计算乘除法,本质是一副活字九九表

计算尺

对数

机械计算机

1. 契克卡德计算钟(1623年)
  1. 能够进行6位数的加减乘除运算

2. 帕斯卡计算器(1642年)
钟表指针的齿轮转动天然地具有进位的功能

3. 莱布尼兹步进计算器(1674年)
在帕斯卡计算器的基础上,除了普通的加减法,还可以乘除法

4. 查尔斯·巴贝奇:现代计算机真正的鼻祖(1822年)
差分机(1822年),一种高度自动化的计算机器,借助于帕斯卡提出的查分思想,可以进一步将乘除法转化为加法,由于当时零件技术原因没做出来

分析机(1833年),将其划分为5个部分

第一位程序员:艾达·洛夫莱斯,1840年,

穿孔制表机(1884年)

有现代计算机的雏形,作用是用来制表

图灵机:计算机世界的理论基石

图灵(1912-1954),指定策略进行处理

ENIAC(1945年):第一台通用电子计算机

在图灵的理论确立好后,为了解决弹道计算问题,1945年设计制造了世界上第一台电子计算机ENIAC,为美国军方使用,占地面积非常大,28吨,成本高

冯·诺依曼结构:现代计算机的诞生

冯诺依曼:现代计算机之父

在ENIAC诞生后,冯诺依曼对该计算机作了一份报告,报告为现代计算机的发展指明了道路:

1、机器内部使用二进制表示数据

2、像存储数据一样存储程序

   3、计算机由运算器,控制器,存储器,输入模块和输出模块5个部分组成

image-20211230221851538.png

图灵描绘了计算机的灵魂,冯诺依曼框定了计算机的骨架

第二代电子计算机(50年代后期)

晶体管技术成熟,电子管淘汰,第二代晶体管计算机诞生

第三代集成电路计算机(1964年)

IBM公司研制出第三代集成电路计算机(集成度不高)

第四代大规模集成电路计算机(1971-至今)

超大规模半导体集成电路的发展,成就了现在超大规模集成电路计算机

私人电脑

移动计算机

云计算

2.计算机的基本硬件组成

I/O设备:
显示器(输出)
鼠标+键盘(输入)
显卡(GPU):
CPU之外的另一个处理器
CPU:
提取,解码和执行,cpu从系统的主存中提取指令、解码指令的实际内容,交由cpu的相关部分执行该指令
内存:
程序与cpu进行沟通的桥梁,运算速度快
硬盘:存储
主板:
作用:将以上设备连接起来
北桥芯片:主板芯片中最重要的芯片,控制cpu,内存,显卡,它的优劣可以决定计算机的性能,为其安装
散热装置。
南桥芯片:第二大芯片,控制输入输出和各种外部设备,usb插槽等。
总线(bus):cpu和内存通信的桥梁,总线的速度决定了数据能传输的速度有多快
芯片组控制数据传输的流转,总线是数据传输的高速公路

系统总线:北桥的总线为系统总线,因为是内存,cpu,显卡的主要通道,所以速度较快
IO总线:南桥的总线叫IO总线,主要联系硬盘,usb,网卡等周边设备,常见的如PCI总线

系统总线和IO总线用桥接的芯片或者电路连接起来,整体如下图所示:
企业微信截图_16409189325065.png

3.冯诺依曼和哈佛

冯诺依曼体系结构

![image-20211230222952171.png](https://cdn.nlark.com/yuque/0/2021/png/25761560/1640876350207-eb0d63c0-730c-4b50-a714-7239b9780f56.png#clientId=uf79205ae-7f33-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=293&id=uc8fc847a&margin=%5Bobject%20Object%5D&name=image-20211230222952171.png&originHeight=445&originWidth=820&originalType=binary&ratio=1&rotation=0&showTitle=false&size=122364&status=done&style=none&taskId=u9ff410af-fbf0-434e-bb46-861caedc729&title=&width=539)<br />冯诺依曼体系结构的3大特点:

    1.计算机处理的数据和指令一律用二进制数表示(因为电子电路只认高低电频)

         2.指令和数据不加区别混合存储在同一个 存储器(硬盘) 中

    3.顺序执行程序的每一条指令 (重点是顺序)

冯诺依曼体系工作原理(CPU工作原理)

  程序的执行过程实际上是不断地取出指令,分析指令,执行指令的过程。冯诺依曼型计算机从本质上讲是采用了串行顺序处理的工作机制,即使有关数据已经准备好了,也必须逐条执行指令序列,如下图:

image-20211230224108833.png

**冯诺依曼结构,在内存里数据段和代码段是没有分开的,即数据和指令没被分开**

哈佛体系结构

在内存里将数据段和代码段分开,如下图:<br />![image-20211230224643129.png](https://cdn.nlark.com/yuque/0/2021/png/25761560/1640876427432-3fca7d8d-2166-4153-ade9-2e64cc884ec5.png#clientId=uf79205ae-7f33-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=312&id=u49d04d26&margin=%5Bobject%20Object%5D&name=image-20211230224643129.png&originHeight=468&originWidth=974&originalType=binary&ratio=1&rotation=0&showTitle=false&size=93004&status=done&style=none&taskId=uc5bd0d45-5500-46c1-9bc5-355f513ba1c&title=&width=650)<br />这也是冯诺依曼和哈佛结构的最本质的区别

在现代计算机中,cpu外部(主要体系结构)采用冯诺依曼模型,而在cpu内部用的是哈佛结构(数据和程序分离,提高处理速度)

4.现代计算机的主要组成结构

CPU

cpu内部处理过程
image.png
cpu主要由两部分组成:控制单元和算术逻辑单元(ALU)
控制单元:从内存中提取指令并解码执行
运算逻辑单元(ALU):处理算数和逻辑运算
image.png
cpu的内存结构:实质是一系列寄存器的集合体
从功能上来看,CPU的内部由寄存器、控制器、运算器和时钟四部分组成,各部分之间通过电信号连接。
寄存器:是中央处理器内的组成部分,它们可以用来暂存指令、数据和地址。可以看作是内存的一种,寄存器根据功能的不同有好多类型(例如程序计数器等也是寄存器)。
控制器:负责把内存上的指令、数据读入寄存器,并根据指令的结果控制计算机
运算器:负责运算从内存中读入寄存器的数据
时钟:负责发出CPU开始计时的时钟信号
从逻辑上分为三部分,运算单元,数据单元和控制单元。
image.png
CPU指令执行过程:取指令、指令译码、执行指令、访存取数、结果写回

内存

没有内存,CPU无法执行程序指令,计算机也就失去了意义,内存和CPU两个是密不可分的
内存的内部是由IC电路组成的,主要分为三种存储器:
随机存储器(RAM):可以从中读取数据,也可以写入数据,当机器关闭时,内存中的信息会丢失。
只读存储器(ROM):只能用于数据的读取,不能写入数据,当机器关闭时,这些信息不会丢失。
高速缓存(Cache):分为一级缓存(L1 Cache) ,二级缓存((L2 Cache)) , 三级缓存(L3 Cache),它位于内存和CPU之间(但是属于CPU),是一个读写速度比内存更快的存储器。当CPU向内存中写入数据时,这些数据也会被写入到高速缓存中。当CPU需要读取数据时,会直接从高速缓存中直接读取,如果需要的数据在Cache中没有,CPU会再去读取内存中的数据。

磁盘

磁盘的物理结构指的是磁盘存储数据的形式

总线

CPU通过总线对各组件进行控制
image.png
在物理层面,总线也分为地址线,数据线,控制线
image.png

输入输出设备

I/O接口:又称I/O控制器、设备控制器,负责协调主机与外部设备之间的数据传输,现在的I/O接口(芯片)也会被集成在南桥芯片的内部

5.静态链接和动态链接

一段代码从文本编辑器上产生到最终能够在机器上运行,经历了非常多的阶段,概括而言,至少包含了以下几个阶段:

  • 编译: 编译器通过词法分析,语法分析,语义分析等,将一段代码翻译成汇编语言
  • 汇编:将汇编语言翻译成机器指令
  • 链接:解决符号之间的重定位问题
  • 装载:将可执行文件加载到内存

静态链接

在我们的实际开发中,不可能将所有代码放在一个源文件中,所以会出现多个源文件,而且多个源文件之间不是独立的,而会存在多种依赖关系,如一个源文件可能要调用另一个源文件中定义的函数,但是每个源文件都是独立编译的,即每个.c文件会形成一个.o文件,为了满足前面说的依赖关系,则需要将这些源文件产生的目标文件进行链接,从而形成一个可以执行的程序。这个链接的过程就是静态链接

静态链接就是在装载之前,就完成所有的符号引用的一种链接方式。静态链接的处理过程分为2个步骤:

  1. 空间与地址的分配。扫描所有的目标文件,合并相似段,收集当中所有的符号信息。
  2. 符号解析与重定位。调整代码位置。

静态库:由很多目标文件进行链接形成的是静态库,反之静态库也可以简单地看成是一组目标文件的集合,即很多目标文件经过压缩打包后形成的一个文件
在完成静态链接之后,可执行文件中代码段、数据段等的虚拟地址已经确定。

静态链接优缺点:

  • 优点: 简单
  • 缺点:
    • 浪费内存空间。在多进程的操作系统下,同一时间,内存中可能存在多个相同的公共库函数(如多个程序

中都调用了printf()函数,则这多个程序中都含有printf.o,所以同一个目标文件都在内存存在多个副本)。

  • 更新比较困难。 只要有一个模块更新,那么就需要重新编译打包整个代码。

为了解决以上2个问题,就诞生了动态链接。

动态链接

基本思想就是将对符号的重定位推迟到程序运行时才进行。
把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序,而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件

动态链接优缺点:
优点: 解决了静态链接的缺陷,更适应现代的大规模的软件开发
缺点:
1. 结构复杂
2.因为把链接推迟到了程序运行时,所以每次执行程序都需要进行链接,所以性能会有一定损失

静态链接和动态链接两者最大的区别就在于链接的时机不一样,静态链接是在形成可执行程序前,而动态链接的进行则是在程序执行时