编程必备基础知识-计算机组成原理-01概述篇-笔记

章节介绍

环境说明

  • Linux环境:VMWare WorkStation + Linux虚拟机
  • 编程语言:C++、Python

 

(01):计算机的发展历史

计算机基础方面的知识,对于一些非科班出身的同学来讲,一直是他们心中的痛,而对于科班出身的同学,很多同学在工作之后,也意识到自身所学知识的不足与欠缺,想回头补补基础知识。关于计算机基础的课程很多,内容繁杂,但无论是相关书籍还是大学课程,都有点脱离工作。特别地,计算机基础知识体系庞杂,想要从零学习或者复习都耗时耗力。

有鉴于此,本系列文章将带你更快的补足编程必备基础知识,涵盖计算机领域三大基础知识:计算机组成原理、操作系统、计算机网络。同时,挑出了作为程序员最应该掌握的那部分知识,摒弃了对程序员来说不那么重要的硬件相关知识。

目的是:

  • 帮助大家形成计算机知识的结构体系
  • 帮助大家理解计算机底层原理
  • 帮助大家在工作实践中借鉴其中的优秀设计

1. 计算机发展的四个阶段

根据计算机使用的物理电子器件,将计算机的发展划分为如下四个阶段:

每一个阶段的计算机分别有如下特点。

第一个阶段:电子管计算机。

第二次世界大战是电子管计算机产生的催化剂。英国为了解密德国海军的密文。

身处现代的我们可能对电子管比较陌生,它长下面这样:

现在在我们的个人计算机中,基本看不到电子管的身影了。

这个阶段的第二台(第一台不怎么出名),同时也是最著名的电子管计算机就是ENIAC。它的诞生源于二战,是一个庞然大物,其拥有1)18000多个电子管,2)运行耗电量150千瓦,3)重量达30吨,占地1500平方英尺。

埃尼阿克(ENIAC)

  • 战争使用了飞机和火箭
  • 打得准则需要计算射击参数
  • 射击参数需要几千次运算才能计算出来

没有计算机前,需要人手算

因此,这一阶段的计算机有如下特点:

  • 集成度小,空间占用大
  • 功耗高,运行速度慢(相较于现代计算机)
  • 操作复杂,更换程序需要接线

第二个阶段:晶体管计算机

1948年,贝尔实验室的三个科学家发明了晶体管,此后的数年,晶体管给计算机带来了革命。相比电子管,晶体管拥有更小的体积,更低的能耗,更高的计算效率。如下图所示就是晶体管:

晶体管的发明是划时代的,1956年的诺贝尔物理奖,就授予了这三名科学家。

这个时期,著名的晶体管计算机有两台,分别是诞生于MIT林肯实验室的全世界第一台晶体管计算机——TX-0和当时性能最高的晶体管计算机——PDP-1。

这一阶段的计算机有如下特点:

  • 集成度相对较高,空间占用相对小
  • 功耗相对较低,运行速度较快
  • 操作相对简单,交互更加方便

第三个阶段:集成电路计算机

当时,德州仪器的工程师发明了集成电路(IC),把大量的电子元件集成到了单一的半导体芯片里面 。

这个阶段的1)计算机变得更小、2)功耗变得更低、3)计算速度变得更快。计算机具备进入千家万户的条件

操作系统也诞生于这个阶段。

第四个阶段:超大规模集成电路计算机

这个阶段,1)一个芯片集成了上百万的晶体管, 
2)使得计算机的速度更快,体积更小,价格更低,更能被大众接受,
3)用途也丰富了起来,包括文本处理、表格处理、高交互的游戏与应用等。

PC的时代来临了。

这个阶段不得不提一个人——乔布斯。当时其发明了两款个人计算机Apple和Apple二代,在家庭和学校非常受欢迎,成为这个时代个人计算机的佼佼者。

第五个阶段:未来的计算机

生物计算机

  • 体积小,效率高
  • 不易损坏,生物级别的自动修复
  • 不受信号干扰,无热损耗

 

