计算机发展历史

1946-1957,电子管计算机,1957-1964,晶体管计算机,1964-1980,集成电路计算机,1980-至今,超大规模集成电路计算机

电子管计算机:二战时期,英国为了破译德国的无线电密文,而发明了电子管计算机,最出名的电子管计算机莫过于埃尼阿克(ENIAC),埃尼阿克是美国军方为了计算弹道而诞生的,埃尼阿克长30多米,高2.4米,宽6米,拥有18000多个电子管,70000个电阻,10000个电容,1500个续电,6000多个开关,运行耗电150千瓦,重30吨,占地1500平方英寸(140平方米),造价48万美元,运算速度每秒5000次

电子管计算机特点:集成度低,占空间大,功耗高,操作复杂(更换程序需要接线)

晶体管计算机:诞生原因是因为贝尔实验室发明晶体管,1956年诺贝尔物理奖授予贝尔实验室发明晶体管的科学家,第一台晶体管计算机TX-0诞生于MIT的林肯实验室,当时的最强晶体管计算机PDP-1具备4k内存,每秒可执行20万条指令,具备512x512显示器(也是世界第一个显示器,也因为这个计算机携带了显示器的原因,而诞生了世界第一款电子游戏,太空战争)

晶体管计算机特点:对于电子管计算机来说,集成度高,空间占据小,功耗比电子管低,运行速度快

集成电路计算机:诞生原因是因为德州仪器的工程师发明了集成电路(IC),操作系统也因为集成电路计算机的出现而诞生,当时为了解决IBM的2款集成电路计算机(7094和1401)所编写的程序无法相互兼容,IBM而推出了System/360(操作系统雏形)

超大规模集成电路计算机:芯片集成超大规模的集成电路

微型计算机发展历史:因为集成电路计算机的诞生,计算机逐渐从庞然大物变成小型,乃至微型,1971到1973年,500khz频率的微型计算机(8位),1973到1978年,高于1mhz的微型计算机(8位),1978到1985年,500mhz的微型计算机(16位),1985到2000年,高于1ghz的微型计算机(32位),2000年到至今,高于2ghz的微型计算机(64位)

摩尔定律:当价格不变的情况下,集成电路的性能,会每18至24个月提升一倍

后来因为集成电路太密集,热损耗也越来越高,无法解决,摩尔定律也因此失效

因为摩尔定律的失效,单核已到瓶颈,转而搞多核CPU,2005年,英特尔发布了奔腾系列的双核CPU,AMD也发布了速龙系列的双核CPU,2006年,英特尔发布酷睿四核CPU,至今AMD的服务器级霄龙处理器CPU可以高达64核,而且基准频率(单核频率)可以达到2Ghz以上


计算机的分类

超级计算机:功能最强,运算最快,存储容量最大的计算机,用于天气预报,海洋监测,生物制药,科学计算,航天等等需要超大运算的领域,衡量超级计算机的单位是TFlop/s(每秒一万亿次浮点计算)

著名的超级计算机有Summit,神威太湖之光,天河一号,天河二号,Sierra

天河二号位于广州大学城的中山大学校区的国家超级计算机广州中心

大型计算机:又被称为大型机,大型机面向大型商业公司,维护成本高,硬件不易扩展,IBM占据大型机的大片市场,IBM为IOE中的I(计算机提供商)

迷你计算机(服务器):目前已替代大型机,为企业主要计算顶梁柱

工作站:高端微型计算机,面向需要强性能的专业工作者(例如图形,视频)

微型计算机(个人计算机):又分为台式计算机,笔记本计算机,一体化计算机


计算机体系和结构

冯诺依曼体系:将指令和数据一起存储的计算机设计概念结构,使用通用电路设计,而不是使用专用电路,将指令存储,再将指令编译成通用电路可理解的程序

冯诺依曼体系要求具备存储器,控制器,运算器,输入/输出设备

冯诺依曼体系要求能将程序和数据发送给计算机(输入),能长期存储程序,数据,计算过程,计算结果的功能(存储器),具备算术,逻辑处理和数据传送等数据处理功能(运算器和控制器),并且能将处理结果反馈给用户(输出)

冯诺依曼瓶颈:CPU和存储器速率之间无法调和,导致CPU空转等待数据传输

现代计算机都是基于冯诺依曼体系的(解决冯诺依曼瓶颈),存储器和运算器,以及控制器整合在一起(就是CPU),CPU内部的存储器更高速(寄存器)


