当前位置: 主页 > 前端开发

cpu前端总线 内存-cpu前端总线 内存

发布时间:2023-03-14 22:03   浏览次数:次   作者:佚名

前言

前一篇文章介绍了冯诺依曼体系结构的计算机的基本工作原理,其中主要介绍了CPU的结构和工作原理。这一篇主要来介绍存储区,总线,以及IO设备等其他几大组件,来了解整个计算机是如何工作的。 这些东西都是看得见摸得着的硬件,平时我们买电脑时最关注的就是CPU的速度,内存的大小,主板芯片等等的参数。

1. 存储器

前面我们以一个简单通用的计算机模型来介绍了CPU的工作方式,CPU执行指令,而存储器为CPU提供指令和数据。 在这个简单的模型中,存储器是一个线性的字节数组。CPU可以在一个常数的时间内访问每个存储器的位置,虽然这个模型是有效的,但是并不能完全反应现代计算机实际的工作方式。

1.1 存储器系统层次结构

在前面介绍中,我们一直把存储器等同于了内存,但是实际上在现代计算机中,存储器系统是一个具有不同容量,不同访问速度的存储设备的层次结构。整个存储器系统中包括了寄存器、Cache、内部存储器、外部存储。下图展示了一个计算机存储系统的层次图。层次越高速度越快,但是价格越高,而层次越低,速度越慢,价格越低。

cpu前端总线 内存_cpu前端总线 内存_前端总线 内存总线

相对于CPU来说,存储器的速度是相对比较慢的。无论CPU如何发展,速度多块,对于计算机来说CPU总是一个稀缺的资源,所以我们应该最大程度的去利用CPU。其面我们提到过CPU周期,一个CPU周期是取1条指令的最短的时间。由此可见,CPU周期在很大程度上决定了计算机的整体性能。你想想如果当CPU去取一条指令需要2s,而执行一个指令只需要2ms,对于计算机来说性能是多么大的损失。所以存储器的速度对于计算机的速度影响是很大的。

对于我们来说,总是希望存储器的速度能和CPU一样或尽量的块,这样一个CPU周期需要的时钟周期就越少。但是现实是,这样的计算机可能相当的昂贵。所以在计算机的存储系统中,采用了一种分层的结构。速度越快的存储器容量越小,这样就能做到在性能和价格之间的一个很好的平衡。

1.2 存储技术

计算机的发展离不开存储器的发展,早起的计算机没用硬盘,只有几千字节的RAM可用。而我们现在4G,8G的内存已经随处可见,1T的大硬盘以及上百G的固态硬盘,而价格也比10年,20年前便宜的很多很多。所以我先大概了解下各种存储技术。目前存储技术大致分为SRAM存储器、DRAM存储器、ROM存储器和磁盘。

1.2.1 寄存器

在上一篇文章的图中我们有看得CPU内部有很多寄存器,而上一张图也显示,寄存器在存储层次结构的顶端。它也叫触发器,它往往和CPU同时钟频率,所以速度非常快。但是一个寄存器需要20多个晶体管,所以如果大量使用,CPU的体积会非常大。所以在CPU中只有少量的寄存器。而每个寄存器的大小都是8-64字节。

1.2.2 RAM随机访问存储

RAM(Read-Access Memory)分为两类,静态(SRAM)和动态(DRAM)。SDRAM比DRAM要快的多,但是价格也要贵的多。

SRAM相比DRAM速度更快功耗更低,而由于结构相对复杂占用面积较大,所以一般少量在CPU内部用作Cache,而不适合大规模的集成使用,如内存。而DRAM主要用来作为计算机的内部主存。

1.2.3 ROM只读存储

前面的RAM在断电后都会丢失数据,所以他们是易失的。另一方面非易失的存储器即便在断点后也能保存数据。一般我们称之为ROM(Read-Only Memory)。虽然这么说,但是ROM在特殊的情况下还是可以写入数据的,否则就不能叫存储器了。

ROM在计算机中应用也比较多,比如我们的BIOS芯片,最开始采用PROMcpu前端总线 内存,后来使用EPROM,如果损坏计算机就无法启动了。而目前手机中也采用ROM来烧入系统,而RAM作为内存,使用Flash Memory作为机身存储。

