程序员应该了解的计算机知识(一)——基础理论

前记

   对于半道入行编程的程序员,大部分对计算机的工作原理的了解都是有限的,这些了解大部分都是在日常工作中去了解的,其实对应程序员来说不用深入了解理解计算机基本原理就足以应付当前的工作需要。然而多了解总比不了解要强,这也是笔者要整理此片文章的由衷。

计算机系统概述

1.计算机的分类

   步入21世纪的你,如果还不知道“计算机”,那你真的是OUT了。计算机是20世纪人类最伟大的可选成就之一,话说计算机从总体上来说可分为电子模拟计算机和电子数字计算机两大类。电子模拟计算机主要是通过电压电流模拟实现连续的数值运算,常被一些实验室的科研人员所熟知;而被大众所熟知的则是电子数字计算机,也就是我们称之为的“电脑”,其主要是通过模拟数字实现非联系的位运算。

   数字计算机根据计算机效率、速度、适用性等特点,通常又分为专用计算机和通用计算机两类。专用计算机,顾名思义,其是专门为完成某一类工作而设计的,所以其完成这项工作的效率极高,但是其适用性就大打折扣了。通用计算机并非是为完成莫一项任务而设计,能够兼容性完成多项任务,按照简易程度、性能等特点又可以分为巨型机、大型机、中型机、微型机和单片机六类,其体积、功能、数据存储量、指令系统等从前到后依次高升,但是其简易性则依次降低。巨型机通常也成为“超级计算机”,其结构复杂,运算速度极快,数据存储量大,但是足够庞大;大中小型计算机主要是根据其体积来衡量划定的;微型机简称为“微机”,就是常见的个人计算机(PC),其是由大规模的集成电路组成的体积较小的计算机;单片机则是最为简单的计算机,其主要是集成电路组成,以至于其体积小,结构简单。这些划分只是根据其特点来区分的,随着大规模集成电路的迅速发展,今天的小型机可能是明天的微型机,而今天的微型机可能是明天的单片机。

2.计算机的组成

   计算机主要由硬件系统和软件系统两部分组成(相信是人都应该看的到,硬件是有型的实体,而软件则是有型的虚构体),其中硬件构成了计算机的物质基础,软件则是计算机系统的应用基础。通俗的说,软件就是计算机上能看得到(当然也有看不到的)但是摸不到的能够协助完成工作的应用程序,例如Windows系统、硬件驱动程序等其他应用程序;而硬件则是计算机的基本组件,是看得到摸得到的物体,例如主板、CPU等。

2.1.硬件系统组成

   从理论上讲,计算机的硬件系统主要由运算器、存储器、控制器、输入设备和输出设备五大部分组成(从名字上即可看出各个部件的作用),这种划分方式称为“冯诺依曼体系结构”。

  • 运算器

   运算器(Datapath),顾名思义就是进行运算的执行部件。其主要功能是对数据进行运算的加工处理操作,包括加、减、乘、除等数学算术运算和与、或、非等逻辑运算。运算器主要由运算逻辑单元(ALU)和寄存器两部分元件组成,其中寄存器用于提供参与运算的数据或临时保存运算结果。通常情况下运算器集成于CPU*处理器中。

   实质上运算器采用的二进制数制系统,其参与运算的数是有二进制表示(因为二进制数的运算规律非常简单,在电子线路中可以灵活的表示电子元件的状态,其比较容易实现而且设备最省)。在运算过程中,位数越多则运算精度越高,则其所需的电子元件就越多,现在常见的计算机运算器支持的位数有8位、16位、32位或64位。

  • 存储器

   存储器(Memory),顾名思义就是用于存储数据的部件。其主要功能用于存放程序与数据(程序是计算机操作的依据,数据是计算机操作的对象),程序和数据在存储器中以二进制的方式表示,每8位二进制数码划分为一个存储单元,必须通过地址来访问该单元,地址其实就是这个存储单元的编号。

   存储器主要由存储体、地址寄存器与译码线路、读写电路与数据寄存器、控制线路等元件构成;通常情况下存储器可分为内部存储器和外部存储器两大类,内部存储器就是我们常说的内存(也称为主存),外部存储器也就是常说的硬盘、U盘等,也成为外存或辅存,一般情况下外部存储器也作为输入/输出设备。

  • 控制器

   控制器(Control),是整个计算机的控制中心,主要用来协调计算机各个组件的工作,完成程序信息的处理和数据的输入/输出。它一般由指令寄存器、状态寄存器、指令编码器、时序电路和控制电路组成。简而言之,控制器就是协调指挥计算机各个部件工作的组件。通常情况下控制器集成于CPU*处理器中。

   程序是由指令序列组成的,其实执行程序就是逐条执行指令的过程,实质运算器所完成的每一步运算操作就是一条指令。指令是由操作码和地址码组成,其实都是二进制数码,其中操作码即表示指令所要进行的操作,例如加、减、存、取等操作,地址码表示参与运算的数据的地址,即在存储单元中的位置。控制器就是解析这条指令,然后从存储单元中取出数据,并进行相应的操作运算。

   计算机在进行计算机时,指令必须按顺序一条一条的执行。控制器的基本任务就是按照指令序列的顺序,先从存储器取出一条指令放到控制器中,并对该指令的操作码由译码器进行解析,然后根据译码对应的操作进行相应的动作行为,这就是执行指令的过程;接着取出第二条指令,按照上述顺序进行执行。过程中控制器会通过指令计数器来控制取指令的当前位置,每取出一条指令其计算器就会加1,为取下一条指令做好准备。

  • 输入/输出设备

   输入设备(Input System),输入设备是计算机的重要外部设备,其主要作用是将程序、原始数据、文字、字符、控制命令或现场采集的数据等信息输入到计算机,并转换为二进制格式保存在内存中。常见的输入设备有键盘、鼠标器、光电输入机、磁带机、磁盘机、光盘机等。

   输出设备(Output System),输出设备是计算机的重要外部设备,其主要作用是将计算机的运算中间结果或最终结果、机内的各种数据符号及文字或各种控制信号等信息展示给用户。常见的输出设备有显示器、打印机、绘图仪、音箱、投影仪等。

  • 总线

   除过上面介绍的五部分外,计算机系统中还必须包括另一个部件——总线。总线是一组为系统部件之间数据传送的公用信号线。具有汇集与分配数据信号、选择发送信号的部件与接收信号的部件、总线控制权的建立与转移等功能。典型的微机计算机系统的结构通常多采用单总线结构,一般按信号类型将总线分为三组,其中AB(Address Bus)为地址总线;DB(Data Bus)为数据总线;CB(Control Bus)控制总线。计算机通过总线将五大部件连接起来,总线是它们相互通信的公共通路,主要任务是在各部件之间传送地址信息、数据信息和控制信息。