计算机层次和编程语言

程序编译和程序解析(计算机无法理解人类语言),需要进行语言(高级语言对低级语言)的转换

高级语言生成低级语言的过程叫程序编译,而生成的工具叫编译器

常见的编译型语言有C,C++,Golang

高级语言作为输入,低级语言接收输入,从而达到高转低的目的,这个过程叫程序解析,而这个低级语言接收的工具叫解析器,解析器必须是用低级语言编写的

常见的解析型语言有Python,PHP

java是编译+解析语言,因为它会将源程序编译成JVM字节码,JVM虚拟机再将JVM字节码再解析成机器码,java的跨平台就是因为JVM虚拟机解析器

计算机的层次:硬件逻辑层,微程序机器层,传统机器层,操作系统层,汇编语言层,高级语言层,应用层

硬件逻辑层:由门电路和触发器等逻辑电路组成

微程序机器层:由微指令组成的微程序直接交给硬件执行

传统机器层:CPU指令集,不同架构CPU使用不同的CPU指令集

这3层都为机器硬件层,一个指令就是一个微程序,也是一组微指令

操作系统层:向上提供操作界面,向下对应指令系统,管理硬件(例如分配内存空间)

汇编语言层:汇编语言可以直接编译成机器语言,完成翻译的工具叫汇编器

高级语言层:高级语言

应用层:应用软件


计算机的计算单位

容量单位

在物理层次,用高低电平来记录信息(低电平为0,高电平为1,一个0/1的位被叫为bit(比特位))

1字节(Byte)等于8bit

1Kb(千字位)等于1024字节(Byte)

1mb(兆字节)等于1025kb(千字节)

1Gb(吉字节)等于1024mb(兆字节)

1tb(太字节)等于1024gb(吉字节)

1pb(拍字节)等于1024tb(太字节)

1eb(艾字节)等于1024pb(拍字节)

1024是2的10次方

对于硬盘制造商来说,使用10进制,也就是硬盘制造商认为1000G才是1tb

因此实质硬盘容量为购买标注的容量(例如240G)乘以1000的3次方,再除于1024的3次方,得到的数就是实质硬盘的容量

原因是硬盘制造商为了记录硬盘的扇区,使用人类可理解的10进制,而不是2进制

速度单位

网络速度

网络传输数据的单位为Mbps

因此100M宽带就是指100Mbit/s,每秒传输100Mbps

100Mbit换算字节就是100/8,也就是12.5MB,因此100m宽带峰值每秒可以传输12.5mb

CPU速度(CPU的时钟频率,Hz)

Hz是每秒中的周期性变动重复次数的计量

例如 3.30 GHz的CPU,就是3.3*1000^3Hz,也就是每秒可以达到33亿次的高低电平变化


计算机的字符和编码集

字符编码集的历史

ASCII码:ASCII码包含95个可打印字符和33个不可打印的字符(例如控制字符),用7个bits表示一个ASCII码(95+33就是128,也就是2的7次方)

因为ASCII码无法满足需求(例如π),而推出了Extended ASCII码,由原来的7个bits变成8个bits,也就是支持256个字符

中文编码集

国标GB2312,诞生于1980年,中文名为信息交换用汉字编码字符集-基本集,GB2312收录了7445个字符(6763个汉字和682个其他字符)

因为GB2312不符合国际标准,因此推出GBK(汉字内码扩展规范),向下兼容GB2312,向上支持国际ISO标准,GBK收录了21003个汉字,支持全部中日韩汉字

为了解决全球的字符集问题,推出了Unicode(又被叫为统一码,万国码,单一码),Unicode定义的世界通用的编码集,并且使用UTF-x来对Unicode进行编码(这个x表示一个字符占多少bits,例如utf-8就是指,1个字符占了8个bits)


计算机组成

总线:解决不同设备之间的通信问题

常见的总线有:

USB:全称Universal Serial Bus(通用串行总线)

PCI总线(外置显卡)

ISA总线

Thunderbolt总线

总线分2种,片内总线(就是芯片内部的总线,传递芯片内部的信息),系统总线(就是连接计算机外围设备的总线,负责CPU,内存,IO设备之间的信息传递)

