近日麻省理工学院科研团队发布了最新编程语言milk,新的程序语言在大数据方面能实现比现有语言快四倍的处理速度。

在传统的计算机中,微处理器安装在一个小的电路板上,其底部有一个电导线。这个芯片会嵌在电脑的主板上,以使数据在处理器和电脑的主要存储库之间穿梭。

本篇文章系统的给大家讲述linux操作系统原理,这是一篇非常好的linux系统基础教程,我们总结了相关的全部精选内容,一起来学习下。

在当下的计算机芯片中,内存管理是基于计算机科学家所称的局部性原理(principle
of locality)来实现的:

随着处理器晶体管数量的增加,处理器和主存储器之间的相对缓慢的连接已经成为提高计算机性能的主要障碍。因此,在过去的几年里,芯片制造商开始将传统上作为主存储器的动态随机存取存储器封装在芯片上。

linux操作系统原理文字版

一.计算机经历的四个时代

1.第一代:

真空管计算机,输入和输出:穿孔卡片,对计算机操作起来非常不便,做一件事可能需要十几个人去共同去完成,年份大概是:1945-1955。而且耗电量特别大,如果那个时候你家里有台计算机的话,可能你一开计算机你家的电灯泡亮度就会变暗,哈哈~

2.第二代:

晶体管计算机,批处理(串行模式运行)系统出现。相比第一台省电多了。典型代表是Mainframe。年份大概是:1955-1965。在那个年代:Fortran语言也就诞生啦~一门非常古老的计算机语言。

3.第三代:

集成电路出现,多道处理程序(并行模式运行)设计,比较典型的代表就是:分时系统(把CPU的运算分成了时间片)。年份大概是:1965-1980年左右。

4.第四代:

PC机出现,大概是从:1980年左右。相信这个时代典型人物代表:比尔盖茨,乔布斯。

二.计算机的工作体系

虽然说计算机经过了四个时代的演变,但是到今天为止,计算机的工作体系还是比较简单的。一般而言,我们的计算机有五大基本部件。

js金沙官网登入,1.MMU(内存控制单元,实现内存分页【memory page】)

运算机制被独立在CPU(计算控制单元)上,在CPU当中有一个独特的芯片叫MMU。他是用来计算进程的线线地址和物理地址的对应关系的。它还用于访问保护的,即一个进程先要访问到不是它的内存地址,是会被拒绝的!

2.存储器(memory)

3.显示设备(VGA接口,显示器等等)【属于IO设备】

4.输入设备(keyboard,键盘设备)【属于IO设备】

5.硬盘设备(Hard dish control ,硬盘控制器或适配器)【属于IO设备】

扩充小知识:

                          js金沙官网登入 1

这些硬件设备在一条总线上链接,他们通过这条线进行数据交互,里面的带头大哥就是CPU,拥有最高指挥权。那么它是如何工作的呢?

A.取指单元(从内存中取得指令);

B.解码单元(完成解码[讲内存中取到的数据转换成CPU真正能运行的指令]);

C.执行单元(开始执行指令,根据指令的需求去调用不同的硬件去干活。);

我们通过上面知道了MMU是CPU的一部分,但是CPU有还要其他的部件吗?当然是有的啦,比如指令寄存器芯片,指令计数器芯片,堆栈指针。

指令寄存器芯片:就是CPU用于将内存中的数据取出来存放的地方;

指令计数器芯片:就是CPU为了记录上一次在内存中取数据的位置,方便下一次取值;

堆栈指针:CPU每次取完指令后,就会把堆栈指针指向下一个指令在内存中的位置。

他们的工作周期和CPU是一样快的速度,跟CPU的工作频率是在同一个时钟周期下,因此他的性能是非常好的,在CPU内部总线上完成数据通信。指令寄存器芯片,指令计数器芯片,堆栈指针。这些设备通常都被叫做CPU的寄存器。

寄存器其实就是用于保存现场的。尤其是在时间多路复用尤为明显。比如说CPU要被多个程序共享使用的时候,CPU经常会终止或挂起一个进程,操作系统必须要把它当时的运行状态给保存起来(方便CPU一会回来处理它的时候可以继续接着上次的状态干活。)然后继续运行其他进程(这叫计算机的上下文切换)。

三.计算机的存储体系。

1.对称多处理器SMP