量子计算机

  • 2013年5月,谷歌和NASA发布D-Wave-Two
  • 2017年5月,中国科学院宣布制造出光量子计算机
  • 2019年1月,IBM展示了世界首款商业化量子计算机

腾讯在2017年就组建了量子实验室


阿里巴巴在2017年成立了达摩院
 

2. 微型计算机的发展历史

微型计算机的发展通常以CPU的发展为基点。受限于性能

关于CPU的性能,有一个著名的定律——摩尔定律:集成电路的性能,每18~24个月就会提升一倍

进入21世纪后,随着芯片的发展,芯片里面的电路越来越复杂,越来越密集,并且热损耗也越来越高,我们没有办法解决这样的问题,因此,该定律慢慢失效了。

受限于单核CPU的性能瓶颈,于是发展出了多核CPU。

 

 

(02):计算机的分类

1.超级计算机

超级计算机是1)功能最强、运算速度最快、存储容量最大的计算机,2)多用于国家高科技领域和尖端技术研究,包括天气预报、海洋监测、生物制药、科学计算、核聚变核裂变模拟、加密解密算法的运算、军事战争模拟等等。

用来衡量超级计算机运算速度的单位是TFlop/s,1TFlop/s = 每秒一万亿次浮点计算

Inter(R) Core(TM) i7-6700K CPU @ 4.00GHZ 44.87 GFlop/s
44.87 GFlop/s = 0.04487TFlop/s

截至2018年11月,全世界超级计算机排名前三的见下图。

为什么神威太湖之光的处理器个数远超Summit,但算力还没有Summit高呢?这是因为神威太湖之光采用的全部是拥有自主知识产权的国产芯片。

截至2018年11月,下面是中国范围内排名前三的超级计算机。

天河二号在广州

2.大型计算机

大型计算机,1)又称大型机、大型主机、主机等,
2)具有高性能,可处理大量数据与复杂的运算,像银行金融交易的数据、证券交易所的数据处理、人口普查、企业资源规划等一些项目里面都会使用到大型计算机,
3)在大型机市场领域,IBM占据着很大的份额。(COBOL编程语言)

IBM Z9

  • NASA 最后一台大型机
  • Red Hat Enterprise Linux
  • 大型机造价高昂

提到大型机,不得不提到的就是——去“IOE”行动。
什么是IOE?
I——IBM,是服务器提供商,
O——Oracle,是数据库软件提供商,
E——EMC,则是存储设备提供商。

1、去“IOE”是阿里巴巴提出的概念
2、代表了高维护费用的存储系统
3、不够灵活,伸缩性弱

去“IOE”运动,阿里2008年提出 =》 阿里云2009年成立

三者构成了一个从软件到硬件的企业数据库系统。由这三驾马车构成的数据库系统在当时几乎占领了全球大部分商用数据库系统市场份额。除阿里巴巴这样需要大量数据运算的电商企业,其他如石油、金融行业也广泛地使用这套系统。

什么是去"IOE"?

它是阿里巴巴提出的概念。其本意是,在阿里巴巴的IT架构中,去掉IBM的小型机、Oracle数据库、EMC存储设备,代之以自己在开源软件基础上开发的系统。

为什么要去"IOE"?

因为IOE代表了高维护费用的存储系统,仅Oracle系统三年的销售价格就达到了八位数,且IOE系统伸缩性差,扩展性差,无法满足阿里日益增长的业务需要。

3.迷你计算机(服务器)

迷你计算机,也称为1)小型机、普通服务器,2)不需要特殊的空调场所,3)具备不错的算力,可以完成较复杂的运算。它不像之前的超级计算机和大型计算机,很多公司(像华为、浪潮、联想等)都可以制造。现代背景下,很多公司已经将传统的大型机替换成了普通服务器,成为大规模企业计算的中枢。云服务厂商(比如阿里云、腾讯云等),也是使用普通服务器来构建自己的云服务和数据中心的。

4.工作站