2.1.硬件实物组成

   从实物上看,一般PC包括键盘、鼠标、显示器、主机等大型部件组成,而主机则是计算机的主体部分,包括CPU、主板、内存条、显卡、声卡、网卡、硬盘以及其他媒体驱动器组成(这些都是通常听到的可见的实体物件)。

  • 主板

   主板,又称主机板(Main Board)、系统板(System Board)或母板(Mother Board),是计算机最重要的部件之一。主板上包含了计算机的主要电路系统,所有的计算机其他组件必须直接或间接依赖主板,计算机的性能主要取决与主板。主板其实可以看作一个设有多个接口的电路板,其中主要包括芯片、插槽、外设接口三大类组件。

   芯片类主要有BIOS(Basic Input/Output System)芯片,南北桥芯片和RAID控制芯片等。BIOS芯片,即基本输入/输出系统芯片,它是一个存储器,内部保存着与主板搭配的基本输入输出系统程序,这个程序由芯片制造商制作并固化在芯片上的;也可以说BIOS其实是一个底层软件,用于控制计算机的底层的输入输出操作,这个软件可以识别各种硬件,还可以设置引导系统的设备,系统时间以及调整CPU外频等。因为BIOS是存储在BIOS芯片中的,而不是类似其他的外部存储器中,所以通常称为“固件(Firmware)”。随之技术的不断发展,现在的BIOS也支持重新写入,可以使计算机获得更好的性能和支持。 南/北桥芯片是两个通信桥梁的两个芯片,合成芯片组。南桥芯片主要负责硬盘等存储设备和PCI之间的数据流通;北桥芯片主要负责处理CPU、内存和显卡三者间的数据流通,一般发热量较大,位于散热装置附近。RAID控制芯片,主要用于支撑硬盘。

   插槽类主要有CPU插槽、内存插槽、PCI插槽、PCI Express插槽等。CPU插槽用于安装CPU部件,CPU部件必须与主板相互兼容才可以安装。内存插槽主要用于安装内存条的卡槽,内存种类、数量和容量都有内存插槽决定。PCI插槽主要用于安装调制解调器、声卡、网卡等设备。PCI Express插槽主要用于安装显卡部件。

   外设接口类主要有硬盘接口、COM接口(串口)、PS/2接口、USB接口、LPT接口(并口)、MIDI接口等。硬盘接口可分为IDE接口和SATA接口,现在大多都是SATA硬件驱动器接口,这个接口的传输数据效率更高。COM接口用于连接串行鼠标和外置调制解调器(Modem)等设备,基本被淘汰。PS/2接口用于连接键盘或鼠标,台式机存在。USB接口使用较为广泛,大多数外置设备都支持这个接口,该接口支持即插即用。LPT接口用于连接打印机或扫描仪等。MIDI接口主要用于MIDI设备,用于与其它控制设备相互通信。

   综上所述,主板在计算机中起到了举足轻重的作用,通过各种控制信号来管理各种电子容器,从而达到不同的效果,几乎所有的外设接口都直接或间接的与主板相关联,大部分的硬件设备必须与主板相兼容才能正常运行,也可以说主板可以决定其它的部件。主板可以看着各个部件协调工作的场所,提供各个不仅相互协调工作的数据流通,主板内部自身供电装置维护其内部BIOS的运行。

  • CPU

   CPU(Central Processing Unit),一个耳熟能详的组件,被亲切的称之为“*处理器”,它是整个计算机的运算核心和控制核心。其主要功能是解释计算机指令以及处理程序中的数据。CPU由运算器(包含寄存器)和控制以及总线组成,CPU的工作过程分为提取(Fetch)、解码(Decode)、执行(Execute)和写回(Writeback)四个步骤。

   程序是有指令(指令就是二进制数码组合)构成的序列,执行程序就是按指令序列逐条执行指令。当打开某个程序时,会由运行平台将该程序解析为指令序列并保存在存储器中,然后CPU取出指令序列逐条执行。CPU首先从存储器或高速缓冲存储器中检索指令;然后根据CPU固有的指令集架构(ISA)的定义将提取的指令数值解释为CPU能够识别的指令码(运算码和运算目标等);紧接着执行CPU指令码,根据指令码对应的控制信号连接到各种能够进行所需运算的其它部件并控制其作出相应动作,从而达到运算效果;最终将运算结果写回到CPU内部的寄存器(暂存器),CPU运算大致就是这个过程。

   CPU是计算机最重要的组件之一,提供指令控制、操作控制、时间控制、数据加工等功能,其中指令控制主要是指控制指令执行的顺序;操作控制主要是指根据对应的指令产生相应的操作控制信号发送给相应的部件并控制这些部件按指令的要求进行动作;时间控制主要是指对各种操作定制时间的的设定;数据加工是最重要的功能,主要是进行数据的运算处理。

   CPU的性能决定了计算机的性能,然而外部又受主板的牵制。CPU的字长、工作频率、Cache容量、指令系统和逻辑结构决定了一个CPU的性能,其中字长表示CPU一次最多可同时传送和处理的二进制数码位数,现在常见的有32位和64位;工作频率(也称主频)就是CPU的处理数据的速度,单位为兆赫兹(MHz)或千兆赫兹(GHz),通常情况下频率越高运算数据的速度越快,当然这只是一个大致概念,通常情况下CPU的实际运算速率还受CPU的流水线、总线等各方面性能的影响;缓存(Cache)容量也是CPU处理数据速率的重要指标,缓存主要用于临时存储指令或参与CPU运算的数据,减少数据传输的时间,现在的CPU大多设有2级缓存;CPU指令系统是CPU内部基础的与硬件电路相配合的指令系统,也成为指令集,是CPU处理数据效率的重要衡量标准,指令集用于控制各个部件的协调工作。

   综上所述,CPU是计算机的“大脑”,是控制其它组件协调工作的的部件,是计算机数据运算的场所。CPU内部包含了其独立的指令集,所有的程序都将被解析为该CPU对应的指令序列才能正常执行,CPU必须具备数据通信,资源共享,分布式处理和提供系统可靠性等特点。理论上将CPU频率越高、指令系统越高级、缓存越大,其处理数据的数度就越快,然而其必须要与对应的主板相兼容才可体系性能,否则将无法运行,即时可以运行则也是大材小用。

  • 内存条

   内存条也是计算机的重要组件之一,是计算机中最为主要的寄存器。内存条在计算机中主要作用是缓冲数据和数据交换,主要负责硬盘等存储器与CPU通信的临时数据的传输或存储。程序在运行时会将与程序相关的指令信息加载到内存中,CPU直接与内存进行通信,来提取指令信息并执行,CPU在内存中通过直接寻址的方式进行提取指令信息。举个最简单的例子就是我们写入一个记事本文件时,如果没有保存则其记事本中的字符信息都保存在内存中,当保存后才会写到硬盘上。

   常说的内存大多数指的就是内存条,但也不完全是。内存是一种存储单元,包括随机存储器(RAM)、只读存储器(ROM)和高速缓存(Cache)三部分。ROM(Read Only Memory)是只读存储器,可以说任意一个硬件都对应一个ROM存储器,用于存储硬件本身的信息或其相应的应用程序,其特点是断电后信息不会丢失,最常见的就是BIOS芯片,不过现在的BIOS芯片都可以复写,但是大多数还是称为BIOS ROM;RAM(Random Access Memory)是随机存储器,它既可以写入数据也可以读取数据,可以不断的复写数据,其特点是断电后存储的数据会丢失。其内存条就是将RAM集成在一个插卡上以减少RAM的空间,所以常说的内存条就是指内存。

   随着科技的发展,现在的内存条的存储空间也越来越大,临时存储的数据也越来越多,所以拥有大内存的计算机远比小内存的计算机运行要流畅,然而并不是越大的内存空间就越好,其首先收到主板的牵制,其次还收到CPU总线的限制,如果CPU总线不及则又是大材小用,如果内存空间不足则CPU无法最高效运作。

   综上所述,内存条也是计算机的必要组件之一,大内存的内存条往往会是计算机的程序运行更流畅,但是前提是必须与主板接口相兼容。

  • 显卡

   显卡全称显示接口卡,也称显示适配器、显示器配置卡,是PC中一个重要的组件,主要用于将计算机系统输出的信息进行转换并向显示器提供扫描信号。显卡基本上包括GPU(Graphic Processing Unit,图形处理器)、显存两个重要部件。

   GPU,即图形处理器,相对应CPU的一个概念,在早期图形处理部分主要由CPU来完成,而现在图形处理变得越来越重要,所以必须一个核心的图形处理器来完成这个工作,从而减少对CPU的依赖,所以就出现了GPU,主要用于将输出信号进行几何转换和光照处理以及像素和色彩渲染等处理。显存是显示内存的简称,其和内存的作用基本一致,其主要用于暂时存储显示芯片要处理的数据和处理完毕的数据,通常情况下显存越大其图形显示的性能就越强。

   现在的显卡基本分为独立显卡、集成显卡两大类,其中集显就是将显示芯片、显存等集成在主板上;独显则是将显示芯片、显存等坐在一个插卡上,通过主板接口插槽插入运行,当然现在也有双显卡兼容工作的模式。需要注意的是显卡也受主板的约束。

  • 声卡

   声卡,亦称为音频卡,是多媒体技术中的基本组成部分,实现声波/数组信号相互转换的一种组件。声卡主要用于将原始声音数据转换为声音信号并输出到不同的声响设备。声卡主要包括声音控制芯片、数字信号处理器等部件组成。

   声音控制芯片主要将从输入设备中获取的声音模拟信号通过模数转换器,将声波信号转换为一串数字信号并存储在储存器中;数字信号处理器是一种声音数字处理器,将信号交由该处理器处理减轻了CPU的工作负担。

   现在声卡基本分为板卡式、集成式和外置式三种接口类型。

  • 网卡

   网卡,全称网络接口板,又称通信适配器或完了接口卡(NIC,Network Interface Card)。网卡是计算机进行网络通信必备的硬件设备,它属于网络协议(OSI模型)中的链路层组件,主要用于网络中电信号的匹配、传输、编码和解码等工作。

   网卡主要有处理器和存储器两大部件组成,其中存储器,也就是网卡的ROM中保存这该网卡的基本信息,其中有标识该网卡唯一的MAC地址,是一个独一无二的48位串行号(任何两块网卡的MAC地址都不会重复);处理器则用于对电信号进行传输、解码以及编码工作(在网络通信中实际传输的是电信号,由网卡负责将电信号进行编码和解码)。

   网卡在局域网之间的通信是通过电缆或双绞线以串行传输方式进行的,而在计算机之间的通信则是通过计算机主板上的I/O总线以窗口并行传输方式进行的。所以网卡的一个重要功能就是进行串行/并行转换。网卡一般具备数据的封装和解封、链路管理以及编码(曼彻斯特编码)和移码三大功能。

   现在的网卡基本分为有线网卡和无线网卡两种,其中有线网卡则为标准通用化网卡设备,无线网卡主要是一个电信号接受和发送的设备,其标准主要使用数据传输速率来衡量。

   当然还有其他的设备,这里就不一一介绍了。

   说点题外话,个人认为计算机的主板、CPU和内存比较重要,毕竟内存和CPU寄存于主板之上,盲目的追求高内存和CPU并不一定能够使其发挥到更好的工作效果,但也不排除高内存和CPU的确能够是计算机高效工作。追求高配是现在的潮流,追求之前一定得让主板所能承受才可。