CPU里面除了有MMU和寄存器(接近cpu的工作周期)等等,还有cpu核心,正是专门处理数据的,一颗CPU有多个核心,可以用于并行跑你的代码。工业上很多公司采用多颗CPU,这种结构我们称之为对称多处理器。

2.程序局部性原理

空间局部性:

程序是由指令和数据组成的。空间局部性指的是一个数据被访问到之后,那么离这个数据很近的其他数据随后也可能会被访问到。

时间局部性:

一般而言当一个程序执行完毕后,可能很快会被访问到。数据也是同样的原理,一个数据的被访问到,很可能会再次访问到。

正是因为程序局部性的存在,所以使得无论是在空间局部性或者时间的局部性的角度来考虑,一般而言我们都需要对数据做缓存。

扩充小知识:

由于CPU内部的寄存器存储的空间有限,于是就用了内存来存储数据,但是由于CPU和速度和内存的速度完全不在一个档次上,因此在处理的数据的时候回到多数都在等(CPU要在内存中取一个数据,cpu转一圈的时间就可以处理完,内存可能是需要转20圈)。为了解决使得效率更加提高,就出现了缓存这个概念。

既然我们知道了程序的局部性原理,有知道了CPU为了获得更多的空间其实就是用时间去换空间,但是缓存就是可以直接让cpu拿到数据,节省了时间,所以说缓存就是用空间去换时间

3.就算进存储体系

                                js金沙官网登入 2

工作时间就的朋友可能见过磁带机,现在基本上都被OUT了,企业很多都用机硬盘来替代磁带机了,所以我们这里就从我们最熟悉的家用电脑的结构来说,存下到上一次存储数据是不一样。我们可以简单举个例子,他们的周存储周期是有很大差距的。尤为明显的是机械硬盘和内存,他们两个存取熟读差距是相当大的。

扩充小知识:

相比自己家用的台式机或是笔记本可能自己拆开过,讲过机械式硬盘,固态硬盘或是内存等等。但是可能你没有见过缓存物理设备,其实他是在CPU上的。因此我们对它的了解可能会有些盲区。

先说说一级缓存和耳机缓存吧,他们的CPU在这里面取数据的时候时间周期基本上查不了多少,因一级缓存和二级缓存都在CPU核心内部资源。(在其他硬件条件相同的情况下。一级缓存128k可能市场价格会买到300元左右,、一级缓存256k可能会买到600元左右,一级缓存512k可能市场价格就得过四位数这个具体价格可以参考京东啊。这足以说明缓存的造价是非常高的!)这个时候你可能会问那三级缓存呢?其实三级缓存就是就是多颗CPU共享的空间。当然多颗cpu也是共享内存的。

                          js金沙官网登入 3

4.非一致性内存访问(NUMA)

我们知道当多颗cpu共享三级缓存或是内存的时候,他们就会出现了一个问题,即资源征用。我们知道变量或是字符串在内存中被保存是有内存地址的。他们是如何去领用内存地址呢?我们可以参考下图:

js金沙官网登入 4

没错,这些玩硬件的大牛们将三级缓存分割,分别让不同的CPU占用不同的内存地址,这样我们可以理解他们都有自己的三级缓存区域,不会存在资源抢夺的问题,但是要注意的是他们还是同一块三级缓存。就好像北京市有朝阳区,丰台区,大兴区,海淀区等等,但是他们都是北京的所属地。我们可以这里理解。这就是NUMA,他的特性就是:非一致性内存访问,都有自己的内存空间。

扩展小知识:

那么问题来了,基于重新负载的结果,如果cpu1运行的进程被挂起,其地址在他自己的它的缓存地址是有记录的,但是当cpu2再次运行这个程序的时候被CPU2拿到的它是如何处理的呢?

这就没法了,只能从CPU1的三级换粗区域中复制一份地址过来一份或是移动过来一份让CPU2来处理,这个时候是需要一定时间的。所以说重新负载均衡会导致CPU性能降低。这个时候我们就可以用进程绑定来实现,让再次处理该进程的时候还是用之前处理的CPU来处理。即进程的CPU的亲缘性。

5.缓存中的通写和回写机制。

     js金沙官网登入 5