工作站是1)高端的通用微型计算机,提供比个人计算机更强大的性能,
2)类似于普通台式电脑,体积较大,但性能强劲,主要用于图像处理、动画设计、计算机辅助设计及制造CAD/CAM等领域。

5.微型计算机

微型计算机,又称为个人计算机,是最普通的一类计算机,可以分为台式机、笔记本电脑、一体机。

麻雀虽小,五脏俱全。
从构成的本质上来讲,个人计算机与前面的分类无异,都包含了计算机所必备的一些硬件。
所以,我们在学习计算机的时候,只要对个人计算机进行研究,就能触类旁通,来理解这里面所有的计算机分类了。因为我们对个人计算机相关理论的学习 ,同样适用于前面介绍的几种计算机。

总结

计算机分为五类,分别是超级计算机、大型计算机、迷你计算机(普通服务器)、工作站、微型计算机(PC),其中,超级计算机、大型计算机、工作站,我们平常接触的比较少,微型计算机、迷你计算机我们接触的多一些。微型计算机就是我们平常使用的个人计算机,而迷你计算机就是普通服务器。

 

(03):计算机的体系与结构

冯诺依曼体系

冯诺依曼体系,用一句话来概括就是:将程序指令和数据一起存储的计算机设计概念结构。

在前面学习计算机的发展历史的时候,我们知道,早期的计算机只能运行固定用途的程序,怎么理解?举个例子:有个计算机它只能运行数学运算的程序,那么它就不能运行文字处理的软件,也不能拿来玩游戏,如果要让它能够进行别的功能,就需要改变计算机的程序,而在当时,所谓的重写程序并不是指现在的重新编译一个程序那么简单,而是必须更改电路或者说更改结构,甚至重新设计这个机器。

这样就很坑爹了啊。如果说计算机只能用来打游戏,不能用来写代码,或者说只能用来写代码,不能用来玩游戏,那么我们就不能先玩一会游戏再写一会代码了,这样子是非常不合理的。于是冯诺依曼就想着将程序存储起来,然后在设计底层硬件的时候,不再是设计专有的电路,而是设计一个通用电路,当我们需要运行某种程序的时候,我们先把这段程序翻译成电路能够理解的语言,然后让通用电路去执行相关的逻辑。

这就是冯诺依曼体系的核心概念——存储程序指令,设计通用电路。

了解了冯诺依曼体系是怎样诞生的,如果能够理解冯诺依曼体系给计算机领域带来的巨大改变,我们就能明白冯诺依曼体系为什么这么重要了。由冯诺依曼体系所延伸的存储型计算机的概念,改变了之前糟糕的一切,皆由创造一种通用的指令集结构,并将所谓的运算转化为一串程序指令的运行,使整个计算机更有弹性。借助将指令当成一种特殊类型的计算数据,一台存储型的计算机可以轻易地改变其程序,并且在程序的控制下,改变运行的内容,改变的时候不需要重新设计电路,不需要重新改变计算机的结构,这就是冯诺依曼体系所带来的巨大贡献。

由冯诺依曼体系指导完成的计算机包含五大组件:

  1. 存储器:用来存放程序和数据
  2. 控制器:用来控制程序的流转和数据的输入运行,以及处理运算结果
  3. 运算器:主要运行算数运算和逻辑运算,并将中间结果暂存到运算器中
  4. 输入设备:用来将人们熟悉的信息形式转换为机器能够识别的信息形式,常见的有键盘,鼠标等
  5. 输出设备:可以将机器运算结果转换为人们熟悉的信息形式,如打印机输出,显示器输出等

我们现代所有使用的计算机,从本质上讲,都是冯诺依曼机,包括笔记本电脑、台式电脑、普通服务器、迷你计算机等等。由冯诺依曼体系所指导完成的计算机,必须有以下的几点功能:

  1. 能够把需要的程序和数据送至计算机中(由输入设备完成)
  2. 能够长期记忆程序、数据、中间结果及最终运算结果的能力(由存储器完成)
  3. 能够具备算术、逻辑运算和数据传送等数据加工处理的能力(由运算器、控制器完成)
  4. 能够按照要求将处理结果输出给用户(由输出设备完成)

