操作系统是用户与计算机硬件之间的接口,没有操作系统作为中介,用户对计算机的操作和使用将变得非常难且低效。
它具备五个方面的功能,即CPU管理,作业管理,存储器管理,设备管理及文件管理
微型计算机常用的操作系统有DOS(Disk Operating System)、Unix、Xenix、Linux、Windows98/2000、NetWare、WindowsNT、WindowsXP等
程序设计语言按其发展演变过程可分为三种:机器语言、汇编语言和高级语言,前二者统称为低级语言。
机器语言(Machine Language)是直接由机器指令(二进制)构成的,因此由它编写的计算机程序不需要翻译就可直接被计算机系统识别并运行。这种由二进制代码指令编写的程序最大的优点是执行速度快、效率高,同时也存在着严重的缺点:机器语言很难掌握,编程繁琐、可读性差、易出错,并且依赖于具体的机器,通用性差。
汇编语言(Assemble Language)采用一定的助记符号表示机器语言中的指令和数据,是符号化了的机器语言,也称作“符号语言”。汇编语言程序指令的操作码和操作数全都用符号表示,大大方便了记忆,但用助记符号表示的汇编语言,它与机器语言归根到底是一一对应的关系,都依赖于具体的计算机,因此都是低级语言。同样具备机器语言的缺点,如:缺乏通用性、繁琐、易出错等),只是程度上不同罢了。用这种语言编写的程序(汇编程序)不能在计算机上直接运行,必须首先被一种称之为汇编程序的系统程序“翻译”成机器语言程序,才能由计算机执行。任何一种计算机都配有只适用于自己的汇编程序(Assembler)。
高级语言又称为算法语言,它与机器无关,是近似于人类自然语言或数学公式的计算机语言。高级语言克服了低级语言的诸多缺点,它易学易用、可读性好、表达能力强(语句用较为接近自然语言的英文字来表示)、通用性好(用高级语言编写的程序能使用在不同的计算机系统上)。但是,对于高级语言编写的程序仍不能被计算机直接识别和执行,它也必须经过某种转换才能执行。
语言处理程序的功能是将除机器语言以外,利用其他计算机语言编写的程序,转换成机器所能直接识别并执行的机器语言程序的程序。可以分为三种类型,即汇编程序、编译程序和解释程序。
通常将汇编语言及各种高级语言编写的计算机程序称为源程序(Source Program),而把由源程序经过翻译(汇编或者编译)而生成的机器指令程序称为目标程序 (Object Program)。语言处理程序中的汇编程序与编译程序具有一个共同的特点,即必须生成的目标程序,然后通过执行目标程序得到最终结果。而解释程序是对源程序进行解释(逐句翻译),翻译一句执行一句,边解释边执行,从而得到最终结果。解释程序不产生将被执行的目标程序,而是借助解释程序直接执行源程序本身。
现代计算机,大部分都是基于冯诺依曼体系结构,而我们这里谈论的也是此问前提。冯诺依曼的核心是:存储程序,顺序执行。所以不管计算机如何发展,基本原理是相同的。计算机程序实际上是告诉计算机做什么。
冯诺依曼体系结构有以下特点:
对于我们现代计算机来说,最关键的2个部件就是CPU和内存。内存存储了要执行的程序指令,而CPU就是用来执行这些指令。CPU首先要知道这些指定存放在存储器的那个区域,然后才能执行,并且把执行的结果写入到执行区域。
在计算机中指令和数据都用二进制来表示,也就是说它只认识0和1这样的数字。计算机怎么知道你这些组合的意思?
CPU指令集
随着计算机的发展,CPU支持的指令也越来越多,功能也越来越强,上图就是现在Core I5处理器支持的指令集。
使用0和1这样的机器语言好处是CPU认识,可以直接执行,但是对于程序本身来说,没有可读性,难以维护,容易出错。所以就出现了汇编语言,它用助记符(代替操作码指令,用地址符号代替地址码。实际是对机器语言的一种映射,可读性高。
把汇编语言转换为机器语言需要一个叫做汇编器的工具。对于目前的CPU厂商,在推出的CPU指令时都会同时退出新的汇编器。如果你还在使用老版本的汇编器那么只能使用机器码来使用新的指令了。
汇编语言的出现大大提高了编程效率,但是有一个问题就是不同CPU的指令集可能不同,这样就需要为不同的CPU编写不同的汇编程序
于是又出现了高级语言比如C,或者是后来的C++,JAVA,C#
高级语言把多条汇编指令合成成为了一个表达式,并且去除了许多操作细节(比如堆栈操作,寄存器操作),而是以一种更直观的方式来编写程序,而面向对象的语言的出现使得程序编写更加符合我们的思维方式。我们不必把尽力放到低层的细节上,而更多的关注程序的本身的逻辑的实现
对于高级语言来说需要一个编译器来完成高级语言到汇编语言的转换。所以对比不同的CPU结构,只需要有不同编译器和汇编器就能使得我们的程序在不同CPU上都能运行了。
如下图在VS2010中,我们可以选择程序编译的目标平台,X86,X64,ARM等。当然除了这些编译类的语言之外还有解释类型的语言如JS,就不在此讨论范围内。
**当CPU的指令集更新后高级语言会有什么影响和变化?**对于目前来说,一般出现了新的指令,会有对应的新的汇编器和编译器。所以编译器可以把一些高级语言的表达式编译成新的汇编指令,这样对于高级来说不会有任何变化
从上面的我们可以看出,我们写的程序最终都将变成机器认识的二进制可执行程序,然后加载到内存顺序的执行。 从机器码到汇编到高级语言,我们可以看到计算机中无处不在的分层,抽象的思想。不光光是软件,硬件同样适用
指令控制: 指令控制也称为程序的顺序控制,控制程序严格按照规定的顺序执行。
操作控制: 将取出的指令的产生一系列的控制信号(微指令),分别送往相应的部件,从而控制这些部件按指令的要求进行工作。
时间控制: 有些控制信号在时间上有严格的先后顺序,如读取存储器的数据,只有当地址线信号稳定以后,才能通过数据线将所需的数据读出,否则读出的数据是不正确的数据,这样计算机才能有条不紊地工作。
数据加工: 所谓数据加工,就是对数据进行算术运算和逻辑运算处理。 所谓数据加工,就是对数据进行算术运算和逻辑运算处理
通过以上我们了解了CPU的工作过程。简单来说就是CPU要顺序执行一个程序的指令,首先是控制器获得第一条指令的地址,当CPU取得这个指令并执行后,控制器需要生成下一条要执行的指令的地址。ALU单元负责一些运算操作。下面的FLASH演示了CPU执行一个加法操作的流程。
本文主要是简单介绍了计算机的一些发展历史和通用CPU的结构以及工作流程。加深了我们对冯诺依曼体系的储存程序,顺序执行的理解。无论硬件是什么样子,冯诺依曼计算机的基本原理就是这样
当然了解了基本原理之后,会产生更多的问题,
比如可执行文件又是如何被装载到内存的?
CPU和内存之间是如何通信的呢?
是如何根据地址找到指令的呢?
内存结构又是什么样子?
CPU如何和内存之外的设备通信呢?
这些问题都会在后面给出答案。
存储器为CPU提供指令和数据。 在这个简单的模型中,存储器是一个线性的字节数组。CPU可以在一个常数的时间内访问每个存储器的位置,虽然这个模型是有效的,但是并不能完全反应现代计算机实际的工作方式。
整个存储器系统中包括了寄存器、Cache、内部存储器、外部存储
层次越高速度越快,但是价格越高,而层次越低,速度越慢,价格越低。
相对于CPU来说,存储器的速度是相对比较慢的。无论CPU如何发展,速度多块,对于计算机来说CPU总是一个稀缺的资源,所以我们应该最大程度的去利用CPU。其面我们提到过CPU周期,一个CPU周期是取1条指令的最短的时间。由此可见,CPU周期在很大程度上决定了计算机的整体性能
你想想如果当CPU去取一条指令需要2s,而执行一个指令只需要2ms,对于计算机来说性能是多么大的损失。所以存储器的速度对于计算机的速度影响是很大的。
对于我们来说,总是希望存储器的速度能和CPU一样或尽量的块,这样一个CPU周期需要的时钟周期就越少。但是现实是,这样的计算机可能相当的昂贵。所以在计算机的存储系统中,采用了一种分层的结构。速度越快的存储器容量越小,这样就能做到在性能和价格之间的一个很好的平衡。
计算机的发展离不开存储器的发展,早起的计算机没用硬盘,只有几千字节的RAM可用。而我们现在4G,8G的内存已经随处可见,1T的大硬盘以及上百G的固态硬盘,而价格也比10年,20年前便宜的很多很多。所以我先大概了解下各种存储技术。目前存储技术大致分为SRAM存储器、DRAM存储器、ROM存储器和磁盘。
CPU内部有很多寄存器,寄存器在存储层次结构的顶端。
它也叫触发器,它往往和CPU同时钟频率,所以速度非常快。
但是一个寄存器需要20多个晶体管,所以如果大量使用,CPU的体积会非常大。
RAM(Read-Access Memory)分为两类,静态(SRAM)和动态(DRAM)
SDRAM比DRAM要快的多,但是价格也要贵的多
静态RAM:SRAM将每个位存储在一个双稳态的存储单元中,每个存储单元是用一个六晶体管电路实现的。它的特点是可以无限期(只要有电)的保持在两个稳定状态中的一个(正好可以存放0或1)而其他任何状态都是不稳定的会马上切换到这两个状态中的一个
动态RAM: DRAM是利用电容内储存电荷的多寡来代表一个二进制位元(bit)是1还是0,每一bit由一个晶体管和电容组成。由于在现实中电容会有漏电的现象,导致电位差不足而使记忆消失,因此除非电容经常周期性地充电,否则无法确保记忆长存。由于这种需要定时刷新的特性,因此被称为“动态”记忆体。
SRAM相比DRAM速度更快功耗更低,而由于结构相对复杂占用面积较大,所以一般少量在CPU内部用作Cache,而不适合大规模的集成使用,如内存。而DRAM主要用来作为计算机的内部主存。
Cache:前我们CPU中一般集成了2到3级的Cache,容量从128K到4M。对于CPU总的Cache来说,它们的也是和CPU同频率的,所以理论上执行速度和寄存器应该是相同的,但是Cache往往用来存储一些指令和数据,这样就存在一个命中的问题。当没有命中的时候,需要向下一集的存储器获取新的数据,这时Cache会被lock,所以导致实际的执行速度要比寄存器慢
主存: 也就是我们说的内存,使用DRAM来实现。但是我们目前听的内存一般叫DDR SDRAM,还有早期的SDRAM。这是一种同步的DRAM技术,我们不需要了解他的详情,只需要知道它能有效的提高DRAM的传输带宽。而DDR表示双倍的速率,而现在又有了DDR2,DDR3,DDR4,他们的带宽也是越来越大
前硬盘主流已经是500G,1T。转速也在7200转左右。相对于8G的内存,一个500G的硬盘可以说是相当的便宜。但是问题在于他的速度非常的慢,从磁盘读取数据需要几个毫秒,而CPU时钟周期是以纳秒计算。磁盘读取操作要比DRAM慢10万倍,比SRAM慢百万倍。
相对于CPU,内部存储的电子结构,磁盘存储是一种机械结构
数据都通过电磁流来改变极性的方式被电磁流写到磁盘上,而通过相反的方式读回
个硬盘由多个盘片组成,每个盘片被划分为磁道,扇区和最小的单位簇。而每个盘面都有一个磁头用来读取和写入数据。而硬盘的马达装置则控制了磁头的运动
随着计算机的发展,缓慢的磁盘速度已经成为计算机速度的障碍了。大多数情况下,你的CPU够快,内存够大,可是打开一个程序或游戏时,加载的速度总还是很慢。(关于程序加载的过程后面的文章会讲到)。原因就是磁盘读写速度太慢
简单可以理解为是将数据指令存储在其他机器上,比如分布式系统,WebService Server,HTTP Server以及现在炒的火热的云端存储。计算机通过网络相互连接。比较起磁盘,远程存储的速度是以秒来计算。
我们知道计算机的体系是存储程序,顺序执行。所以在执行一个程序的指令时,它后面的指令有很大的可能在下一个指令周期被执行。而一个存储区被访问后,也可能在接下来的操作中再次被访问。这就是局部性的两种形式:
时间局部性
空间局部性
所谓总线是各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束。我们知道计算机有运算器,控制器,存储器,输入输出设备这五大组件,所以总线就是用来连接这些组件的导线
按照计算机所传输的信息种类,计算机的总线可以划分为
数据总线
数据总线DB是双向三态形式的总线,即它既可以把CPU的数据传送到存储器或输入输出接口等其它部件,也可以将其它部件的数据传送到CPU。数据总线的位数是微型计算机的一个重要指标,通常与微处理的字长相一致。我们说的32位,64位计算机指的就是数据总线
地址总线
地址总线AB是专门用来传送地址的,由于地址只能从CPU传向外部存储器或I/O端口,所以地址总线总是单向三态的,这与数据总线不同。地址总线的位数决定了CPU可直接寻址的内存空间大小。
控制总线
控制总线主要用来传送控制信号和时序信号。控制总线的传送方向由具体控制信号而定,一般是双向的,控制总线的位数要根据系统的实际控制需要而定。其实数据总线和控制总线可以共用。
总线也可以按照CPU内外来分类
内部总线:在CPU内部,寄存器之间和算术逻辑部件ALU与控制部件之间传输数据所用的总线称为片内部总线。
外部总线:通常所说的总线指片外部总线,是CPU与内存RAM、ROM和输入/输出设备接口之间进行通讯的通路,也称系统总线。
CPU通过总线和存储器之间直接进行通信。实际上在现代的计算机中,存在一个控制芯片的模块。CPU需要和存储器,I/O设备等进行交互,会有多种不同功能的控制芯片,我们称之为控制芯片组(Chipset)
对于目前的计算机结构来说,控制芯片集成在主板上,典型的有南北桥结构和单芯片结构