CPU在处理数据的地方就是在寄存器中修改,当寄存器没有要找的数据是,就会去一级缓存找,如果一级缓存中没有数据就会去二级缓存中找,依次查找知道从磁盘中找到,然后在加载到寄存器中。当三级缓存从内存中取数据发现三级缓存不足时,就会自动清理三级缓存的空间。

我们知道数据最终存放的位置是硬盘,这个存取过程是由操作系统来完成的。而我们CPU在处理数据是通过两种写入方式将数据写到不同的地方,那就是通写(写到内存中)和回写(写到一级缓存中)。很显然回写的性能好,但是如果断电的话就尴尬了,数据会丢失,因为他直接写到一级缓存中就完事了,但是一级缓存其他CPU是访问不到的,因此从可靠性的角度上来说通写方式会更靠谱。具体采用哪种方式得你自己按需而定啦。

四.IO设备

1.IO设备由设备控制器和设备本身组成。

设备控制器:集成在主板的一块芯片活一组芯片。负责从操作系统接收命令,并完成命令的执行。比如负责从操作系统中读取数据。

设备本身:其有自己的接口,但是设备本身的接口并不可用,它只是一个物理接口。如IDE接口。

扩展小知识:

每个控制器都有少量的用于通信的寄存器(几个到几十个不等)。这个寄存器是直接集成到设备控制器内部的。比方说,一个最小化的磁盘控制器,它也会用于指定磁盘地址,扇区计数,读写方向等相关操作请求的寄存器。所以任何时候想要激活控制器,设备驱动程序从操作系统中接收操作指令,然后将它转换成对应设备的基本操作,并把操作请求放置在寄存器中才能完成操作的。每个寄存器表现为一个IO端口。所有的寄存器组合称为设备的I/O地址空间,也叫I/O端口空间,

2.驱动程序

真正的硬件操作是由驱动程序操作完成的。驱动程序通常应该由设备生产上完成,通常驱动程序位于内核中,虽然驱动程序可以在内核外运行,但是很少有人这么玩,因为它太低效率啦!

3.实现输入和输出

设备的I/O端口没法事前分配,因为各个主板的型号不一致,所以我们需要做到动态指定。电脑在开机的时候,每个IO设备都要想总线的I/o端口空间注册使用I/O端口。这个动态端口是由所有的寄存器组合成为设备的I/O地址空间,有2^16次方个端口,即65535个端口。

js金沙官网登入 6

如上图所示,我们的CPU有要想跟指定设备打交道,就需要把指令传给驱动,然后驱动讲CPU的指令转换成设备能理解的信号放在寄存器中(也可以叫套接字,socket).所以说寄存器(I/O端口)是CPU通过总线和设备打交道的地址(I/O端口)。

扩展小知识:

三种方式实现I/O设备的输入和输出:

A..轮询:

通常指的是用户程序发起一个系统调用,内核将其翻译成一个内核对应驱动的过程调用,然后设备驱动程序启动I/O,并在一个连续循环不断中检查该设备,并看该设备是否完成了工作。这有点类似于忙等待(就是cpu会用固定周期不断通过遍历的方式去查看每一个I/O设备去查看是否有数据,
显然这种效率并不理想。),

B..中断:

中断CPU正在处理的程序,中断CPU正在执行的操作,从而通知内核来获取中断请求。在我们的主板通常有一个独特的设备,叫做可编程中断控制器。这个中断控制器可以通过某个针脚和CPU直接进行通信,能够出发CPU发生某个位置偏转,进而让CPU知道某个信号到达。中断控制器上会有一个中断向量(我们每一个I/O设备在启动时,要想中断控制器注册一个中断号,这个号通常是唯一的。通常中断向量的每一个针脚都是可以识别多个中断号的),也可以叫中断号。

因此当这个设备真正发生中断时,这个设备不会把数据直接放到总线上,这个设备会立即向中断控制器发出中断请求,中断控制器通过中断向量识别这个请求是哪个设备发来的,然后通过某种方式通知给CPU,让CPU知道具体哪个设备中断求情到达了。这个时候CPU可以根据设备注册使用I/O端口号,从而就能获取到设备的数据了。(注意,CPU是不能直接取数据的哟,因为他只是接收到了中断信号,它只能通知内核,让内核自己运行在CPU上,由内核来获取中断请求。)举个例子,一个网卡接收到外来IP的请求,网卡也有自己的缓存区,CPU讲网卡中的缓存拿到内存中进行去读,先判断是不是自己的IP,如果是就开始拆报文,最后会获取到一个端口号,然后CPIU在自己的中断控制器去找这个端口,并做相应的处理。

