2011-09-21 91 views
0

在多核系统(例如2,4,8核)中,我们通常使用互斥锁和信号量来访问共享内存。但是,我可以预见,这些方法会为未来具有多个内核的系统带来很高的开销。有没有其他方法可以更好地为将来的许多核心系统访问共享内存。在许多核心系统中如何访问共享内存

回答

2

我不确定将来你想走多远。但是从长远来看,我们现在所知道的共享内存(任何内核都可以访问的单个地址空间)是不可扩展的。因此,编程模型将不得不在某些时候改变,让程序员的生活变得更加艰难,就像我们进入多核时一样。

但是现在(也许再过10年),你可以逃避事务内存和其他硬件/软件技巧。

从长远来看,我说共享内存不可扩展的原因仅仅是由于物理原因。 (类似于单核/高频如何击中障碍)

总之,晶体管不能缩小到小于原子的大小(禁止使用新技术),并且信号传播速度不能超过光速。因此,内存将变得越来越慢(相对于处理器),并且在某些时候,共享内存变得不可行。

我们现在可以在多套接字系统上看到NUMA的效果。大型超级计算机既不共享内存,也不兼容缓存。

6

Transactional memory就是这样一种方法。

+0

但它很慢,不是吗?那里最快的实施是什么? – MetallicPriest

+1

此页面也可能有助于获得更多信息:http://www.haskell.org/haskellwiki/Software_transactional_memory –

+0

@MetallicPriest - 它目前速度较慢,但​​这似乎部分归因于核心数量较少,但是,锁定方法,以及它是多么新,它仍然可能是目前最好的方法。 –

0

1)只锁定你正在访问的内存部分,而不是整个表!这是在大型哈希表的帮助下完成的。桌子越大,锁定机制越好。 2)如果可以,只锁定写入,而不是读取(这要求在更新时读取“先前值”时没有问题,这通常是有效的情况)。

0

在任何多处理器/内核/线程应用程序同步中访问最低级别的共享内存取决于总线锁定。这样的锁可能会导致数百个(CPU)等待状态,因为它还包含锁定那些具有总线主控设备(包括DMA)的I/O总线。理论上可以设想一个中级锁,当程序员确定存储区被锁定时不会受到任何I/O总线的影响时,可以调用该锁。这样的锁定会更快,因为它只需要将CPU缓存与主存储器同步快速,至少与最慢的I/O总线的延迟相比。一般来说,程序员是否有能力决定何时使用哪种总线锁定令其令人担忧的主要可行性影响。这种锁也可能需要其自己的专用外部引脚与其他处理器同步。

在多处理器Opteron系统中,每个处理器都有自己的内存,它成为所有安装的处理器可以“看到”的整个内存的一部分。试图访问内存的处理器将被连接到另一个处理器上,透明地通过高速互连总线(称为HyperTransport)向负责该内存的处理器(NUMA概念)完成访问(尽管速度更慢)。只要处理器及其内核与物理连接的内存一起工作,处理速度就会很快。另外,许多处理器都配备了几条外部存储器总线,以增加其整体存储器带宽。

在Opteron系统上可以使用HyperTransport互连来实现理论中级锁定。

至于任何可预见的未来,锁定尽可能少且时间尽可能短的经典方法是,通过实现锁定到位时使用的高效算法(以及相关的数据结构)仍然成立。