2.3.软件系统组成

   对于计算机的软件系统,这里不想多说,做IT的你不知道软件,那也甭做了,还是回家种地吧。话说计算机的软件系统可以分为系统程序和应用程序两大类。

   系统程序是为了简化程序设计和使用方法而出现的一类高效的软件程序,包括服务性程序、语言处理程序、操作系统、数据库管理系统。应用程序是用户利用计算机来解决问题而编制的程序。

   软件(Software)是计算机系统中使用的各种程序,而软件系统是指挥整个计算机硬件系统工作的程序集合。在计算机中的程序划分为微程序设计级、机器语言级、操作系统级、汇编语言级和高级语言级五大级别。微程序设计级别是一种纯硬件级别的程序设计,一般就是定义其硬件的指令系统,由机器硬件直接执行。机器语言级别也是硬件级别的程序设计,一般是借用微程序的指令系统实现程序设计,由微程序去执行的。操作系统级别属于一种软硬件混合级别的程序设计,一般涉及软硬件指令的引用,主要在操作系统的控制下去调用软硬件资源协调工作,实际底层是一般机器去执行的。汇编语言级别的程序一般使用汇编语言编写,由汇编程序的支持和执行。高级语言级别的程序采用的是高级程序设计语言编写,一般为一种纯粹的软件程序,由对应程序设计语言的编译和执行程序支持和执行,这一级别的程序也称为用户程序。现在我们所做的程序大多都是建立在操作系统级别之上的汇编语言程序和高级语言程序。

   然而随之技术的发展,现在的软硬件的界限也模糊不清了,随之只读存储器的出现,现下大多数的硬件设备都是集成式(也称嵌入式)的,其内部都包含一个只读存储区,存储着其对应的固有的软件程序,这样的部件我也称之为固件。

   谈到软件,就不得不说程序设计语言,何为程序设计语言?程序设计语言就是使用约定的符号编写计算机程序的语言,简单的说是用来制作计算机软件程序的语言,例如汇编、C、Java、PHP等等都是程序设计语言。现下的程序设计语言可分为机器语言、汇编语言和高级语言三大类。机器语言是一种用二进制形式表示并且能够直接被计算机硬件识别和执行的语言,机器语言也机器本身结构有关,不同的机器其机器语言也不同,使用机器语言编写的程序成为i额机器语言程序。汇编语言是一种将机器语言符号化的语言,它使用字母、符号和数字来代替数字编码的机器指令,汇编语言的语句与机器指令一一对应,所以不同的机器也具有不同的汇编语言,用汇编语言编写的程序称为汇编语言程序;例如Nasm、Masm、Tasm等都属于汇编语言程序。高级语言是一种与计算机结构不相关的,表达方式接近于被描述问题的程序设计语言,高级语言程序在计算机中需要利用其对应的编译程序或解释执行程序将其翻译为对应的机器语言程序才可以执行;例如Basic、Fortran、Pascal、C语言、Delphi、C++、 Java等都属于高级语言程序。然而高级语言又可以划分为面向过程式语言、面向对象式语言等。