内核中断处理分为两步:中断上半部分(立即处理)和中断下半部分(不一定)。还是从网卡接收数据为例,当用户请求到达网卡时,CPU会命令讲网卡缓存区的数据直接拿到内存中来,也就是接收到数据后会立即处理(此处的处理就是将网卡的数据读到内存中而已,不做下一步处理,以方便以后处理的。),这个我们称之为中断的上半部分,而后来真正来处理这个请求的叫做下半部份

C.DMA:

直接内存访问,大家都知道数据的传输都是在总线上实现的,CPU是控制总线的使用者,在某一时刻到底是有哪个I/O设备使用总线是由CPU的控制器来决定的。总线有三个功能分别是:地址总线(完成对设备的寻址功能),控制总线(控制各个设备地址使用总线的功能)以及数据总线(实现数据传输)。

通常是I/O设备自带的一个具有智能型的控制芯片(我们称之为直接内存访问控制器),当需要处理中断上半部分时,CPU会告知DMA设备,接下来总线归DMA设备使用,并且告知其可以使用的内存空间,用于将I/O设备的数据读取到内存空间中去。当DMA的I/O设备将数据读取完成后,会发送消息告诉CPU以及完成了读取操作,这个时候CPU再回通知内核数据已经加载完毕,具体中断下半部分的处理就来交个内核处理了。现在大多数设备都是用DMA控制器的,比如:网卡,硬盘等等。

五.操作系统概念

通过上面的学习,我们知道了的计算机有五大基本部件。操作系统主要就是把这五个部件给它抽象为比较直观的接口,由上层程序员或者用户直接使用的。那事实上在操作系统中被抽象出来的东西又该是什么呢?

1.CPU(time slice)

在操作系统中,CPU被抽象成了时间片,而后将程序抽象成进程,通过分配时间片让程序运行起来。CPU有寻址单元用于来识别变量在内存的中所保存的集体内存地址。

        js金沙官网登入 7

而我们主机内部的总线是取决于CPU的位宽(也叫字长),比如32bit的地址总线,它能表示2的32次方个内存地址,转换成10进制就是4G内存空间,这个时候你应该就明白为什么32位的操作系统中只能识别4G内存了吧?即使你的物理内存是16G,但是可用的还是4G,所以,你如果发现你的操作系统能识别4G以上的内存地址,那么你的操作系统一定就不是32位的啦!

2.内存(memory)

在操作系统中,内存的实现是通过虚拟地址空间来实现的。

3.I/O设备

在操作系统中,最核心的I/O设备就是磁盘,大家都知道磁盘是提供存储空间的,在内核中把它抽象成了文件。

4.进程

说白了,计算机存在的主要目的不就是运行程序吗?程序跑起来,我们统一叫进程(我们暂时不用理会线程)。那如果多个进程同时运行就意味着把这些有限的抽象资源(cpu,memory等等)分配给多个进程。我们把这些抽象资源统称为资源集。

资源集包括:

1>.cpu时间;

2>.内存地址:抽象成虚拟地址空间(如32位操作系统,支持4G空间,内核占用1G空间,进程也会默认自己有3G可用,事实上未必有3G空间,因为你的电脑可能会是小于4G的内存。)

3>.I/O:一切皆文件打开的多个文件,通过fd(文件描述符,file
descriptor)打开指定的文件。我们把文件分为三类:正常文件、设备文件、管道文件。

每一个进行都有自己作业地址结构,即:task
struct。其就是内核为每个进程维护的一个数据结构(一个数据结构就是用来保存数据的,说白了就是内存空间,记录着该进程所拥有的资源集,当然还有它的父进程,保存现场【用于进程切换】,内存映射等待)。task
struct模拟出来了线性地址,让进程去使用这些线性地址,但是它会记录着线性地址和物理内存地址的映射关系的。

5.内存映射-页框