系统总线又分为数据总线(数据总线的位数(总线宽度)一般于CPU位数相同,64位(可以一次传输64位,8个字节的数据),负责双向传输数据信息),地址总线(指定数据的内存中的地址,位数为n时,寻址范围为0到2的n次方,位数和存储单元的位数有关系),控制总线(负责传输控制信号,控制信号通过控制总线,从这一个组件传输给另一个组件(例如显卡发送控制信号给显示器),而且还可以监控设备是否就绪)

总线仲裁(解决多个设备就绪,总线的使用权分配问题)

仲裁控制器:控制设备使用总线的优先顺序

仲裁方法:链式查询(仲裁控制器连接总线的全部设备(串连),需要使用总线的设备发送仲裁,优先级高的最先允许,使用完毕,再询问下一个设备,直到没有需要,这就是链式查询),计时器定时查询(仲裁控制器使用计数器累计计数,当接收到仲裁信号后,向全部设备发送计数值,当计数值和设备编码一致时获取使用权),独立请求(每个设备都有总线独立连接仲裁器,设备都可以向仲裁控制器单独发送请求和接收请求)


输入/输出设备

常见输入/输出设备:字符输入设备(键盘),图形输入设备(鼠标,数位板,扫描仪),图像输出设备(显示器,打印机,投影仪)

输入/输出接口通用设计:允许读取数据,允许向设备发送数据,允许检测设备是否被占用,允许检查设备是否已连接,允许检查设备已启动

数据线(I/O设备与主机传输数据,单向,双向),状态线(I/O设备向主机报告的信息线,主机可以通过该线来查询设备是否已经正常连接并且已经就绪,也可以查询设备是否被其他进程占用),命令线(CPU向设备发送命令的信号线),设备选择线(主机选择I/O设备进行操作的信号线)

CPU与IO设备通信:程序中断(IO设备就绪,会向CPU发生中断信号,CPU接收到中断信号后,会执行中断程序工作,会暂停当前进程的工作,转而处理该I/O设备的工作,完成后再恢复到之前进程的工作),DMA(直接存储区访问,DMA直接连接主存和设备,DMA工作期间不需要CPU参与,而是作为主存和设备的中间件,来做到IO设备的数据交换)


计算机存储器

存储器的分类

按存储介质分类,分为半导体存储器(内存,固态硬盘)和磁存储器(磁盘(机械硬盘),磁带)

按存取方式分类,分为随机存储器(RAM),串行存储器(按顺序读写),只读存储器(ROM)

缓存(CPU的寄存器),主存(内存),辅存(硬盘)

存储器的层次结构:CPU可以与主存互相访问,缓存可以和CPU互相访问,也可以和主存互相访问,主存和辅存之间互相访问

CPU和缓存,以及主存构成缓存-主存层次,而主存和辅存又构成了主存-辅存层次

局部性原理:CPU访问存储器时,存取指令和存取数据,其访问的存储单元都是聚集在一个连续区域中

缓存-主存层次是为了解决CPU速度和主存速度不匹配的,在CPU和主存之间再加一层缓存,CPU运行时,可以将数据临时存储在该缓存中,而且不需要完全依赖于主存来做数据存储媒介(主存对于CPU来说还是太慢,需要等待主存处理完毕),提高CPU的利用率

主存-辅存层次是为了解决主存容量不够的问题,在主存之外添加辅助存储器(例如硬盘)

对于超过主存的程序运行,利用局部性原理,将当前用到的数据存储到主存,还没有用到的先存储到辅存中


主存储器和辅助存储器

主存储器:内存(RAM,随机存取存储器,Random Access Memory)

RAM通过电容存储数据,必须每隔一段时间刷新一次(刷新需要电存在,如果长时间没有刷新将丢失电容里的电子,从而导致数据丢失),因此掉电后,数据会在一段时间后丢失

RAM主要由半导体存储体,驱动器,译码器,读写电路,控制电路组成

CPU利用主存数据寄存器(MDR)通过数据总线来连接读写电路(来完成读写内存工作)

通过主存地址寄存器(MAR),通过地址总线来连接译码器(完成传输数据,数据存储地址工作)

操作系统的位数决定了最大寻址区域,32位操作系统最大支持4GB内存(2^32=42^30),64位操作系统最大支持2^34GB(2^64=2^342^30)

辅助存储器,例如磁盘(由盘片(可磁化的硬磁特性材料构成),读写磁头(移动磁头来读取磁道信息),磁道,扇区(磁道的一部分)组成)

磁盘调度算法:先来先服务算法,最短寻道时间优先算法,扫描算法(电梯算法),循环扫描算法

