前一篇文章介绍了冯诺依曼体系结构的计算机的基本工做原理,其中主要介绍了CPU的结构和工做原理。这一篇主要来介绍存储区,总线,以及IO设备等其余几大组件,来了解整个计算机是如何工做的。 这些东西都是看得见摸得着的硬件,平时咱们买电脑时最关注的就是CPU的速度,内存的大小,主板芯片等等的参数。html
前面咱们以一个简单通用的计算机模型来介绍了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的体积会很是大。因此在CPU中只有少许的寄存器。而每一个寄存器的大小都是8-64字节。缓存
RAM(Read-Access Memory)分为两类,静态(SRAM)和动态(DRAM)。SDRAM比DRAM要快的多,可是价格也要贵的多。网络
SRAM相比DRAM速度更快功耗更低,而因为结构相对复杂占用面积较大,因此通常少许在CPU内部用做Cache,而不适合大规模的集成使用,如内存。而DRAM主要用来做为计算机的内部主存。架构
前面的RAM在断电后都会丢失数据,因此他们是易失的。另外一方面非易失的存储器即使在断点后也能保存数据。通常咱们称之为ROM(Read-Only Memory)。虽然这么说,可是ROM在特殊的状况下仍是能够写入数据的,不然就不能叫存储器了。异步
ROM在计算机中应用也比较多,好比咱们的BIOS芯片,最开始采用PROM,后来使用EPROM,若是损坏计算机就没法启动了。而目前手机中也采用ROM来烧入系统,而RAM做为内存,使用Flash Memory做为机身存储。
也就是咱们最多见的硬盘。目前硬盘主流已是500G,1T。转速也在7200转左右。相对于8G的内存,一个500G的硬盘能够说是至关的便宜。可是问题在于他的速度很是的慢,从磁盘读取数据须要几个毫秒,而CPU时钟周期是以纳秒计算。磁盘读取操做要比DRAM慢10万倍,比SRAM慢百万倍。
相对于CPU,内部存储的电子结构,磁盘存储是一种机械结构。数据都经过电磁流来改变极性的方式被电磁流写到磁盘上,而经过相反的方式读回。一个硬盘由多个盘片组成,每一个盘片被划分为磁道,扇区和最小的单位簇。而每一个盘面都有一个磁头用来读取和写入数据。而硬盘的马达装置则控制了磁头的运动。
随着计算机的发展,缓慢的磁盘速度已经成为计算机速度的障碍了。大多数状况下,你的CPU够快,内存够大,但是打开一个程序或游戏时,加载的速度总仍是很慢。(关于程序加载的过程后面的文章会讲到)。缘由就是磁盘读写速度太慢,因此一度出现了虚拟硬盘。就是把一部份内存虚拟成硬盘,这样一些缓存文件直接放到内存中,这样就加快了程序访问这些数据的速度。可是他的问题是易失的。固然你能够保存到磁盘,可是加载和回写的速度会随着数据量加大而加大。因此这个适用于一些临时数据的状况,好比浏览器缓存文件。
而固态硬盘是最近几年出来的,并且随着技术的发展,价格也愈来愈便宜,愈来愈多的人采用SSD+HHD的方式来搭建系统,提升系统的速度。其实SSD在上世纪80年代就有基于DRAM的产品,可是由于易失性和价格而没法推广开来。而如今的SSD则是使用Flash Memory。目前市面上最多见的是SLC,MLC,TLC存储介质的固态硬盘。咱们知道Flash都是与写入次数限制的。而SLC>MLC>TLC。目前主流的SSD都是使用MLC,好比Intel 520,三星830系列。固然目前三星也退出了基于TLC的固态硬盘,价格相对要便宜一些。
简单能够理解为是将数据指令存储在其余机器上,好比分布式系统,WebService Server,HTTP Server以及如今炒的火热的云端存储。计算机经过网络相互链接。比较起磁盘,远程存储的速度是以秒来计算。
经过上面介绍咱们对计算机存储器有了一个了解,而且知道了存储器层次越高速度越快。那么为何咱们要对存储器分层呢? 分红是为了弥补CPU和存储器直接速度的差距。这种方式之全部有效,是由于应用程序的一个特性:局部性。
咱们知道计算机的体系是存储程序,顺序执行。因此在执行一个程序的指令时,它后面的指令有很大的可能在下一个指令周期被执行。而一个存储区被访问后,也可能在接下来的操做中再次被访问。这就是局部性的两种形式:
对于现代计算机来讲,不管是应用程序,操做系统,硬件的各个层次咱们都是用了局部性。
CODE1:
int sumarraycols(int a[m][n]) { int i, j , sum = 0; for(j = 0; j < n; j++) for(i = 0; i < m; i++) sum += a[i][j]; return sum; }
CODE2:
int sumarraycols(int a[m][n]) { int i, j , sum = 0; for(i = 0; i < m; i++) for(j = 0; j < n; j++) sum += a[i][j]; return sum; }
以上2段代码差异只有for循环的顺序,可是局部性却相差了不少。咱们知道数组在内存中是按照行的顺序来存储的。可是CODE1确实按列去访问,这可能就致使缓存不命中(须要的数据并不在Cache中,由于Cache存储的是连续的内存数据,而CODE1访问的是不联系的),也就下降了程序运行的速度。
前面介绍了存储器的存储技术和分层,也一直提到CPU从存储器中获取数据和指令,这一节就介绍一下CPU和存储器之间是如何通讯的。
所谓总线是各类功能部件之间传送信息的公共通讯干线,它是由导线组成的传输线束。咱们知道计算机有运算器,控制器,存储器,输入输出设备这五大组件,因此总线就是用来链接这些组件的导线。
按照计算机所传输的信息种类,计算机的总线能够划分为
总线也能够按照CPU内外来分类:
前面我面介绍了总线的分类,在咱们的简单模型中。CPU经过总线和存储器之间直接进行通讯。实际上在现代的计算机中,存在一个控制芯片的模块。CPU须要和存储器,I/O设备等进行交互,会有多种不一样功能的控制芯片,咱们称之为控制芯片组(Chipset)。
对于目前的计算机结构来讲,控制芯片集成在主板上,典型的有南北桥结构和单芯片结构。与芯片相链接的总线能够分为前端总线(FSB)、存储总线、IQ总线,扩展总线等。
数据带宽 = (总线频率*数据位宽)/ 8
外频是创建在数字脉冲信号震动速度基础上的。它是CPU与系统总线以及其余外部设备共同运行的速度。咱们知道计算机中有一个时序发生器来保证各个部件协同工做,而这里说的外频率就是这个时序发生器的频率。外频也是系统总线的工做频率。
前面咱们如今已经知道CPU和北桥芯片链接是经过FSB。而FSB频率表示CPU和北桥芯片之间的工做速度。可是从前面咱们就知道FSB的实际频率是和外频同样的。可是随着技术的发展,Intel的QDR技术和AMD的HT技术,使得CPU在一个时钟周期能够传送4次数据,因此对于FSB涞说虽然工做早外频的频率下,可是等效的频率是外频的4倍。因此咱们说的FSB频率是等效频率,而不是实际的工做频率。随着技术的发展,Intel芯片的FSB有800MHz,1600HMz等等。但随着北桥芯片的消失,FSB的几率也慢慢远去。
对于内存频率咱们能够看到,通常包括了核心频率,总线频率和传输频率:
对于SDR来讲,它的3个频率是一致的。而DDR在一个时钟周期能够传送2次数据,因此它的传输频率是核心和总线频率的2倍。DDR2在DDR的基础上,采用了4bit预读,因此总线频率是核心频率的2倍,而DDR3采用了8bit预读,总线频率是核心频率的4倍。
DDR SDRAM Standard |
Bus clock (MHz) |
Internal rate (MHz) |
Prefetch (min burst) |
Transfer Rate (MT/s) |
Voltage | DIMM pins |
SO-DIMM pins |
MicroDIMM pins |
---|---|---|---|---|---|---|---|---|
DDR | 100–200 | 100–200 | 2n | 200–400 | 2.5/2.6 | 184 | 200 | 172 |
DDR2 | 200–533 | 100–266 | 4n | 400–1066 | 1.8 | 240 | 200 | 214 |
DDR3 | 400–1066 | 100–266 | 8n | 800–2133 | 1.5 | 240 | 204 | 214 |
从下表咱们就能看出。因此咱们常说的DDR3 1600,DDR2 800指的是内存的传输频率。相同的技术还有显卡的AGP4X,8X,PCIE-8X,16X等技术。
而随着FSB速度不断加快,内存的总线频率组建成为了瓶颈,因而出现了DDR双通道,双通道是指芯片拥有2个内存控制器,因此可使得传输速率翻倍。
由于内存总线频率不一样,因此内存和CPU之间存在同步和异步两种工做方式。
从性能上来说,同步方式的延迟要好于异步方式,这也是为何之前会说P4 200外频的CPU要使用DDR400才能发挥最大功效。但这也不是绝对的。好比个人I5处理器CPU外频工做在100MHz,而我使用的DDR3-1600的总线频率在200MHz,虽然不一样步,可是拥有更高的传输速率。因此不能一律而论。
从前面咱们知道了FSB对整个系统的性能影响很大,1600MHZ的FSB能提供的数据带宽也只有12.8GB/s,因此随着技术的发展,如今最新的计算机基本都采用了单芯片设计,北桥的功能被集成到了CPU内部。因而咱们前面说的FSB也就不存在了。对于Intel和AMD这2大芯片厂商,分别有本身的技术来提升CPU和存储器以及其余设备之间的传输速率,知足更高的计算要求。
除此以外,但芯片中的QPI和HT传输不须要通过北桥新片,在CPU内存除了集成内存控制器意外还能够集成PCI-E2.0的图形核心,使得集成显卡的核心频率和数据吞吐量大幅提升。
如图,Core I7处理器外频只有133MHz, 使用QPI技术后总线频率达到2.4GMhz,而使用DDR3-1600的内存,内存总线频率在800MHz。
这一结介绍了计算机总线系统以及CPU和各个设备之间的交互。咱们能够看到除了CPU自身的速度以外,总线的速度也影响这计算机的总体性能。从发展的过程来看,总线也是一个分分合合的过程。从最初的一条总线,到后来的单独出来的I/O总线,内存总线,就是为了提升CPU的效率。而当CPU和内存速度都发展到必定阶段后,又出现了DDR,双通道等技术,在不提升核心频率的状况下提升了传输率。因而又出现了CPU和内存间直接总线通讯下降延迟的状况。 (从2000年开始接触电脑DIY,一直到07年毕业,都对DIY颇有兴趣,可是随着电脑愈来愈快,目前以及弄不太清楚了,复习这些知识也费了我好多时间。)
前面主要介绍了系统总线和CPU与内存之间的通讯,最后一部分简单介绍一下CPU和I/O设备是如何通讯的。对于计算机来讲输入输出设备也是五大组件。咱们知道相对于CPU,I/O设备的工做频率要慢的不少。好比早期的PCI接口工做频率只有33MHz,硬盘的IDE-ATA6的传输速率也只有133MB/s。而如今的 SATA3接口速率能达到600MB/s。
对于硬件工程师来讲,I/O设备是电子芯片、导线、电源、电子控制设备、电机等组成的物理设备。而对于程序员来讲,关注的只是I/O设备的编程接口。
I/O设备通常由机械部件和电子部件两部分组成。电子设备通常称为设备控制器,在计算机上通常以芯片的形式出现,好比咱们前面介绍的南桥芯片。不一样的控制器能够控制不一样的设备。因此南桥芯片中包含了多种设备的控制器,好比硬盘控制器,USB控制器,网卡、声卡控制器等等。而经过总线以及卡槽提供和设备自己的链接。好比PCI,PCI-E,SATA,USB等。
对于不一样的设备控制器,进行的操做控制也是不一样的。因此须要专门的软件对他进行控制。这个软件的做用就是用来专门和设别控制器对话,这种软件称为驱动程序。通常来讲驱动程序由硬件设别厂商提供。因此咱们有时会碰到一些设备由于没有安装驱动程序而没法使用的状况。 而目前的OS总都包含了大量的通用驱动程序,使得咱们在安装完系统后不须要在额外的安装驱动。可是通用的驱动只能使用设备的基本功能。
驱动程序由于是非操做系统厂商开发,而且须要被安装到操做系统并调用,因此须要有一个统一的模型来开发驱动程序。不然操做系统是没法操做各式各样的设备的。前面咱们知道设备非为两大类,因此通常操做系统都定义了这两类设备的标准接口。
每一个控制器都有几个寄存器和CPU进行通讯。经过写入这些寄存器,能够命令设备发送或接受数据,开启或关闭。而经过读这些寄存器就能知道设备的状态。由于寄存器数量和大小是有限的,因此设备通常会有一个RAM的缓冲区,来存放一些数据。好比硬盘的读写缓存,显卡的显存等。一方面提供数据存放,一方面也是提升I/O操做的速度。
如今的问题是CPU如何和这些设备的寄存器或数据缓冲区进行通讯呢?存在两个可选方案:
另外一种方式是两种的结合,寄存器拥有I/O端口,而数据缓冲区则映射到内存空间。Pentinum就是使用这种方式,因此在IBM-PC兼容机中,内存的0-640K是I/O端口地址,640K-1M的地址是保留给设备数据缓冲区的。(关于内存分布后面文章会介绍)
对于咱们程序员来讲这两种方案有所不一样
任何技术有有点就会有缺点,I/O内存映射也同样:
前面已经知道CPU经过内存映射的方式和I/O设备交换数据,可是对于CPU来讲,不管是从内存仍是I/O设备读取数据,都须要把地址放到地址总线上,而后在向控制总线传递一个READ信号,还要用一条信号线来表示是从内存仍是I/O读取数据。由于I/O映射的内存区域是特定的,因此不存在没法区分是内存仍是I/O操做。目前一共有3种方式进行操做:
这一篇文章介绍了计算机组件中的存储器的分类和工做原理,以及I/O设别的工做方式。经过总线将各个部件链接起来。咱们能够看到计算机的发展不光是CPU,存储器以及I/O设备的发展,总线也是起了很是关键的做用。经过前2章的介绍,应该对计算机硬件的工做原理有了大概的了解。后面开始将主要偏向计算机操做系统软件的工做方式。固然这些也是和一些硬件的特性分不开的。
《深刻理解计算机系统》
《现代操做系统(原书第3版)》