只要不是内核使用的物理内存空间我们称之为用户空间。内核会吧用户空间的物理内存切割成固定大小的页框(即page
frame),欢聚话说,就是且更成一个固定大小的存储单位,比默认的单个存储单元(默认是一个字节,即8bit)要大.通常每4k一个存储单位。每一个页框作为一个独立的单元向外进行分配,且每一个页框也都其编号。【举个例子:假设有4G空间可用,每一个页框是4K,一共有1M个页框。】这些页框要分配给不同的进程使用。

我们假设你有4G内存,操作系统占用了1个G,剩余的3G物理内存分配给用户空间使用。每一进程启动之后,都会认为自己有3G空间可用,但是实际上它压根就用不完3G。进程进行写入内存是被离散存储的。哪有空余内存就往哪存取。具体的存取算法不要问我,我也没有研究过。

进程空间结构:

1>.预留空间

2>.栈(变量存放处)

3>.共享库

4>.堆(打开一个文件,文件中的数据流存放处)

5>.数据段(全局的静态变量存放处)

6>.代码段

进程和内存的存储关系如下:

js金沙官网登入 8

每个进程空间都有预留空间,当某个进程发现自己打开的数据已经不够用,它需要打开一个新文件(打开一个新文件就需要在进程的地址空间存放数据),很显然我们上图的进程地址空间是线性的并不是真正意义上的。当一个进程真正去申请使用一个内存时,需要向内核发起系统调用,由内核在物理内存上找一个物理空间,并告诉该进程可以使用的内存地址。比方说进程要在堆上打开一个文件,它需要向操作系统(内核)申请使用内存空间,且在物理内存允许的范围内(即请求的内存需要小于空闲物理内存),内核会分配给该进程内存地址。

每一进程都有自己想线性地址,这个地址是操作系统虚拟出来的,并不真实存在,它需要把这个虚拟地址和真正的物理内存做一个映射关系,如图“进程和内存的存储关系”,最终的进程数据的存放处位置还是映射到内存中了。这就意味着,当一个进行跑到CPU上执行时,它告诉CPU的是自己的线性地址,这时候CPU不会直接去找这个线性地址(因为线性地址是虚拟出来的,不真实存在,真正存放地址进程的是物理内存地址。),它会先去找这歌进程的“task
struct”,并装载页表(page
table)[记录着线性地址到物理内存的映射关系,每一个对应关系叫做一个页表项。],以读取到进程的所拥有的线性地址所对应的真正的物理内存地址。

扩展小知识:

CPU访问进程的地址时,首先获取到的是进程的线性地址,它将这个线性地址交给自己的芯片MMU进行计算,得到真正的物理内存地址,从而达到访问进程内存地址的目的。换句话说,只要他想要访问一个进程的内存地址,就必须经过MMU运算,这样导致效率很低,因此他们有引进了一个缓存,用于存放频繁访问的数据,这样就可以提高效率,不用MMU进行计算,直接拿到数据去处理就OK了,这个缓存器我们称之为:TLB:转换后援缓冲器(缓存页表的查询结果)

注意:在32bit的操作系统是线线地址到物理内存的映射。而在64bit操作系统是恰恰相反的!

6.用户态和内核态

操作系统运行时为了呢能够实现协调多任务,操作系统被分割成了2段,其中接近于硬件一段具有特权权限的叫做内核空间,而进程运行在用户空间当中。所以说,应用程序需要使用特权指令或是要访问硬件资源时需要系统调用。

只要是被开发成应用程序的,不是作为操作系统本身的一部分而存在的,我们称之为用户空间的程序。他们运行状态称之为用户态。

需要在内核(我们可以认为是操作系统)空间运行的程序,我们称之他们运行在内核空间,他们运行的状态为用户态,也叫核心态。注意:内核不负责完成具体工作。在内核空间可用执行任何特权操作。

每一个程序要想真正运行起来,它最终是向内核发起系统调用来完成的,或者有一部分的程序不需要内核的参与,有我们的应用程序就能完成。我们打个比方,你要计算2的32次方的结果,是否需要运行在内核态呢?答案是否定的,我们知道内核是不负责完成具体工作的,我们只是想要计算一个运算结果,也不需要调用任何的特权模式,因此,如果你写了一些关于计算数值的代码,只需要把这个代码交给CPU运行就可以了。