冯诺依曼体系结构示意图:

我们可以看到,存储器和CPU是分开的,这就导致一个问题:CPU和存储器速率之间的问题无法调和。因为CPU是高速运算的,处理速率极快,而存储器没有CPU快,到CPU的数据传输速度慢,这会导致CPU经常空转等待数据传输,这样子是非常浪费资源的。

既然我们都知道了冯诺依曼体系存在的性能瓶颈,那么,如何解决呢?

现代计算机的结构

  • 现代计算机在冯诺依曼体系结构基础上进行了修改
  • 解决了CPU和存储设备之间的性能差异问题

下面是现代计算机的结构示意图:

可以看到,跟前面不一样的是,运算器、控制器和存储器组成了现代计算机的CPU。

存储器,从广义上,可以理解为存储数据的介质,包括磁带和硬盘。但是,这里的存储器主要是指围绕CPU的高速设备,包括寄存器和内存。现代计算机的结构,可以理解为以存储器为核心的结构。

关于存储器,还有很多需要理解的知识,我们会在后续文章里详细介绍。

总结

这一节,我们需要了解冯诺依曼体系的含义和它是如何产生的,还需要了解现代计算机的结构和特点以及它解决了什么问题。

 

(04):计算机的层次与编程语言

程序翻译与程序解释

计算机是无法直接理解人类语言的,它只认识01010101...这样的比特位,因此,我们需要进行程序翻译或程序解析,把人类语言翻译或解析成计算机所能理解的语言。

那么程序翻译和程序解析这两者之间有什么区别和联系呢?为了理解问题,我们引入两个语言,

一个是较为高级的计算机语言——L1,

一个是较为低级的计算机语言——L0,

我们接下来会使用这两个语言作为例子来理解什么是程序翻译,什么是程序解析。

程序翻译

假设我们现在使用较为高级的计算机语言L1来进行程序的逻辑描述,也就是说我们使用L1来编写程序,那么这个由L1编写的程序是怎么样执行的呢?当然了,它不是直接执行的,而是在执行的时候生成一个逻辑等价的由低级语言L0组成的程序,这个L0是计算机实际执行的语言,那么由L1生成L0这个过程,我们称之为程序翻译,用于生成L0的工具叫编译器。

程序解析

同样的,假如我们使用L1来进行程序的逻辑描述,那么这个由L1编写的程序是怎样执行的呢?为了执行L1,我们还需要使用L0实现另外一个程序,这个程序把L1程序作为输入来进行执行,每一句L1程序会在L0所实现的程序里面进行等价的转换,然后执行,这就是程序的解析,其中,使用L0实现的程序叫做解释器。

简要的总结程序翻译和程序解析:

  1. 对于前面的两个例子而言,计算机执行的指令都是L0
  2. 翻译过程生成新的L0程序,解释过程不生成新的L0程序
  3. 解释过程由L0编写的解释器去解释L1程序

理解了程序翻译和程序解释,我们来看下常见的编程语言,哪些语言是翻译型语言,哪些是解释型语言,如下图:

对于常见的,我们还有Java和C#,它们又属于哪种语言呢?其实,严格的来说,它们既不属于翻译型语言,也不属于解释型语言,它们是属于翻译+解释型语言

如何理解翻译+解释型语言呢?以Java程序的运行过程为例,Java程序首先会被编译器编译成JVM字节码,然后会通过解释器解释成机器码,从而被计算机执行。

计算机的层次与编程语言

按层次来划分计算机系统的话,我们可以划分成七个层次。

下面逐一介绍每一层。

硬件逻辑层:1)主要由门电路、触发器等逻辑电路组成,2)属于电子工程的领域,这里就不展开介绍了。

微程序机器层:1)编程语言主要是微指令集,2)微指令所组成的微程序直接交由硬件执行,主要是由生产硬件的公司的程序员来编写的。