先来先服务算法:按照顺序来访问磁道的读写

最短寻道时间优先算法:优先访问离磁头最近的磁道

扫描算法(电梯算法):磁头每次只往一个方向移动,只有到达尽头时才会反方向移动(因为和电梯调度是一样的,因此又叫电梯算法)

循环扫描算法:基于扫描算法的优化版本,只向一个方向移动,到达尽头不会反方向移动,而是回到起点,继续一个方向移动


计算机高速缓存

计算机缓存的工作原理

字:指存储在一个存储单元中的二进制组合(是存储最小的单元)

字块:指存储在连续的存储单元中,也就是一个单元的一组字

如果一个字是64位,并且一个字块有n个字,存储器一共有x个字块,nx就是总字数,而nx*64就是这个存储器的总容量(bits)

字的地址:前几位表示字块的地址,后几位表示该字在字块的地址

当CPU需要的数据存在于缓存中时,往缓存获取,需要的数据不存在时,向主存获取

缓存命中率是衡量缓存的性能基础,如果每次需要的数据都在缓存时,命中率为1

缓存命中率计算公式:访问主存的次数除以访问主存的次数加访问缓存的次数的和,得到的数就是这个缓存的命中率(占访问总次数的比例)

缓存访问效率也是衡量缓存的性能基础,计算公式为访问缓存的时间除以访问主存的时间

缓存替换策略:当缓存没有数据时,需要向主存载入需要的数据,主要有4种算法,随机算法,先进先出算法(FIFO),最不经常使用算法(LFU),最近最少使用算法(LRU)

随机算法:每一次发生替换时,随机选取缓存的位置,将对应的位置替换

先进先出算法(FIFO):将缓存看成先进先出的队列,队列满后发生替换时,优先替换最先进入队列的字块

最不经常使用算法(LFU):优先替换最不经常使用的字块,需要提供空间来记录字块的使用频率

最近最少使用算法(LRU):优先替换最近一段时间内最少使用的字块(可以利用双向链表结构,保证链首是使用的字块,链尾是最不经常使用的字块,只需要将链尾去掉,将新的字块放到链首)


指令系统

机器指令由操作码和地址码组成,操作码指定指令需要完成的操作,操作码的位数决定了机器的操作种类,例如8位操作码表示有256种操作种类,地址码是指定数据或者数据的地址,根据地址码又分为三地址指令,二地址指令,以及一地址指令和零地址指令,就是指令有多少个数据地址

机器指令的操作类型:数据传输类型,算术逻辑操作类型,移位操作类型,控制指令(例如中断指令)

机器指令的寻址

指令寻址:顺序寻址,跳跃寻址

数据寻址:立即寻址,直接寻址,间接寻址(给出的地址是数据地址的地址,再根据数据地址,找到数据)


计算机的控制器

控制器是控制计算机和协调计算机的

控制器由程序计数器(存储下一条指令的地址),时序发生器(发送时序脉冲,CPU根据时序脉冲来进行工作),指令译码器(翻译操作码对应的操作,传输地址码对应的数据),寄存器(通用(暂时存放或者发送数据或者指令,也负责保存算术逻辑单元的中间结果),指令(存取计算机指令),主存地址(保存当前CPU正在访问的内存单元地址),主存数据(保存当前CPU正在读取或者写入的主存数据)),总线组成


计算机的运算器

运算器由数据缓冲器,算术逻辑单元(ALU),通用寄存器,状态字寄存器,以及总线组成

数据缓冲器分为输入缓存(暂时存放外部设备发送过来的数据)和输出缓冲(暂时存放需要发送给外部设备的数据)

算术逻辑单元(ALU)是运算器核心,可以完成算术运算(位运算,加减乘除等等)

状态字寄存器是存放运算状态的(例如进位,结果的正负,条件码,溢出等等),也可以存放运算控制信息(例如允许中断位,调试跟踪标记位等等)


计算机指令执行过程(获取指令,分析指令,执行指令)

指令执行过程的交互发生在片内总线

通过缓存获取指令,再将指令通过片内总线发送给指令寄存器,暂时存放这个指令操作码和地址码(并不知道指令的具体内容),再通过指令译码器来获取指令具体内容,指令译码器通过片内总线发送控制信号给运算器,程序计算数+1(表示轮到下一个指令执行),执行指令会先将数据存储在数据寄存器,算术逻辑单元处理数据,并且状态字寄存器记录运算的状态,指令完成后发送运算结果