如果一个应用程序需要调用内核的功能而不是用户程序的功能的话,应用程序会发现自己需要做一个特权操作,而应用程序自身没有这个能力,应用程序会向内核发申请,让内核帮忙完成特权操作。内核发现应用程序是有权限使用特权指令的,内核会运行这些特权指令并把执行结果返回给应用程序,然后这个应用程序拿到特权指令的执行结果后,继续后续的代码。这就是模式转换。

因此一个程序员想要让你的程序具有生产力,就应该尽量让你的代码运行在用户空间,如果你的代码大多数都运行在内核空间的话,估计你的应用程序并不会给你打来太大的生产力哟。因为我们知道内核空间不负责产生生产力。

扩充小知识:

我们知道计算机的运行就是运行指定的。指令还分特权指令级别和非特权指令级别。了解过计算机的朋友可能知道X86的CPU架构大概分成了四个层次,由内之外共有四个环,被称为环0,环1,环2,环3。我们知道环0的都是特权指令,环3的都是用户指令。一般来讲,特权指令级别是指操作硬件,控制总线等等。

一个程序的执行,需要在内核的协调下,有可能在用户态和内核态互相切换,所以说一个程序的执行,一定是内核调度它到CPU上去执行的
。有些应用程序是操作系统运行过程当中,为了完成基本功能而运行的,我们就让他在后台自动运行,这叫守护进程。但是有的程序是用户需要的时候才运行的,那如何通知内核讲我们需要的应用程序运行起来呢?这个时候你就需要一个解释器,它能和操作系统打交道,能够发起指令的执行。说白了就是能够把用户需要的运行请求提交给内核,进而内核给它开放其运行所需要的有赖于的基本条件。从而程序就执行起来了。

下面我们在看推荐几本关于linux操作系统原理的书

如果一个程序需要某个内存位置的数据块,它可能也需要数据块临近位置的数据。

这种存储器是一种高容量缓存,能够快速地存储本地常用数据。但是DRAM从根本上不同于通常用于芯片缓存的内存类型,而且现有的缓存管理计划并没有有效地使用它。

linux操作系统原理电子书

js金沙官网登入麻省理工学院发布编程语言Milk,提升快四倍的处理速度。操作系统原理及应用(Linux)
PDF扫描版[30MB]

深度探索Linux操作系统:系统构建和原理解析
pdf扫描版[js金沙官网登入麻省理工学院发布编程语言Milk,提升快四倍的处理速度。129MB]

操作系统原理LINUX篇 徐德民
pdf

Linux内核注释 孙更新等
pdf扫描版(86M)

但是在大数据时代,这种假设已不再成立。如今的计算机程序更多地是在大型数据集中离散地获取一点点数据。由于从主要内存位中获取数据已成了当下芯片的最大性能瓶颈,所以不得不更加频繁地获取数据,这也明显拖慢了程序运行的速度。

在最近的IEEE/ACM国际微结构研讨会上,来自麻省理工学院、英特尔和苏黎世ETH的研究人员提出了一种新的缓存管理方案,该方案将内包DRAM缓存的数据速率提高了33%到50%。

linux操作系统视频内容

跟阿铭学Linux第二版最新版(附阿铭linux全套视频教程)chm格式

linux系统挂载数据盘的方法(视频图文教程)

以上就是我们给大家整理的关于linux操作系统原理
linux系统基础教程的全部内容,希望我们整理的内容能够给你提供到帮助。

本周在国际并行体系结构和编译技术会议(International Conference on
Parallel Architectures and Compilation
Techniques)上,来自麻省理工学院计算机科学与人工智能实验室的研究人员发布了一种新的编程语言——Milk,它能让应用程序开发者在处理大数据集里的离散数据点问题中更有效率地管理内存。

麻省理工学院计算机科学与人工智能实验室的博士后、及该论文的第一作者Xiangyao
Yu说:“这个封装的DRAM的带宽可能比非封装的DRAM高5倍。且事实证明,以前的缓存管理计划花费了太多的流量来访问元数据或移动数据,但却不是真正想要的数据,而且它们浪费了大量的带宽。”

通过测试几种通用的算法,使用新语言Milk编写的程序实现了比现有编程语言快4倍的速度。但是研究者相信通过更进一步的研究可以实现更好地结果。

缓存散列

电气工程和计算机科学教授Saman Amarasinghe
说,当下大数据集给已有的内存管理技术带来问题的原因不仅在于因为它们的规模巨大,更多的是因为它们是稀疏的。也就是说,问题解决方案的规模并不一定是与问题的规模成正比增加。