计算机存储系统

1.存储器的分类

   存储器是计算机的基本部件之一,其按照不同的衡量标准可以划分为不同的类别。最常见就是根据其本质读写能力划分为只读存储器(ROM,Read-Only Memory)和随机读写存储器(RAM,Random Access Memory)。只读存储器中存储的内容是不可变的,只能读取数据而不能写入数据,所以常用于保存一些硬件设备的基本信息,其存储的数据是永久的,断电后可以保留;随机读写存储器中存储的内容是可变的,既可以写入数据也可以读取数据,其存储的数据并不是永久的,断电后则就会丢失。随之ROM的发展可分为掩模式ROM(不可修改)、可编程ROM(PROM)、可擦除PROM(EPROM)、电可擦除PROM(EEPROM)和闪存(Flash Memory),现在所用ROM存储器基本上都支持重新写入。RAM可以非为SRAM(静态RAM)和DRAM(动态RAM)两种类型。

   存储器根据在计算机系统中的作用和角色则分为寄存器(控制存储器)、高速缓冲存储器、内存(主存储器)、磁盘存储器(辅助存储器)等。现今的通用计算机都具备寄存器、缓冲存储器、内存和磁盘这四个存储器设备,而且其访问速度依次递减,但是存储容量则依次递增。下面逐一介绍。

  • 寄存器

   寄存器,也称为控制存储器,用于临时存储参与运算数据,常集成于CPU(*处理器)中,所以其存取数据速度快,其速度是所有存储器中速度最快的。为什么要集成与CPU中?因为CPU包含运算器和控制器,其是处理数据的中心,如果有一个在读取数据是从其他管理的元件中传入,必定存在传输延迟问题,同时还增加了对其他元件的依赖程度和负载能力,所以将其寄存于CPU中作为临时数据的存取空间。

  • 高速缓冲存储器

   高速缓冲存储器,从名字上可以得知其主要是起到缓冲数据的作用。由于寄存器容量有限,一个CPU运算的周期可能需要从较大的内存存储器中获取更多的数据信息,增大了数据传输的时间,这便限制了高速计算,为了解决这个问题,所以使用一个高速缓冲存储器来加速CPU和内存之间的数据传输。高速缓存存储器通常也集成于CPU中,用于临时存储即将参与运算的数据,其容量较小但是存取数据速度也很快。

  • 内存

   内存,也称为主存储器,用于存储运行的程序和数据,其存取数据的速度较快,存储数据的容量较大。内存是运行程序和资源数据与CPU进行交互的主要中间介质,也就是说程序启动时先将程序数据送往内存中,然后由CPU去一条一条数据的执行。由于寄存器和高速缓冲存储器都集成于CPU中,而内存是独立于CPU的,所以内存的性能会直接影响计算机的性能。这也是大家都最求高内存的原因。

   内存的衡量标准主要有存储容量、存取时间、存储周期和存储器带宽四个指标。其中存储容量是一个存储器中可以容纳的存储单元总数,通常以字数或字节数作为单位;存取时间则是启动到完成一次存储器操作所经历的时间,通常以纳秒(ns)为单位;存储周期则是连续启动连词操作所需间隔的最小时间,通常以纳秒(ns)为单位;存储器带宽表示单位时间内存储器所存储的信息量大小,通常以位/秒或字节/秒为单位。后三者是其存取速度的主要衡量标准。

  • 磁盘存储器

   磁盘存储器,属于辅助存储器,简称辅存,辅存包括磁盘、U盘、光盘等外部存储器,而磁盘存储器是最为常见的辅存设备。辅存的最大特点是存储容量大。

   随着科技的发展,现在还存在另一种存储器——虚拟存储器。虚拟存储器并发实际存在的物理存储器,而是一种容量足够大的逻辑模型,指借助磁盘等辅助存储器来扩大主存容量的一种方式。其实可以将其理解为一种主存到外存层次上的缓冲存储器。