传统机器层:1)编程语言主要是CPU指令集(机器指令),2)编程语言和硬件是直接相关的,程序员所用机器指令编写的程序可以交由微程序直接进行解析,而这里提到的指令集,存储在CPU内部,对CPU的运算进行指导和优化,拥有指令集,CPU就可以有效地运行。我们知道,CPU的制造商分为AMD和Intel两大阵营,那么这两大厂商生产的CPU最大的区别是——指令集不同,Intel的CPU所使用的指令集不适合AMD的CPU,同样的,AMD的CPU所使用的指令集也不适合Intel。除了不同厂商以后,同一个厂商也可以生产不同指令集的CPU,即3)不同架构的CPU使用不同的CPU指令集。

操作系统层:1)向上提供了简易的操作界面,使得用户能够容易地操作计算机;
2)向下对接了指令系统,管理硬件资源。
3)操作系统是在软件和硬件之间的适配层。
   操作系统对用户程序所使用机器的各种资源进行管理和分配,包括CPU、存储器等等比如说,当一个用户程序需要运行的时候,首先由操作系统将其加载到内存中,这就需要操作系统首先为其分配内存空间来进行存储。再比如说,某一个程序需要使用某一个输出设备进行结果输出的时候,需要操作系统为其提供该设备的控制权。

汇编语言层:)编程语言是汇编语言,2)汇编语言可以翻译成可直接执行的机器语言,3)完成这个翻译过程的程序就是汇编器。从这一层开始,它们所使用的编程语言就是人类比较容易理解的语言了。

高级语言层

  • 编程语言就是为广大程序员所接受的高级语言
  • 高级语言的种类非常多,有几百种
  • 常见的编程语言有Python、Java、C/C++、Golang等

应用层:计算机针对某种用途而设计的应用,像Word、Excel等。

 

(05):计算机的计量单位

容量单位

在日常生活中,我们常说,200M的光盘、8G的内存、2T的硬盘,这里的M、G、T就是容量单位,那么它们各自代表着什么含义以及它们之间是如何换算的呢?

1)在计算机的物理层面,用高低电平记录信息,高电平代表1,低电平代表0,

2)计算机只认识0和1两种状态,这里的0或1我们就称为一个bit(比特位),

3)但是0/1能够表示的内容太少了,需要更大的容量表示方法

0/1称为bit(比特位)

字节:1Byte=8bits

1000000000Bytes

因此人们用8个比特位来表示一个字节(byte),一个字节等于八个比特位。随着计算机的发展,存储容量越来越大,用字节来表示容量也显得很不方便了,于是,出现了更高的容量单位。

1024=2^10

上图是现在常见常使用的计算机容量单位,可以看到,1Byte=8bit,1KB=1024Byte,1MB=1024KB ... ...

1G内存,可以存储多少字节的数据?可以存储多少比特数据?
1G=1024^3Bytes=1024^3*8bits

为什么网上买的移动硬盘500G,格式化之后就只剩465G了?
硬盘商一般用10进位标记容量
500*1000^3/1024^3=465

速度单位

这部分内容包括:网络速度和CPU频率。

网络速度

装宽带的时候,我们常说50M宽带、100M宽带,这里的M不是容量单位,而是网络速度——带宽,单位是Mbps(兆位/秒),前面只是省略了bps。

为什么电信拉的100M光纤,测试峰值速度只有12M每秒?
网络常用单位为(Mbps)
100M/s = 100Mbps = 100Mbit/s
100Mbit/s=(100/8)MB/s=12.5MB/s

CPU频率

1)CPU的速度一般体现为CPU的时钟频率,也称为主频,
2)单位为赫兹(Hz),是评定CPU性能的重要指标,
3)主流CPU的时钟频率都在2GHz以上。

  • Hz其实就是秒分之一
  • 并不是描述计算机领域所专有的单位

赫兹是国际单位制中频率的单位,是每秒中的周期性变动重复次数的计量,当用来描述计算机的CPU时,表达的是高低电平每秒钟变换的次数,主频越高,一个时钟周期里面完成的指令数也越多,2GHz,就是说每秒高低电平变换20亿次。

 