在现代计算机芯片中,当处理器需要特定的数据块时,它就会检查其本地缓存,以查看数据是否已经存在。这些缓存数据都会被标记其所来源数据的地址,即元数据。

“在社交环境中,我们通常倾向于注重更小的问题。”
Amarasinghe说“如果你只关注在这种建筑[CSAIL]内的人的话,你能发现我们都是朋友的。但是如果你以地球的层面来看待的话,朋友的数量并不会增加。整个地球有几十亿人口,但是我也仅仅只有几百个朋友。这就是一个很明显的稀疏性问题。”

一个典型的芯片缓存可能有足够的空间用于64000个数据项,且每个数据都会贴上元数据变迁。显然,一个处理器并不想每次都从64000个条目中搜索自己感兴趣的数据。因此,缓存系统通常使用所谓的“哈希表”来组织数据。当一个处理器使用特定的标签来寻找数据时,它首先将标签反馈给一个哈希函数,该函数以制定的方式处理,并产生一个新的数字,而这个数字正是用于指定数据表中所查找数据的位置。

js金沙官网登入麻省理工学院发布编程语言Milk,提升快四倍的处理速度。同样Amarasinghe提到,一个在线书店可能为其1000名顾客提供最流行的20本书籍的书单。但是但其顾客数增加到100万时,它并不会相应地提供最流行的20000本书籍的书单。

哈希函数的意义在于,非常相似的输入产生截然不同的输出。这样,即使处理器严重依赖于来自狭窄地址范围的数据,比如在一个大图像的一个部分执行复杂的操作,数据也会在缓存中间隔开来,这样就不会在单个位置造成数据阻塞。

js金沙官网登入麻省理工学院发布编程语言Milk,提升快四倍的处理速度。当下的计算机芯片并没有专门针对稀疏数据进行优化,而且可以说是完全相反。因为从芯片的主要内存位读取数据是缓慢的,当下的芯片中每个内核或者每个处理器都有自己的“缓存”,一个相关的小型、本地、高速的内存位。芯片中的内核会一次读取一个完整的数据块,而不是在主内存中每次提取一个单独的数据。而读取的数据块是通过局部性原理来进行选择的。

此外,哈希函数也可以为不同的输入产生相同的输出,即如果用户想处理各种可能的输入,正如缓存方案一样,那么就更有可能产生相同的输出。因此,缓存的哈希表通常会在相同的散列索引下存储两个或三个数据项,且搜索一个给定标记的两个或三个条目要比搜索64000条目便捷得多。

js金沙官网登入 9

DRAM和SRAM

通过图像处理的例子可以很容易看清局部性原理的本质:

DRAM和SRAM在标准缓存中使用的技术有哪些区别呢?SRAM对于其存储的每一个数据都会使用6个晶体管,而DRAM只使用一个,这意味着其空间效率更高。但SRAM有一些内置的处理能力,而DRAM则没有。如果处理器想要在SRAM缓存中搜索一个数据项,该处理器会将标签发送到缓存中,然后,SRAM电路本身将标签与存储在响应的散列位置的数据项标记进行对比,如果匹配,则返回相关数据。

如果一个程序的目的是将视觉过滤器应用到图像中,且它每次只作用在图像的一个数据块上。那么每次芯片内核请求一个区块数据时,它应该收到自身缓存能接受的所有临近区块数据。因此它可以一个一个区块处理,且不再获取更多的数据。

相比之下,DRAM支撑传输请求的数据。因此,处理器将请求存储在给定的散列位置的第一个标记,如果匹配则发送第二个请求以获取相关数据。如果不匹配,它将请求第二个存储标记,如果还不匹配,将发送给第三个,知道找到它想要的数据,或者放弃,然后进入主内存。

但是如果该算法的兴趣是在线书店200万数据库中的20本书的话,该方式将不再适用。如果它请求与某一本书相邻的数据,很有可能其相邻的100种书的数据都是没有关联的。

封装的DRAM可能有很多带宽,但这个过程会占用其带宽。Xiangyao
Yu及其同事通过对大多数现在芯片中内存管理系统的微小修改,从而避免了所有的元数据传输。

从主内存中每次只读取一个数据是非常低效的,这篇论文的第一作者Vladimir
Kiriansky 提到