2.存储器的衡量单位
2.1.数据存储单位

   众所周知,计算机使用的是二进制数制系统。存储元是计算机中最小存储数据的介质,一个存储元存储一个二进制数码(0或1);多个存储单元组成一个存储单元;多个存储单元组成一个存储器。

   说到存储器,不得不说的是存储器容量的问题。常见的“KB”或“K”、“MB”或“M”、“GB”或“G”、“TB”或“T”,这些都是存储器容量的衡量单位。存储器的容量其实是指存储器所有存储单元的总数,规定8位(8个二进制码)为1字节,即8bit=1byte=1B(至于为什么这样规定?笔者也没搞清楚)。

   到底什么是位?位(bit)是计算机中最小的数据传输单位,其实就是一个二进制数码(0或1),一个二进制序列中的每一个0或1都成为一个位,按照习惯,通常称右边为低位,左边为高位。

   那什么又是字节?字节(byte)是计算机中最小的数据存储单位,规定一个字节由8位组成,即一个字节就是8个0或1组成的二进制序列。随着计算机的发展,其存储容量越来越大,使用字节进行衡量就不太合理了。所以出现了千字节(KB)、兆字节(MB)、吉字节(GB)、太字节(TB)等等更大了衡量单位。

   从十进制的角度去考虑,上述的单位都相差千倍,在二进制中千倍可以使用210(1024)表示(因为其最接近1000)。所以标准情况下其计算机存储单位换算过程如下:

1B=1byte=8bit=8b

1KB=1024B=1024byte

1MB=1024KB

1GB=1024MB

1TB=1024GB

……

   上述只是标准情况下的换算方式,而在现实中,大多数硬盘中还是使用10的3次方即1000作为转换标准进行硬盘设计制造。

2.2.数据传输单位

   上面也提到,“位”是计算机中数据传输的最小单位。然而计算机在实际工作中,如果使用位进行数据传输则效率极其低,所以实际中CPU向存储器送入或从存储器取出信息时,通常使用用“字节”或“字”等较大的信息单元来工作。

   字节(byte或B)也就是上面讲到的,一般由8位二进制数码组成,也就是说使用字节进行传输数据则一次可以传输8位信息,然而这样还是不能满足当前的运算要求,因此就出现了字。

   字(word或W)是计算机中最常用的数据传输单位,字由若干个字节组成,是计算机一次处理或运算的一串二进制数码,相同的字在不同的位置其含义也不同,例如送外控制器的字是指令,而送往运算器的字则是运算数。字的长度用位数来表示,通常把组成一个字的二进制位数叫做字长,我们常说的8位、16位、32位和64位CPU则就是指的CPU字长,也就是CPU一次能够处理(传输)的二进制数码位数。字长可以用于衡量一个CPU的能力,字长越大其性能则越高,字长可分为固定和可变两种类型。常说的32位、64位操作系统则是对应于计算机处理器而言的,它们都是低向兼容,但是如果不匹配则其运行性能会大打折扣,比如说64位的CPU可以兼容32位的系统,但是其效果不能达到最佳,而32位则不能兼容64位的系统。

*处理器和指令系统

1.指令系统

   上面一再提到指令,到底何为指令?指令就是一种指挥相应动作的命令,在计算机中指令是一种控制信号,用来控制计算机各个元件的相应操作。计算机的电子元件的工作都受到指令的支配。其是计算机中最小的执行单元,所有的程序都是由一系列相应的指令组成的,计算机的指令可划分为微指令、机器指令和宏指令三类,微指令是微程序的命令,属于硬件级别;宏指令则是有若干条机器指令组成的软件指令,属于软件级别;机器指令其介于微指令和宏指令之间,每一条指令可以完成一个独立的算术运算或逻辑运算,我们常说的指令就是指机器指令。

   计算机中所有机器指令的集合组成一个指令系统,其是计算机性能的重要衡量标准,不仅直接影响机器的硬件结构,也直接影响到其软件系统,影响其机器本身的适用范围。计算机的指令系统一般包括数据传送指令、算术运算指令、逻辑运算指令、程序控制指令、输入输出指令、字符串处理指令、特权指令以及状态寄存器置位、复位指令、测试指令、暂停指令,空操作指令等其他指令。从指令系统来讲可以将计算机非为复杂指令系统计算机(CISC)和精简指令系统计算机(RISC)两种,复杂指令系统的指令多达几百条,大多数情况下只有20%的指令会经常使用,而精简指令系统就是这20%的指令组成的。