1.2.4 磁盘存储

也就是我们最常见的硬盘。目前硬盘主流已经是500G,1T。转速也在7200转左右。相对于8G的内存,一个500G的硬盘可以说是相当的便宜。但是问题在于他的速度非常的慢,从磁盘读取数据需要几个毫秒,而CPU时钟周期是以纳秒计算。磁盘读取操作要比DRAM慢10万倍,比SRAM慢百万倍。

前端总线 内存总线_cpu前端总线 内存_cpu前端总线 内存

cpu前端总线 内存_前端总线 内存总线_cpu前端总线 内存

相对于CPU,内部存储的电子结构,磁盘存储是一种机械结构。数据都通过电磁流来改变极性的方式被电磁流写到磁盘上,而通过相反的方式读回。一个硬盘由多个盘片组成,每个盘片被划分为磁道,扇区和最小的单位簇。而每个盘面都有一个磁头用来读取和写入数据。而硬盘的马达装置则控制了磁头的运动。

1.2.5 虚拟硬盘(VHD)和固态硬盘(SSD)

随着计算机的发展,缓慢的磁盘速度已经成为计算机速度的障碍了。大多数情况下,你的CPU够快,内存够大,可是打开一个程序或游戏时,加载的速度总还是很慢。(关于程序加载的过程后面的文章会讲到)。原因就是磁盘读写速度太慢,所以一度出现了虚拟硬盘。就是把一部分内存虚拟成硬盘,这样一些缓存文件直接放到内存中,这样就加快了程序访问这些数据的速度。但是他的问题是易失的。当然你可以保存到磁盘,但是加载和回写的速度会随着数据量加大而加大。所以这个适用于一些临时数据的情况,比如浏览器缓存文件。

而固态硬盘是最近几年出来的,而且随着技术的发展,价格也越来越便宜,越来越多的人采用SSD+HHD的方式来搭建系统,提高系统的速度。其实SSD在上世纪80年代就有基于DRAM的产品,但是因为易失性和价格而无法推广开来。而现在的SSD则是使用Flash Memory。目前市面上最常见的是SLC,MLC,TLC存储介质的固态硬盘。我们知道Flash都是与写入次数限制的。而SLC>MLC>TLC。目前主流的SSD都是使用MLC,比如Intel 520,三星830系列。当然目前三星也退出了基于TLC的固态硬盘,价格相对要便宜一些。

1.2.6 远程存储

简单可以理解为是将数据指令存储在其他机器上,比如分布式系统,WebService Server,HTTP Server以及现在炒的火热的云端存储。计算机通过网络相互连接。比较起磁盘,远程存储的速度是以秒来计算。

1.3 局部性

通过上面介绍我们对计算机存储器有了一个了解,并且知道了存储器层次越高速度越快。那么为什么我们要对存储器分层呢? 分成是为了弥补CPU和存储器直接速度的差距。这种方式之所有有效,是因为应用程序的一个特性:局部性。

我们知道计算机的体系是存储程序,顺序执行。所以在执行一个程序的指令时,它后面的指令有很大的可能在下一个指令周期被执行。而一个存储区被访问后,也可能在接下来的操作中再次被访问。这就是局部性的两种形式:

对于现代计算机来说,无论是应用程序,操作系统,硬件的各个层次我们都是用了局部性。

硬件:通过引入Cache存储器来保存最近访问的指令数据来提高对主存的访问速度。操作系统: 允许是用主存作为虚拟地址空间被引用块的高速缓存以及从盘文件的块的高速缓存。应用程序:将一些远程服务比如HTTP Server的HTML页面缓存在本度的磁盘中。

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访问的是不联系的),也就降低了程序运行的速度。

2 存储器访问和总线

前面介绍了存储器的存储技术和分层,也一直提到CPU从存储器中获取数据和指令,这一节就介绍一下CPU和存储器之间是如何通信的。

2.1 总线

所谓总线是各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束。我们知道计算机有运算器,控制器,存储器,输入输出设备这五大组件,所以总线就是用来连接这些组件的导线。

按照计算机所传输的信息种类,计算机的总线可以划分为