js金沙官网登入麻省理工学院发布编程语言Milk,提升快四倍的处理速度。任何运行在计算机芯片上的程序都必须管理自己的内存使用,而且通常让程序像拥有袭击的专用内存存储一样方便。但实际上,多个程序通常同时运行在同一芯片上,他们同时将数据发送到主内存。因此,芯片中的每一个核心或处理单元通常都有一个表,将单个程序所使用的虚拟地址映射到存储在主内存中的数据的实际地址。

就像是每次你想要一勺食品时,你都需要打开冰箱、打开牛奶盒、倒出一勺牛奶、盖上牛奶盒、将它放回冰箱。

该新系统被称为Banshee,且在表格中的每个条目中添加了3
bits的数据。其中一个表示虚拟地址中的数据是否可以在DRAM缓存中找到,而另外两个则指示其位置相对于具有相同哈希索引的任何其他数据项。

他是电气工程和计算机科学的博士生。Amarasinghe 和 Yunming Zhang
是他的论文合作者,Zhang 也是一位电气工程和计算机科学的博士生。

Xiangyao
Yu表示:“在条目中,你需要有物理地址,虚拟地址,以及一些其他数据。而这些加起来已经差不多100
bits了。所以三个额外的bits已经是非常小的了。”

Milk简单地增加了一些命令到OpenMP中。其中OpenMP
是一种能够用在C或Fortran等语言中的扩展,可以用来更轻松地为多核处理器编写代码。使用Milk的话,程序员可以在任何指令附近插入几行代码,其可以在整个大数据集中进行迭代,寻找相对较少数量的项。Milk
的编译器可以据此找到管理内存的方法。

标记缓冲区

使用 Milk
程序时,如果一个内核发现它需要一项数据时,它并不会请求从主内存中读取它。它会将该数据的地址添加到一个本地存储的地址列表中。当这个列表足够长时

但这种方法存在一个问题,这也是Banshee必须解决的问题。如果一个芯片的核心将一个数据项拖放到DRAM缓存中,那么其他的内核就不知道了。每次向芯片内核发送消息时,每次更新缓存都会消耗大量的时间和带宽。因此,Banshee引入了另一个称为标记缓冲区的小电路,在那里,任何给定的核心都可以记录它缓存的数据项的新位置。

芯片所有内核将会池化它们的列表

任何核心的请求都通过标记缓冲区发送到DRAM缓存或主内存,这将检查所请求的标记是否已被重新映射。只有当缓冲区填满时,Banshee才会通知所有的芯片内核,它们需要更新其虚拟内存表。然后它清除缓冲区,并重新开始。

将这些地址按临近排布的形式组合到一起

缓冲区很小,只有5千字节,因此它的增加不会占用太多芯片内存。研究人员的仿真结果显示,每次内存访问所需的额外地址查找所需的时间与Banshee所节省的带宽相比是微不足道的。

这样一来,每个内核都只请求了自己所需要的数据项,并且可以有效地进行检索。

人工智能——2017年最火热的标签。对于众多AI试水者,你知道如何平衡技术与需求吗?你知道如何利用政策事半功倍吗?你知道如何寻找公司的投资伯乐吗?12月14日,「2017亿欧创新者年会·AI产业应用峰会」,我们将邀请众多投资人、创业者、AI领域精英共同探讨,不仅是AI+产业+应用,这里是需求方和技术提供方的沟通平台,是政策专家与企业方的交流平台,是投资人与企业方交流的互猎平台,是应届毕业生和企业方的对接平台。多维度,更深度,来这里实现属于你的AI!

这样描述的话层级较高,但实际上细节会复杂得多。事实上大部分现代计算机芯片都有多级缓存,且一级比一级大。Milk编译器不仅必须跟踪内存地址表,还要跟踪这些地址中存储的数据,而且它常常将这两者在各级缓存之间进行切换。它也必须决定哪些地址应当被保留,哪些应当被丢弃。研究学者希望能够进一步提升这种编排复杂数据的算法,从而进一步提升性能表现。

js金沙官网登入 10

更多精彩资讯请关注查字典新闻网,我们将持续为您更新最新资讯!

本文来源亿欧,经亿欧授权发布,版权归原作者所有。转载或内容合作请点击转载说明,违规转载法律必究。

相关文章