1.1.指令和寻址

   指令,也称机器指令或指令字,是计算机中一种控制元件执行动作的命令,其实质是一种二进制序列代码,由操作码字段和地址码字段组成。其中操作码字段表示指令的操作特性和功能,地址码字段指定参与操作的操作数据的地址。

   指令系统中的每一条指令都有一个操作码,表示该指令应该进行什么性质的操作,也就是说每一种指令对应一种固定编码的操作码。操作码的字段位数一般受到计算机指令系统的约束,一般8条指令的指令系统,3位操作码则足够;32条指令的指令系统,则需要5位操作码。

   每一条指令不仅包括操作码,而且还操作地址码,地址码用于指定操作数的存储位置。根据操作数的个数可以将指令分为若干个操作数指令或若干个地址指令;一般的指令都存储被操作数、操作数和操作结果三种数据,所以称为三地址指令,当然也存在二地址指令、一地址指令和零地址指令。

   在计算机的指令系统中,一般指令的操作码字段和地址码字段的位数(长度)是固定的,而指令的位数(指令字长度)则分为固定和可变两种。固定字长指令系统中,各种指令字长度都是相等的;可变字长指令系统中,各种指令字长度随指功能而异。指令字长和机器字长大多会混为一谈,指令字长度表示一条指令中所包含的二进制数码位数;机器字长表示计算机一次直接处理二进制数码的位数,其决定了计算机的运算精度。

   上面提到操作数地址,那么何为地址?来看下面的介绍。

   操作数地址是指操作数存储在存储器存储单元时存储单元的编号(编码,一种二进制数码);指令在存储器中的地址则指指令存储在存储单元是该存储单元的编号。在存储器中,操作数或指令字写入或读取的方式有地址指定方式、相联存储方式和堆栈存储方式三种形式。大多数的机器采用地址指定方式来表述操作数或指令的地址,这种方式称为“寻址方式”,常说的寻址是指在内存中进行寻址。寻找方式分为指令寻址方式和数据寻址方式两种。

   指令寻址方式包括顺序寻址和跳跃寻址两种形式,顺序寻址就是按程序指令顺序一条一条指令的执行,首先执行第一条,然后第二条,接着第三条……,通常情况下处理器中存储一个程序技计数器(指令指针寄存器),用来标识下一条指令的序号(模拟序号),根据这个序号可以指定执行下一条指令的位置;当程序指令转移执行时则需要使用跳跃寻址方式,此时当前指令会给出下一条指令的序号(并不是由程序计算器给出,但是其指会改变),程序跳跃后,然后在按新的指令地址顺序执行。

   指令中操作数的地址码一般有形式地址和寻址方式特制位组合形成,也就是说,指令中的地址码并不是操作数的真实有效地址,因此,操作数的寻址过程就是将操作数的形式地址转换为操作数的有效地址的过程。操作数的有效地址是将操作数的形式地址使用指定的寻址方式进行转换得来的,其中操作数的形式地址是一种二进制数码,寻址方式包括隐含寻址、立即寻址、直接寻址、间接寻址、寄存器寻址、相对寻址、基址寻址、变址寻址、块寻址和段寻址等多种方式。隐含寻址就是指令中不明显的给出而是隐含这操作数的地址;立即寻址表示指令中的地址字段指定的是操作数本身,而不是其地址;直接寻址就是在指令的地址字段中直接之处操作数在内存中的地址;间接寻址就是指令中的地址字段给出的是形式地址,而是操作数地址的指示器,然后由指示器指定其真是地址;寄存器寻找是指操作数存储在CPU寄存器中,指令给出的是数据存储的寄存器编号,还衍生有寄存器间接寻址方式,其指令给出的是输出存储在内存中的地址;相对寻址是相对当前指令地址而言的,通过偏移量来寻找操作数地址;基址寻址是将CPU中基址寄存器的内容加上指令格式中的形式地址而形成的操作数的有效地址的方式;变址寻找是把CPU中某个变址寄存器的内容与偏移量相加来形成操作数有效地址的方式;块寻址通常指定数据库的起始地址和数据库的长度,然后寻找一个整体,常用于输入输出指令中;段寻址是将存储器按指定大小划分为多个段,然后采用基址寻址方式进行寻址,常用在微型机中。(这里只是简单介绍一下,具体的过于复杂,所以不具体说明,可以自行查找资料理解)

   通常CPU中还存在一种能够存储和读取数据的暂时存储单元——堆栈(或许你看到它并不陌生,是两种数据结构)。堆栈是一种能存储和取出数据的暂时存储单元,分为串联堆栈和存储器堆栈两种形式。很多计算机把存储器的一部分用作堆栈,堆栈与其他形式存储器的差别在于其对数据的存取方法和寻址方法,其堆栈的主要存储特点是数据先进后出。

1.2.指令与编程语言的关系

   从宏观角度来将可以将当下的程序设计语言划分为低级语言和高级语言两种,低级语言大多直接与硬件指令打交道,而高级语言则与硬件本身关联并不紧密。

   低级语言可分为机器语言(二进制语言)和汇编语言(符号语言),这两种语言是面向机器的语言,和具体机器的指令系统密切相关,机器语言使用指令代码编写程序,而汇编语言使用指令助记符号来编写程序。由于低级语言效率地下,而且多被机器限定,所以就诞生了高级语言。

   相对低级语言而言,高级程序设计语言摆脱了对硬件设备机器指令的束缚,其自成体系,常见的有C、C++、Java等。但是由于计算机只能识别并执行二进制的机器指令,所以高级语言编写的程序大多需要借助汇编程序或对应的编译程序将其本身翻译成二进制的机器指令。所以高级语言入门快、适用度高,但是其效率相对而低。