(06):计算机的字符与编码集

字符编码集的历史

ASCII码

对于ASCII码,相信大家在平时的学习、工作中都有所了解。

ASCII码,英文全称为:American Standard Code for Information Interchange,翻译过来就是:美国信息交换标准代码,是我们平常常用的一种编码。那它是怎么来的呢?

在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),假如,对于字符a,比尔盖茨想用0001来表示,而乔布斯想用0010来表示,那么他们在沟通交流的时候谁都无法理解对方的语言。因此,为了计算机能够互相通信而不造成混乱,就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。

标准ASCII码也叫基础ASCII码,使用7个比特位来表示所有的大写和小写字母,数字0到9、标点符号,以及在美式英语中使用的特殊控制字符,共定义了128(2的7次方)个字符

  • 使用7个bits就可以完全表示ASCII码
  • 包含95个可打印字符
  • 33个不可打印字符(包括控制字符)

33+95=128=2^7

下面我们通过一张表来了解部分ASCII码。

表中列出了常见字符的ASCII码,如:字母a表示为01100001、字符(不是数字哦~)1表示为00110001... ...

在计算机的早期,ASCII码就能满足特定人群的使用了,但是,随着计算机的发展以及计算机的普遍性,ASCII码逐渐不能满足人们的使用需求,比如一些数学符号以及一些国家的符号都无法表示。于是,人们对ASCII码进行了扩充,用8个比特位来表示一个字符,这就是拓展的ASCII码,拓展的ASCII码能表示256个字符。

Extended ASCII码

如下图,是拓展的ASCII码表。

这里面包括了常见的数学运算符带音标的欧洲字符以及其他常用符号、表格符号等。使用了拓展的ASCII码极大的补充了原来的码表,使得计算机能表达的内容越来越丰富。

字符编码集的国际化

随着计算机的进一步发展,越来越多的国家加入到了使用计算机的行列中,对字符编码集的要求也越来越高。

  • 对于欧洲、中亚、东亚、拉丁美洲等国家来说,它们的语言丰富多样
  • 语言体系不一样,不以有限字符为组合
  • 尤其以中国、韩国、日本等的语言最为复杂

ASCII码表根本无法表达这些语言,这就迫切需要使用新的编码集,也就是字符编码集的国际化。

中文编码集

GB2312

GB2312是1980年制定的中国汉字编码国家标准,是我国最早最完备的一个编码集.

  • 《信息交换用汉字编码字符集-基本集》
  • 一共收录了7445个字符
  • 包括6763个汉字和682个其他字符,一个汉字占用两个字节

GB2312需要多少个比特位?13位

GBK

由于GB2312不符合国际标准,中国的科学家在1995年推出了第二套完备的编码集——GBK。

  • 《汉字内码扩展规范》
  • 向下兼容GB2312,向上支持国际ISO标准
  • 收录了21003个汉字,支持全部中日韩汉字

GB2312和GBK都是比较完备的编码集,但是,它们只是一个本地化的编码,在中国使用是没问题的,但要跨国使用就有问题了。举个例子,一个中国人开发了一个网站,一个外国友人访问了这个网站,如果他们本地没有安装GB2312编码集或GBK编码集的话, 那么他们在访问网站网页的时候看到的会是乱码。因此,就需要一个全球统一的编码规范。

 

Unicode

为了统一所有文字的编码,Unicode应运而生。Unicode是一个兼容全球的字符集,定义了世界通用的符号集,可以表达全世界所有的文字和字符。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

  • Unicode:统一码、万国码、单一码
  • Unicode定义了世界通用的符号集,UTF-*实现了编码
  • UTF-8以字节为单位对Unicode进行编码

兼容全球的字符集:Unicode

我们平时用的UTF-8是其中一个编码规则,它以字节为单位对Unicode进行编码,平常写代码的时候都是推荐使用UTF-8编码。

  • 中文Windows操作系统默认使用GBK编码
  • 使用IDE编程时通常要设置成UTF-8编码
  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值