我读这个优秀的文章,其给出了一个介绍异步编程这里http://krondo.com/blog/?p=1209和我遇到下面这行,我觉得很难理解来了.
由于没有实际的并行性(在asnyc中),从我们的图中可以看出,异步程序与同步程序执行的时间一样长,可能更长,因为异步程序可能表现出较差的引用局部性.
有人可以解释一下这里的参考地点是如何形成的吗?
与维基百科文章提到的一样,参考地点是观察到当访问某些数据时(在磁盘上,在内存中,无论如何),通常也会访问该位置附近的其他数据.这种观察是有道理的,因为开发人员倾向于将类似的数 由于数据是相关的,因此它们经常被一起处理.具体而言,这被称为空间局部性.
对于一个弱的例子,想象一下计算数组的总和或进行矩阵乘法.表示数组或矩阵的数据通常存储在连续的存储器位置中,对于此示例,一旦访问存储器中的某个特定位置,您也将访问与其接近的其他位置.
计算机体系结构考虑了参考的局部性.操作系统具有"页面"的概念,它是(大致)4KB数据块,可以单独分页(在物理内存和磁盘之间移动).当你触摸一些不驻留的内存(不是物理上在RAM中)时,操作系统会将整个数据页从磁盘上移到内存中.原因是地方性:您可能会触及您刚触及的其他数据.
此外,CPU具有缓存的概念.例如,CPU可能具有L1(1级)高速缓存,这实际上只是CPU可以比RAM访问速度快的CPU数据块.如果值在L1高速缓存中,则CPU将使用该值而不是外出到RAM.遵循引用局部性的原则,当CPU访问主存储器中的某个值时,它会将该值及其附近的所有值带入L1高速缓存.这组值称为缓存行.高速缓存行大小不等,但问题是,当你访问一个数组的第一个值时,CPU可能需要从RAM得到它,但随后的访问(接近接近)会因为CPU所带来的整捆更快值在第一次访问时进入L1缓存.
所以,回答你的问题:如果你想象一个同步过程计算一个非常大的数组的总和,它将依次触摸内存位置.在这种情况下,你的地方是好的.但是,在异步情况下,您可能会有n每个线程都占用一个数组(大小)1/n并计算子和.每个线程正在触及存储器中可能非常不同的位置(因为阵列很大),并且由于每个线程可以切换进出执行,因此从OS或CPU的角度来看,实际的数据访问模式很差.CPU上的L1缓存是有限的,因此如果线程1引入缓存行(由于访问),这可能会驱逐线程2的缓存行.然后,当线程2访问其数组值时,它必须转到RAM,它将再次引入其缓存行并可能驱逐线程1的缓存行,依此类推.根据系统资源和整体使用情况,此模式也可能在OS /页面级别上发生.