2.*处理器——CPU
2.1.CPU的构成介绍

   程序是一个指令序列,这个序列明确告诉计算机应该执行什么操作、应该在什么地方找到用来操作的数据,一旦把程序装载入内存中,就可以有计算机自动完成取出指令和执行指令的任务,而用来完成这项工作的计算机部件称为*处理器,简称为CPU。

   CPU是计算机中最重要的部件之一,其必须有指令控制、操作控制、时间控制和数据加工处理四个级别功能。指令控制就是程序的顺序控制;操作控制就是指一条指令的功能往往是由若干个操作信号组合来实现的;时间控制是对各种操作实施时间上的定时;数据加工就是对数据进行算术运算或逻辑运算。

   CPU主要有运算器、cache区和控制器三大部分组成。其中控制器由程序计数器、指令寄存器、指令译码器、时序产生器和操作控制器组成;是计算机的命令指挥中心,可以从内存中取出一条指令并指出下一条指令的内存地址,可以对指令进行译码和测试并产生相应的操作控制信号支配元件完成动作,同时指挥和控制CPU、内存和输入/输出设备之间数据流向。运算器由算术逻辑单元(ALU)、累加寄存器、数据缓冲寄存器和状态条件寄存器组成;是计算机正真执行数据加工处理的部件,受控制器支配,可以执行所有的算术运算和逻辑运算,并进行逻辑测试等。下面是CPU结构模拟图:

程序员应该了解的计算机知识(一)——基础理论

从图上可以看出CPU中有数据缓冲寄存器(DR)、指令寄存器(IR)、程序计数器(PC)、地址寄存器(AR)、累加寄存器(AC)和状态条件寄存器(PSW)六类主要寄存器(寄存器就是临时存取器,是一种临时存储数据的空间)。

  • 数据缓冲寄存器(DR)

   数据缓冲寄存器用来暂时存放从内存储器读取的一条指令或一个数据字或向内存存入一条指令或一个数据字。其作为CPU和内存、外部设备之间信息传送的中转站,可以补偿CPU和内存、外围设备之间在操作数度上的差别。有时也作为操作数寄存器使用。

  • 指令寄存器(IR)

   指令寄存器用于保存当前正在执行的一条指令数据。当执行一条指令时,首先把其从内存读取到缓冲寄存器中,然后在送往指令寄存器,由指令译码器对指令的操作码字段进行译码和测试后,向操作控制器发出具体操作的特定信号。

  • 程序计数器(PC)

   程序计算器也称为指令计算器,其主要用于记录下一条指令的内存地址。在程序开始执行前,必须将它的起始地址即第一条指令所在的内存单元地址送人程序计数器,当执行这条指令时,CPU会自动修改程序计数器的内容为下一条指令的地址。由于大多数指令都是顺序执行的,所以修改过程通常只是简单的加1。

  • 地址寄存器(AR)

   地址寄存器用来保存当前CPU所访问的内存单元的地址。由于内存和CPU之间存储操作数度上的差别,所以必须使用地址寄存器来暂时保存地址信息,直到内存的读/写操作完成为止。当CPU和内存进行信息交换,即CPU向内存存/取数据或CPU从内存中读取指令时,都要使用到地址寄存器和数据缓冲寄存器。

  • 累加寄存器(AC)

   累加寄存器简称累加器,其是一个通用的寄存器。主要用于当运算器的算术逻辑单元执行算术或逻辑运算时,为算术逻辑单元提供一个工作区;其可以暂时存放算术逻辑单元的运算结构信息。

  • 状态条件寄存器(PSW)

   状态条件寄存器用于保存由算术指令和逻辑指令运行或测试的结果对应的各种条件码内容,例如运算结果进位标志(C)、运算结果溢出标志(V)、运算结果为零标志(Z)、运算结果为负标志(N)等等。通常这些标志分别由移位触发器保存。同时状态条件寄存器还保存中断和系统工作状态等信息,以便使CPU和系统能及时了解机器运行状态和程序运行状态。状态条件寄存器是一个由各种状态条件标志拼凑而成的寄存器。

   信息从什么地方开始,中间经过哪个寄存器或多路开关,最后传送到哪个寄存器,都要加以控制。在各寄存器之间建立数据通路的任务,是由称为操作控制器的部件来完成的。操作控制器的功能,就是根据指令操作码和时序信号,产生各种操作控制信号,以便正确地建立数据通路,从而完成取指令和执行指令的控制。

2.2.CPU的工作过程

   计算机所以能够自动工作,是因为CPU能从存放程序的内存中取出一条指令并执行这条指令;紧接着又是取指令,执行指令……如此构成一个封闭的循环,当遇到“停止”指令时停止工作并退出。

   CPU的工作过程其实是程序的执行过程,如今的计算机都是基于“程序存储”的概念设计制造的,程序存储就是将程序通过输入设备传送到存储器保存起来的过程。而计算机只能识别二进制数码,CPU只能识别机器指令,所以我们通常编写的程序或安装的其他程序都是在特定环境或系统下编译之后的程序,然而只有在其特定的执行环境下才能被解析为指令加载到内存中,所以说程序就是一个指令序列。

   当启动一个程序的时候,会将这个程序对应的资源和本身指令序列输入到内存中,然后CPU从中检索出入口指令,并有CPU解码为指定的CPU控制信号并支配其他硬件设备完成,执行过程也就是数据运算的过程,逻辑运算控制其执行其他指令的顺序,算术运算计算执行指令的结果,然后将运算的结果写回到内存中以备继续使用,依次循序工作,直到所有指令执行完毕。上面的过程可以使用以下示意图来表示:

程序员应该了解的计算机知识(一)——基础理论

上面的示意图,用于描述计算机CPU执行程序指令的基本过程。

   计算机执行程序的指令(指令由操作码和地址码组成,操作码表示运算性质,地址码表示操作数在存储器中的位置)序列是逐条执行的,每执行一条指令基本上可分为四个步骤:一、取出指令,从存储器(主要指内存)某个地址中取出要执行的的指令送到CPU内部的指令寄存器暂存;二、分析指令,把保存在指令寄存器中的指令送到指令译码器,译出该指令对应的微操作;三、执行指令,根据指令译码,向各个部件发送相应的控制信号,完成指令规定的各种操作;四、为执行系一条指令做好准备,取出下一条指令地址循环上面步骤。

2.3.CPU字长与操作系统

   CPU字长是衡量CPU性能的一个重要标准,CPU字长表示CPU一次能够传输的二进制数码位数,现今出现最多的有8位、16位、32位和64位的CPU,其位数越高则其运算精度越高、运算速度越快。8位CPU和16位CPU常用于微处理设备,例如手持设备等;32位和64位CPU常用于PC等。

   或许会发现一个规律,CPU的字长都是8的倍数,可以用2的N次方表示,为什么?我们知道计算机中规定8位为一字节,由于CPU出现了寄存器和缓冲区,所以通常情况下以字节或更大的字作为信息处理的单位进行传输。而一个字由多个字节组成,所以CPU的字长通常为8的倍数。

   数据或指令在内存中通常使用内存地址来描述,地址就是一种编号,即其是有0和1两位数码组合而成的编号。对于一个N位的CPU来讲,其每一条指令可以包含N位二进制数码,即N个0和1进行组合而成的数码,那么从排列组合的方式上看,其最多可以有2N个组合结果,也即是说一个n位的cpu最多可以在内存中读取2n个内存地址。这种cpu对内存寻址的能力称为寻址空间,即对应cpu来讲内存的实际使用问题。

   对于一个32位的CPU来讲,其最大的内存寻址空间为232=4294967296个,为了更准确的描述其空间大小,使用byte(字节)来表示其存储空间大小。也就是说32位CPU的寻址空间为4294967296byte=4G,64位的CPU寻址空间可高达17TB,这个内存空间称为物理内存,然后对实质的操作系统而言,比如Windows XP系统支持的实际寻址空间为2.5G~3.5G之间。

   上面也提到了操作系统,或许你也会发现,Windows Vista之后发布的操作系统都提供了32位和64位两个版本,其主要是针对32位和64位CPU而定制的。32位的CPU一次能够提取4个字节的数据,64位的CPU一次能够提取8个字节的数据。32位的操作系统或程序可以在32位的CPU中运行,也可以在64位的CPU中运行,但是效率不能达到最高;而64位的操作系统或程序只能在64位的CPU中运行,其设计可以向下兼容。

计算机工作原理

1.用计算机的工作过程

   通过上面的介绍,对计算机的基本工作原理应该有一定的印象。计算机主要包括运算器(CPU)、存储器(内存)、控制器(CPU)、输入设备、输出设备五个部分,因此计算机的工作离不开主板、CPU、内存三个硬件环境,同时为了能够见证计算机的工作效果也必须存在输入/输入设备。下面就这五个基本部分来看一下计算机的基本工作原理,如图:

程序员应该了解的计算机知识(一)——基础理论

图中“红线”表示数据流向,“黑线”表示控制流向。CPU控制器控制输入设备、输出设备以及内存使用,程序被输入设备以指令序列的方式输入到内存中,CPU控制器从内存中读取一条条指令,并根据指令的译码发出一条条控制信号给运算器和存储器来完成规定的操作功能,然后CPU控制器控制其以适当的方式通过输出设备输出最终操作结果。我们可以通过下面一个模拟图更清楚的理解这个过程,如图:

程序员应该了解的计算机知识(一)——基础理论

至于CPU内部的工作过程可以参考《2.2 CPU的工作过程》。

   提示一个小常识:计算机的主板上存在一个微弱电源维持BIOS芯片内BIOS系统(包括系统时间、引导系统、内存数据等)的正常运作。当主板接通外部电源的时候,BIOS系统会检查所有硬件环境是否存在或正确安装,如果通过则正常启动引导系统,否则会作出相应的警告提示。只有所有的硬件设备完善才能是计算机正常工作。

2.通用计算机中存储器工作过程

   现下的计算机存储系统包括磁盘、内存、缓存区和寄存器等四大类型,当然其缓存又可分为多个级别,例如一级缓存、二级缓存等。下面来看一下其如何协调工作的。

   程序存储在磁盘中,当打开程序化,有操作系统平台或对应的执行平台将程序指令化,转换为一系列指令序列并送往内存中,如果程序过大则会借助虚拟内存(虚拟存储器)来暂时寄存部分指令,内存加载部分指令;然后将入口指令送往CPU的寄存器,由CPU运算器和控制器执行指令,如果需要读取数据,则从内存或缓存中取出数据,如果需要一条指令,则从内存或缓存总取出指令,在送往CPU进行运算或执行;一条指令执行完成后将结果暂时写入到寄存器或CPU缓存或内存中,接着执行程序的下一条指令,从内存或缓存中读取下一条指令送往CPU中进行指令,依次循环,即可完成一个程序的执行,当遇到停止指令是则停止执行并退出程序。

总结

   这篇文章或许讲的比较乱,甚至有些东西我自己都还没有搞清楚,一些名词都是自己理解并给出释义,或许并没有给出明确的解释,希望读者见谅,本文大部分内容来自互联网资料的整理。虽然我们搞软件的并不一定需要深入研究这些东西,但是了解一下总是有益无害,而且这些都是基础理论知识,对软件的学习多多少少都有一定的帮助。

   如果需要了解的更深入,则可以自行查阅资料,并整理分享给大家。