cpu前端总线 内存_cpu前端总线 内存_前端总线 内存总线

总线也可以按照CPU内外来分类:

前端总线 内存总线_cpu前端总线 内存_cpu前端总线 内存

2.2 控制芯片

前面我面介绍了总线的分类,在我们的简单模型中。CPU通过总线和存储器之间直接进行通信。实际上在现代的计算机中,存在一个控制芯片的模块。CPU需要和存储器,I/O设备等进行交互,会有多种不同功能的控制芯片,我们称之为控制芯片组(Chipset)。

对于目前的计算机结构来说,控制芯片集成在主板上,典型的有南北桥结构和单芯片结构。与芯片相连接的总线可以分为前端总线(FSB)、存储总线、IQ总线,扩展总线等。

南桥芯片,它主要负责外部接口和内部CPU的联系; 单芯片结构: 单芯片组主要是是取消了北桥,因为现在CPU中内置了内存控制器,不需要再通过北桥来控制,这样就能提高内存控制器的频率,减少延迟。而现在一些CPU还集成了显示单元。也使得显示芯片的频率更高,延迟更低。

cpu前端总线 内存_cpu前端总线 内存_前端总线 内存总线

2.3 运行频率

数据带宽 = (总线频率*数据位宽)/ 8

2.3.1 外频

外频是建立在数字脉冲信号震动速度基础上的。它是CPU与系统总线以及其他外部设备共同运行的速度。我们知道计算机中有一个时序发生器来保证各个部件协同工作,而这里说的外频率就是这个时序发生器的频率。外频也是系统总线的工作频率。

2.3.2 频率和控制芯片

2.3.2 分频和倍频

2.3.3 FSB频率

前面我们现在已经知道CPU和北桥芯片连接是通过FSB。而FSB频率表示CPU和北桥芯片之间的工作速度。但是从前面我们就知道FSB的实际频率是和外频一样的。但是随着技术的发展,Intel的QDR技术和AMD的HT技术,使得CPU在一个时钟周期可以传送4次数据,所以对于FSB涞说虽然工作早外频的频率下,但是等效的频率是外频的4倍。所以我们说的FSB频率是等效频率,而不是实际的工作频率。随着技术的发展,Intel芯片的FSB有800MHz,1600HMz等等。但随着北桥芯片的消失,FSB的概率也慢慢远去。

2.3.4 内存频率

对于内存频率我们可以看到,一般包括了核心频率,总线频率和传输频率:

对于SDR来说,它的3个频率是一致的。而DDR在一个时钟周期可以传送2次数据,所以它的传输频率是核心和总线频率的2倍。DDR2在DDR的基础上,采用了4bit预读,所以总线频率是核心频率的2倍,而DDR3采用了8bit预读,总线频率是核心频率的4倍。

DDR SDRAM

StandardBus clock

(MHz)Internal rate

(MHz)Prefetch

(min burst)Transfer Rate

(MT/s)VoltageDIMM

pinsSO-DIMM

pinsMicroDIMM

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等技术。

cpu前端总线 内存_cpu前端总线 内存_前端总线 内存总线

而随着FSB速度不断加快,内存的总线频率组建成为了瓶颈,于是出现了DDR双通道,双通道是指芯片拥有2个内存控制器,所以可以使得传输速率翻倍。

2.3.5 内存总线工作方式

因为内存总线频率不同,所以内存和CPU之间存在同步和异步两种工作方式。

从性能上来讲,同步方式的延迟要好于异步方式,这也是为什么以前会说P4 200外频的CPU要使用DDR400才能发挥最大功效。但这也不是绝对的。比如我的I5处理器CPU外频工作在100MHz,而我使用的DDR3-1600的总线频率在200MHz,虽然不同步,但是拥有更高的传输速率。所以不能一概而论。

2.3.6 QPI和HT总线技术

从前面我们知道了FSB对整个系统的性能影响很大,1600MHZ的FSB能提供的数据带宽也只有12.8GB/s,所以随着技术的发展,现在最新的计算机基本都采用了单芯片设计,北桥的功能被集成到了CPU内部。于是我们前面说的FSB也就不存在了。对于Intel和AMD这2大芯片厂商,分别有自己的技术来提高CPU和存储器以及其他设备之间的传输速率,满足更高的计算要求。

