计算机基础之硬件
前言–为何要学习计算机基础
首先,我们都知道世界上有很多种语言,比如:汉语、英语、日语等。想要和某个人有效沟通,就必须得用相应的语言去沟通。计算机也一样,如果想让计算机帮助我们做事情,我们就需要和它进行沟通,那我们也必须使用计算机能够识别的语言去和它沟通,也就是所谓的编程语言,比如:C,Java,PHP,Python,C#等
其次,有了编程语言,我们要想让计算机工作,还必须得了解计算机能干什么,具体怎么干的,比如:如何具体操作硬盘(我们得把硬盘拆开,然后将看见的所有东西,都得研究明白,因为编程时要用到它),这样你就具备了原始的编程能力——用编程语言直接操作硬件来编程
最后,随着计算的高速发展,原始的编程能力不能满足现代的编程需求了,为什么这么说呢?因为原始的编程太low了,要花费我们大量的时间去学习计算机硬件操作,大大降低了开发效率,所以,操作系统应运而生,它运行于硬件之上,用来控制硬件。现在我们用编程语言开发程序,最终开发出的结果就是一个软件,比如:QQ、优酷,酷狗等,这时只需要调用操作系统为我们提供的简单而优雅的接口就可以了。
总结:一台完整的计算机由硬件系统和软件系统(系统软件(包括操作系统),应用软件)构成,如下图:
所以,虽然我们现在不需要了解计算机硬件底层操作,但如果我们想要成为一个优秀的程序员,不仅仅只需要学习一门或几门编程语言,关于计算机硬件、操作系统这些计算机基础知识我们也得学习。
下面开始本篇文章内容介绍——计算机硬件
一 计算机硬件概述
计算机硬件主要有运算器、控制器、存储器、输入设备、输出设备
- 控制器(Control):是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等
- 运算器(Datapath):运算器的功能是对数据进行各种算术运算和逻辑运算,即对数据进行加工处理
- 存储器(Memory):计算机用来存放所有数据和程序的记忆部件。它的基本功能是按指定的地址存(写)入或者取(读)出信息。 计算机中的存储器可分成两大类:一类是内存储器,简称内存或主存;另一类是外存储器(辅助存储器),简称外存或辅存。 存储器由若干个存储单元组成,每个存储单元都有一个地址,计算机通过地址对存储单元进行读写。一个存储器所包含的字节数称为存储容量,单位有B、KB、MB、GB、TB等。
- 输入(Input system):输入设备是计算机的重要组成部分,输入设备与输出设备合称为外部设备,简称外设,输入设备的作用是将程序、原始数据、文字、字符、控制命令或现场采集的数据等信息输入到计算机。常见的输入设备有键盘、鼠标器、光电输入机、磁带机、磁盘机、光盘机等,外存储器也是一种输入设备。
- 输出(Output system):输出设备与输入设备同样是计算机的重要组成部分,它把外算机的中间结果或最后结果、机内的各种数据符号及文字或各种控制信号等信息输出出来。微机常用的输出设备有显示终端CRT、打印机、激光印字机、绘图仪及磁带、光盘机等,外存储器也是一种输入设备。
我们常说的CPU=控制器+运算器,内存为主存储器,硬盘为外存储器,主板=I/O总线(看下面)+ 输入输出系统
CPU、存储器以及其他I/O设备都由一条系统总线(bus)连接起来并通过总线与其他设备通信
我们如果将计算机比作为人,类比如下:
- CUP是人的大脑,负责运算、管理
- 内存是人的记忆,负责临时存储
- 硬盘是人的笔记本,负责永久存储
- 输入设备是耳朵或眼睛,负责接收外部的信息传给CPU
- 输出设备是你的表情,负责经过处理后的结果
以上说有的设备都是通过总线连接,总线相当于人的神经。
综合上面讲的,一个完整的计算机系统简图如下:
二 CPU
通常将运算器和控制器合称为中央处理器(Central Processing Unit,CPU),它的工作主要在于管理和运算,其中算数逻辑单元主要负责程序运算和逻辑判断,控制单元则主要在协调各周边组件与各单元间的工作。 计算机的五大单元包括:输入单元、 输出单元、CPU内部的控制单元、算数逻辑单元与主存储器五大部分,简图如下:
上面图标中的系统单元其实指的就是计算机机壳内的主要组件,而重点在于CPU与主存储器。 特别要看的是实线部分的传输方向,基本上数据都是流经过主存储器再转出去的!至于数据会流进/流出内存则是CPU所发布的控制命令!而CPU实际要处理的数据则完全来自于主存储器, 这是个很重要的概念,一定要牢牢记住。
2.1 CPU的种类
在超大规模集成电路构成的微型计算机中,往往将CPU制成一块具有特定功能的芯片,称为微处理器,芯片里边有编写好的微指令集,我们在主机上的所有操作或者说任何软件的执行最终都要转化成cpu的指令去执行,如输入输出,阅读,视频,上网等这些都要参考CPU是否内置有相关微指令集才行。如果没有,那么CPU无法处理这些操作。不同的CPU指令集不同对应的功能也不同,主要有以下两种:
精简指令集(Reduced Instruction Set Computing, RISC)
这种CPU的设计中,微指令集较为精简,每个指令的运行时间都很短,完成的动作也很单纯,指令的执行效能较佳; 但是若要做复杂癿事情,就要由多个指令来完成。常见的RISC微指令集CPU主要例如升阳(Sun)公司的SPARC系列、 IBM公司的Power Architecture(包括PowerPC)系列、不ARM系列等。
复杂指令集(Complex Instruction Set Computer, CISC)
CISC在微指令集的每个小指令可以执行一些较低阶的硬件操作,指令数目多而且复杂, 每条指令的长度并不相同。因为指令执行较为复杂,所以每条指令花费的时间较长, 但每条个别指令可以处理癿工作较为丰富。常见的CISC微指令集CPU主要有AMD、Intel、VIA等癿x86架构癿CPU。
2.2 寄存器
寄存器是CPU的组成部分,是有限存储容量的高速存储部件,它们可用来暂存指令、数据和地址,常见分类如下:
- 通用寄存器:用来保存变量和临时结果的
- 程序计数器:它保存了将要取出的下一条指令的内存地址。在指令取出后,程序计算器就被更新以便执行后期的指令
- 堆栈指针:它指向内存中当前栈的顶端。该栈包含已经进入但是还没有退出的每个过程中的一个框架。在一个过程的堆栈框架中保存了有关的输入参数、局部变量以及那些没有保存在寄存器中的临时变量
- 程序状态字寄存器(Program Status Word,简称PSW):这个寄存器包含了条码位(由比较指令设置)、CPU优先级、模式(用户态或内核态),以及各种其他控制位。用户通常读入整个PSW,但是只对其中少量的字段写入。在系统调用和I/O中,PSW非常重要。
2.3 处理器设计的演变
首先我们需要知道一点,CPU的执行过程如下:从内存中取指–>解码–>执行,然后再取指–>解码–>执行,周而复始,直至整个程序被执行完成
第一阶段:取指、解码、执行这三个过程是同时进行的,这意味着任何一个过程完成都需要等待其余两个过程执行完毕,时间浪费
第二阶段:取指、解码、执行设计为流水线式的设计,即执行指令n时,可以对指令n+1解码,并且可以读取指令n+2,完全是一套流水线
第三阶段:超变量cpu,比流水线更加先进,有多个执行单元,可以同时负责不同的事情,比如看片的同时,听歌,打游戏。两个或更多的指令被同时取出、解码并装入一个保持缓冲区中,直至它们都执行完毕。只要有一个执行单元空闲,就检查保持缓冲区是否还有可处理的指令
这种设计存在一种缺陷,即程序的指令经常不按照顺序执行,在多数情况下,硬件负责保证这种运算结果与顺序执行的指令时的结果相同。
2.4 内核态与用户态
除了在嵌入式系统中的非常简答的CPU之外,多数CPU都有两种模式,即内核态与用户态。通常,PSW中有一个二进制位控制这两种模式。
内核态:当cpu在内核态运行时,cpu可以执行指令集中所有的指令,很明显,所有的指令中包含了使用硬件的所有功能。操作系统在内核态下运行,从而可以访问整个硬件。
用户态:用户程序在用户态下运行,仅仅只能执行cpu整个指令集的一个子集,该子集中不包含操作硬件功能的部分,因此,一般情况下,在用户态中有关I/O和内存保护(操作系统占用的内存是受保护的,不能被别的程序占用),当然,在用户态下,将PSW中的模式设置成内核态也是禁止的。
如何切换内核态与用户态
所有用户程序都是运行在用户态的,但是有时候程序确实需要做一些内核态的事情,例如:从硬盘读取数据,或者从键盘获取输入等。而唯一可以做这些事情的就是操作系统,所以此时程序就需要向操作系统请求以程序的名义来执行这些操作。
这时需要一个这样的机制: 用户态程序切换到内核态,但是不能控制在内核态中执行的指令
这种机制叫系统调用(system call), 在CPU中的实现称之为陷阱指令(Trap Instruction)。我们可以把系统调用看成一个特别的过程:调用指令就可以了,该指令具有从用户态切换到内核态的特别能力。
工作流程如下:
- 用户态程序将一些数据值放在寄存器中, 或者使用参数创建一个堆栈(stack frame),以此表明需要操作系统提供的服务
- 用户态程序执行陷阱指令
- CPU切换到内核态,并跳到位于内存指定位置的指令,这些指令是操作系统的一部分, 他们具有内存保护,不可被用户态程序访问
- 这些指令称之为陷阱(trap)或者系统调用处理器(system call handler),他们会读取程序放入内存的数据参数, 并执行程序请求的服务
- 系统调用完成后,操作系统会重置CPU为用户态并返回系统调用的结果
2.5 多线程和多核芯片
moore定律指出,芯片中的晶体管数量每18个月翻一倍,随着晶体管数量的增多,更强大的功能成为了可能,如:
第一步增强:在cpu芯片中加入更大的缓存,一级缓存L1,用和cpu相同的材质制成,cpu访问它没有时延
第二步增强:一个cpu中的处理逻辑增多,intel公司首次提出,称为多线程(multithreading)或超线程(hyperthreading),对用户来说一个有两个线程的cpu就相当于两个cpu,我们后面要学习的进程和线程的知识就起源于这里,进程是资源单位而线程才是cpu的执行单位(多线程运行cpu保持两个不同的线程状态,可以在纳秒级的时间内来回切换,速度快到你看到的结果是并发的,伪并行的,然而多线程不提供真正的并行处理,一个cpu同一时刻只能处理一个进程(一个进程中至少一个线程))
第三步增强:除了多线程,还可以有多个完整处理器的cpu芯片,如下图。要使用这类多核芯片肯定需要有多处理操作系统
2.6 CPU的外频与倍频
所谓的外频指的是CPU与外部组件进行数据传输时的速度,倍频则是 CPU 内部用来加速工作效能的一个倍数, 两者相乘才是CPU的频率速度。以Intel Core 2 Duo E8400 CPU来说,他的频率是3.0GHz, 而外频是333MHz,因此倍频就是9倍!(3.0G=333Mx9, 其中1G=1000M)。
主存储器与CPU的沟通速度靠的是外部频率,一般主板芯片组有分北桥与南桥, 北桥的总线称为系统总线,因为是内存传输的主要信道,所以速度较快。 南桥就是所谓的输入输出(I/O)总线,主要在联系硬盘、USB、网绚卡等接口设备。北桥所支持的频率称为前端总线速度(Front Side Bus, FSB), 而每次传送的位数则是总线宽度。 那所谓的总线带宽则是:『FSBx总线宽度』亦即每秒钟可传送癿最大数据量。 目前常见的总线宽度有32/64位(bits)。
与总线宽度相似的,CPU每次能够处理的数据量称为字组大小(word size), 字组大小依据CPU的设计而有32位、64位。现在所称的计算机是32与64位主要是依据这个 CPU解析的字组大小而来的!早期的32位CPU中,因为CPU每次能够解析的数据量有限, 因此由主存储器传来的数据量就有所限制了。这也导致32位的CPU最多只能支持最大到4GBytes的内存。
三 存储器
计算机系统中第二重要的就是存储了,它的分级结构如下:
顶层的存储器速度较高,容量较小,与底层的存储器相比每位的成本较高,其差别往往是十亿数量级的,当然随着科技的进步,典型的访问时间及容量只是参考值哈,这里我们主要想展示一下结构。
3.1 寄存器(L1缓存)
用与cpu相同材质制造,与cpu一样快,因而cpu访问它无时延,典型容量是:在32位cpu中为32*32,在64位cpu中为64*64,在两种情况下容量均<1KB。
3.2 高速缓存(L2缓存)
主要由硬件控制高速缓存的存取,内存中有高速缓存行按照0~64字节为行0,64~127为行1。。。最常用的高速缓存行放置在cpu内部或者非常接近cpu的高速缓存中。当某个程序需要读一个存储字时,高速缓存硬件检查所需要的高速缓存行是否在高速缓存中。如果是,则称为高速缓存命中,缓存满足了请求,就不需要通过总线把访问请求送往主存(内存),这毕竟是慢的。高速缓存的命中通常需要两个时钟周期。高速缓存未命中,就必须访问内存,这需要付出大量的时间代价。由于高速缓存价格昂贵,所以其大小有限,有些机器具有两级甚至三级高速缓存,每一级高速缓存比前一级慢但是容易大。
3.3 内存
内存包括随机存储器(Random Access Memory,RAM),只读存储器(Read Only Memory,ROM)。RAM是内存中最重要的存储器,它只有在通电时才能记录与使用,断电后数据就消失了,是易失性存储。ROM为非易失性存储,在电源切断之后,它存储的内容也不会丢失,ROM只读存储器在工厂中就被编程完毕,然后再也不能修改。ROM速度快且便宜,在有些计算机中,用于启动计算机的引导加载模块就存放在ROM中,另外一些I/O卡也采用ROM处理底层设备的控制。
EEPROM(Electrically Erasable PROM,电可擦除可编程ROM)和闪存(flash memory)也是非易失性的,但是与ROM相反,他们可以擦除和重写。不过重写时花费的时间比写入RAM要多。在便携式电子设备中,闪存通常作为存储媒介。闪存是数码相机中的胶卷,是便携式音译播放器的磁盘,还应用于固态硬盘。闪存在速度上介于RAM和磁盘之间,但与磁盘不同的是,闪存擦除的次数过多,就被磨损了。
还有一类存储器就是CMOS,它是易失性的,许多计算机利用CMOS存储器来保持当前时间和日期。CMOS存储器和递增时间的电路由一小块电池驱动,所以,即使计算机没有加电,时间也仍然可以正确地更新,除此之外CMOS还可以保存配置的参数,比如,哪一个是启动磁盘等,之所以采用CMOS是因为它耗电非常少,一块工厂原装电池往往能使用若干年,但是当电池失效时,相关的配置和时间等都将丢。失。
3.4 磁盘
常说的硬盘就是磁盘的一种,它的物理组成:硬盘盒里面其实是由许许多多的圆形磁盘盘、机械手臂、 磁盘读取头与主轴马达所组成的,整个内部如下所示:
当磁盘旋转时,磁头(读取头)若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道
磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区,扇区典型的值是512字节
硬盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面
数据都存放于一段一段的扇区中,从磁盘读取一段数据需要经历寻道时间和延迟时间
平均寻道时间
指硬盘在接收到系统指令后,磁头从开始移动到数据所在的磁道所花费时间的平均值,它在一定程度上体现了硬盘读取数据的能力,是影响硬盘内部数据传输率的重要参数,单位为毫秒(ms)
平均延迟时间
机械臂到达正确的磁道之后还必须等待旋转到数据所在的扇区下,这段时间成为延迟时间
传输接口
硬盘接口是硬盘与主机系统间的连接部件,作用是在硬盘缓存和主机内存之间传输数据。不同的硬盘接口决定着硬盘与计算机之间的连接速度,在整个系统中,硬盘接口的优劣直接影响着程序运行快慢和系统性能好坏。目前主要接口类型有:ATA、IDE、SATA、SCSI、光纤通道。
补充–虚拟内存
许多计算机支持虚拟内存机制,该机制使计算机可以运行大于物理内存的程序,方法是将正在使用的程序放入内存去执行,而暂时不需要执行的程序放到磁盘的某块地方,这块地方成为虚拟内存。在linux中成为swap,这种机制的核心在于快速地映射内存地址,由cpu中的一个部件负责,成为存储器管理单元(Memory Management Unit MMU)。
3.5 磁带
在价钱相同的情况下比硬盘拥有更高的存储容量,虽然速度低于磁盘,但是因其大容量,在地震水灾火灾时可移动性强等特性,常被用来做备份。(常见于大型数据库系统中)
四 I/O设备
cpu和存储器并不是操作系统唯一需要管理的资源,I/O设备也是非常重要的一环。I/O设备一般包括两个部分:设备控制器和设备本身。
控制器:是查找主板上的一块芯片或一组芯片(硬盘,网卡,声卡等都需要插到一个口上,这个口连的便是控制器),控制器负责控制连接的设备,它从操作系统接收命令,比如读硬盘数据,然后就对硬盘设备发起读请求来读出内容。
控制器的功能:通常情况下对设备的控制是非常复杂和具体的,控制器的任务就是为操作系统屏蔽这些复杂而具体的工作,提供给操作系统一个简单而清晰的接口
设备本身:有相对简单的接口且标准的,这样大家都可以为其编写驱动程序了。要想调用设备,必须根据该接口编写复杂而具体的程序,于是有了控制器提供设备驱动接口给操作系统。必须把设备驱动程序安装到操作系统中。
五 总线(主板)
前面提到的总线结构在小型计算机中沿用了多年,并也用在早期的IBM PC中。但是随着处理器和存储器速度越来越快,单总线很难处理总线的交通流量了,于是出现了下图的多总线模式,他们处理I/O设备及cpu到存储器的速度都更快。
主板图解如下:
整个主板上面最重要的就是芯片组!而芯片组通常又分为两个网桥来控制各组件的沟通, 分别是PCI桥(北桥)和ISA桥(南桥)
北桥:北桥的总线称为系统总线,负责链接速度较快的CPU、主存储器与显示适配器等组件;
南桥:南桥就是所谓的输入输出(I/O)总线,负责连接速度较慢的周边接口, 包括硬盘、USB、网绚卡等等。
六 个人计算机架构
6.1 Inter芯片
6.2 AMD芯片
AMD芯片架构与Intel不同的地方在于主存储器是直接与CPU沟通而不通过北桥!如前面所说,可以知道CPU的资料主要都是来自于主存储器提供, 因此AMD为了加速这两者的沟通,所以将内存控制组件整合到CPU中, 理论上这样可以加速CPU于主存储器的传输速度!这是两种CPU在架构上面主要的差异点。
七 电源
上面介绍了计算机主要的硬件,还有一样需要说明一下,那就是电源。电源(Power)= 心脏:所有的组件要能运作,得要有足够的电力供给才行。这就好像心脏一样,如果心脏不跳动了,人就嗝屁了,电脑也是如果没有电源,那也就是一堆垃圾,什么作用都没有。
八 启动计算机
CMOS与BIOS
CMOS主要的功能为记录主板上面的重要参数, 包括系统时间、CPU电压不频率、各项设备的I/O地址与IRQ等,由于这些数据的记录要花费电力,因此主板上面才有电池。 BIOS(Basic Input Output system)为写入到主板上某一块 flash 或 EEPROM的一个基本的输入输出程序,它可以在开机的时候执行,以加载CMOS当中的参数,并尝试呼叫储存装置中的开机程序,进一步进入操作系统当中。BIOS程序也可以修改CMOS中的数据, 每种主板呼叫BIOS设定程序的按键都不同,一般桌面计算机常见的是使用del按键进入BIOS设定画面
具体启动流程如下:
- 计算机加电
- BIOS开始运行,检测硬件:cpu、内存、硬盘等
- BIOS读取CMOS存储器中的参数,选择启动设备
- 从启动设备上读取第一个扇区的内容(MBR主引导记录512字节,前446为引导信息,后64为分区信息,最后两个为标志位)
- 根据分区信息读入bootloader启动装载模块,启动操作系统
- 然后操作系统询问BIOS,以获得配置信息。对于每种设备,系统会检查其设备驱动程序是否存在,如果没有,系统则会要求用户按照设备驱动程序。一旦有了全部的设备驱动程序,操作系统就将它们调入内核。然后初始有关的表格(如进程表),穿件需要的进程,并在每个终端上启动登录程序或GUI
补充–应用程序的启动流程
- 打开需要启动的应用程序
- 操作系统获得带应用程序的文件路径
- 操作系统从硬盘读取文件到内存中
- cpu从内存中读取数据执行
参考博客:https://www.cnblogs.com/linhaifeng/p/6523843.html
参考书籍:鸟哥的linux私房菜_基础学习篇
关于计算机硬件发展史可参考:http://www.cnblogs.com/linhaifeng/p/6428430.html