除此之外,但芯片中的QPI和HT传输不需要经过北桥新片,在CPU内存除了集成内存控制器意外还可以集成PCI-E2.0的图形核心,使得集成显卡的核心频率和数据吞吐量大幅提高。

cpu前端总线 内存_cpu前端总线 内存_前端总线 内存总线

cpu前端总线 内存_前端总线 内存总线_cpu前端总线 内存

如图,Core I7处理器外频只有133MHz, 使用QPI技术后总线频率达到2.4GMhz,而使用DDR3-1600的内存,内存总线频率在800MHz。

2.3.7 小结

这一结介绍了计算机总线系统以及CPU和各个设备之间的交互。我们可以看到除了CPU自身的速度之外,总线的速度也影响这计算机的整体性能。从发展的过程来看,总线也是一个分分合合的过程。从最初的一条总线,到后来的单独出来的I/O总线,内存总线,就是为了提高CPU的效率。而当CPU和内存速度都发展到一定阶段后,又出现了DDR,双通道等技术,在不提高核心频率的情况下提高了传输率。于是又出现了CPU和内存间直接总线通信降低延迟的情况。(从2000年开始接触电脑DIY,一直到07年毕业,都对DIY很有兴趣,但是随着电脑越来越快,目前以及弄不太清楚了,复习这些知识也费了我好多时间。)

3. I/O设备

前面主要介绍了系统总线和CPU与内存之间的通信,最后一部分简单介绍一下CPU和I/O设备是如何通信的。对于计算机来说输入输出设备也是五大组件。我们知道相对于CPU,I/O设备的工作频率要慢的很多。比如早期的PCI接口工作频率只有33MHz,硬盘的IDE-ATA6的传输速率也只有133MB/s。而现在的 SATA3接口速率能达到600MB/s。

3.1 I/O设备原理

对于硬件工程师来说,I/O设备是电子芯片、导线、电源、电子控制设备、电机等组成的物理设备。而对于程序员来说,关注的只是I/O设备的编程接口。

3.1.1 I/O设备分类

3.1.2 设备控制器

I/O设备一般由机械部件和电子部件两部分组成。电子设备一般称为设备控制器,在计算机上一般以芯片的形式出现,比如我们前面介绍的南桥芯片。不同的控制器可以控制不同的设备。所以南桥芯片中包含了多种设备的控制器,比如硬盘控制器,USB控制器,网卡、声卡控制器等等。而通过总线以及卡槽提供和设备本身的连接。比如PCI,PCI-E,SATA,USB等。

3.1.3 驱动程序

对于不同的设备控制器,进行的操作控制也是不同的。所以需要专门的软件对他进行控制。这个软件的作用就是用来专门和设备控制器对话,这种软件称为驱动程序。一般来说驱动程序由硬件设别厂商提供。所以我们有时会碰到一些设备因为没有安装驱动程序而无法使用的情况。 而目前的OS总都包含了大量的通用驱动程序,使得我们在安装完系统后不需要在额外的安装驱动。但是通用的驱动只能使用设备的基本功能。

驱动程序因为是非操作系统厂商开发,并且需要被安装到操作系统并调用,所以需要有一个统一的模型来开发驱动程序。否则操作系统是无法操作各式各样的设备的。前面我们知道设备非为两大类,所以一般操作系统都定义了这两类设备的标准接口。

3.1.4 内存映射I/O

每个控制器都有几个寄存器和CPU进行通信。通过写入这些寄存器,可以命令设备发送或接受数据,开启或关闭。而通过读这些寄存器就能知道设备的状态。因为寄存器数量和大小是有限的,所以设备一般会有一个RAM的缓冲区,来存放一些数据。比如硬盘的读写缓存,显卡的显存等。一方面提供数据存放,一方面也是提高I/O操作的速度。

现在的问题是CPU如何和这些设备的寄存器或数据缓冲区进行通信呢?存在两个可选方案:

为每个控制器分配一个I/O端口号,所有的控制器可以形成一个I/O端口空间。存放在内存中。一般程序不能访问,而OS通过特殊的指令和端口号来从设备读取或是写入数据。早期计算机基本都是这种方式。将所有控制器的寄存器映射到内存空间,于是每个设备的寄存器都有一个唯一的地址。这种称为内存映射I/O。

另一种方式是两种的结合,寄存器拥有I/O端口,而数据缓冲区则映射到内存空间。Pentinum就是使用这种方式,所以在IBM-PC兼容机中,内存的0-640K是I/O端口地址,640K-1M的地址是保留给设备数据缓冲区的。(关于内存分布后面文章会介绍)

对于我们程序员来说这两种方案有所不同

对于第一种方式需要使用汇编语言来操作,而第2种方式则可以使用C语言来编程,因为他不需要特殊的指令控制,对待I/O设备和其他普通数据访问方式是相同的。对于I/O映射方式,不需要特殊的保护机制来组织对I/O的访问,因为OS已经完成了这部分工作,不会把这一段内存地址分配给其他程序。对于内存可用的指令,也能使用在设备的寄存器上。

任何技术有有点就会有缺点,I/O内存映射也一样:

前面提到过Cache可以对内存进行缓存,但是如果对I/O映射的地址空间进行缓存就会有问题。所以必须有机制来禁用I/O映射空间缓存,这就增大了OS的复杂性。另一个问题是,因为发送指令后需要判断是内存还是I/O操作,所以它们需要能够检查全部的内存空间。以前CPU,内存和I/O设备在同一个总线上,所以检查很方便。但是后来为了提高CPU和内存效率,CPU和内存之间有一条高速的总线(比如QPI)。这样I/O设备就无法查看内存地址,因为内存地址总线旁落到了内存和CPU的高速总线上,所以需要一个额外的芯片来处理(北桥芯片,内存控制器的作用),增大了系统的复杂度。

3.2 CPU和I/O设备数据交换方式

前面已经知道CPU通过内存映射的方式和I/O设备交换数据,但是对于CPU来说,无论是从内存还是I/O设备读取数据,都需要把地址放到地址总线上,然后在向控制总线传递一个READ信号,还要用一条信号线来表示是从内存还是I/O读取数据。因为I/O映射的内存区域是特定的,所以不存在无法区分是内存还是I/O操作。目前一共有3种方式进行操作:

程序控制I/O: CPU在向I/O设备发出指令后,通过程序查询方式检查I/O设备是否完成工作,如果完成就读取数据,这种方式缺点是CPU在I/O设备工作时被占用。中断驱动I/O: CPU是稀缺资源,所以为了提高利用率,减少I/O等待。在I/O设备工作时CPU不再等待,而是进行其他的操作,当I/O设备完成后,通过一个硬件中断信号通知CPU。CPU在来处理接下来的工作,比如读取数据存放到内存。但是每次只能请求一个字节,效率很低。DMA: Direct Memory Access利用一种特性的芯片存在于CPU和I/O设备之间。CPU需要操作I/O设备时只需要发送消息给DMA芯片,后面的事情全部内又DMA来完成,当把所需要数据放入内存后在通知CPU进行操作,整个过程DMA直接和内存总线打交道,而CPU也只需要和DMA芯片和内存交互,大大提高了速度。

cpu前端总线 内存_cpu前端总线 内存_前端总线 内存总线

cpu前端总线 内存_cpu前端总线 内存_前端总线 内存总线

总结

这一篇文章介绍了计算机组件中的存储器的分类和工作原理,以及I/O设别的工作方式。通过总线将各个部件连接起来。我们可以看到计算机的发展不光是CPUcpu前端总线 内存,存储器以及I/O设备的发展,总线也是起了非常关键的作用。通过前2章的介绍,应该对计算机硬件的工作原理有了大概的了解。后面开始将主要偏向计算机操作系统软件的工作方式。当然这些也是和一些硬件的特性分不开的。

参考

《深入理解计算机系统》

《现代操作系统(原书第3版)》

动态随机存取存储器

动态随机存取存储器:

寄存器的速度为何比内存更快?

PC架构系列:CPU/RAM/IO总线的发展历史

内存核心频率、工作频率、预读技术详解