我正在阅读有关MESI snooping缓存一致性协议的内容,我想这是现代多核x86处理器中使用的协议(如果我错了,请纠正我).现在那篇文章在一个地方说了这个.
保持处于Modified状态的行的高速缓存必须窥探(拦截)相应主存储器位置的所有尝试读取(来自系统中的所有其他高速缓存)并插入其保存的数据.这通常通过强制读取(即稍后重试),然后将数据写入主存储器并将高速缓存行更改为共享状态来完成.
现在我不明白为什么数据需要写在主存中.无法缓存一致性只是保持缓存中的内容同步而不进入内存(除非缓存行真的被逐出)?我的意思是如果一个核心不断读取而另一个核心不断写入,为什么不将数据保存在缓存中,并不断更新缓存中的数据.为什么会产生写回主存的性能?
换句话说,读取数据的核心是不是可以直接从写入核心的缓存中读取并相应地修改它们的缓存?
我有一个应用程序,它定期(在每1或2秒后)通过分叉来获取检查点.因此,检查点是原始进程的一个分支,只有在原始进程发生某些错误时才会被要求启动,它才会保持空闲状态.
现在我的问题是fork的copy-on-write机制有多昂贵.每当原始进程写入内存页时(第一次在获取检查点之后)将发生页错误陷阱的成本,因为写时复制机制将确保它给原始进程a与检查点不同的物理页面.
在我看来,页面错误陷阱的开销可能是因为发生中断时相当高,我们从用户空间的土地到内核空间耕地的土地,然后再从内核到用户空间.我可以从这样的页面错误陷阱中丢失多少CPU周期.假设RAM足够大,我们不需要交换到硬盘.
我知道很难想象一个检查点方案比这更有效,因此你可以说为什么我担心页面陷阱错误开销,但我只是想知道这个方案会有多少成本.
我有几个.c文件和一个.a目标文件.我应该使用gcc命令将它们编译为一个exe文件?如果我们使用makefile,它会是什么样子?
我已经使用conf.set("spark.rdd.compress","true")和压缩RDD了persist(MEMORY_AND_DISK_SER).使用Kryo序列化会使程序更高效,还是在这种情况下没用?我知道Kryo用于以更有效的方式在节点之间发送数据.但是,如果已传输的数据已经压缩,是否需要?
llvm-ld和llvm-link有什么区别?我想llvm-ld执行链接时间优化,而llvm-link则不行.我对吗?
当不同的变量位于同一个缓存行中时,您可能会遇到错误共享,这意味着即使两个不同的线程(在不同的核心上运行)正在访问两个不同的变量,如果这两个变量位于同一个缓存行中,您将拥有性能命中,因为每次都会触发缓存一致性.
现在说这些变量是原子变量(通过原子我的意思是引入内存栅栏的变量,比如atomic<t>C++),会在那里假共享物质,或者原子变量是否在同一个缓存行中并不重要,如据说他们无论如何都会引入缓存一致性.换句话说,将原子变量放在同一个缓存行中会使应用程序变慢而不是将它们放在同一个缓存行中吗?
我试图了解Linux如何启动程序.我在某处读到glibc中的某些函数调用main函数.使用callgrind进行分析并查看Kcachegrind中的调用图,我看到below main哪些调用main.但是我不明白这个,一个函数不能这样命名.所以我的问题是glibc中的哪个函数实际上启动了main函数.
我使用以下代码启动一个线程.
t = thread.start_new_thread(myfunction)
Run Code Online (Sandbox Code Playgroud)
我怎么t能从另一个线程中杀死线程.所以基本上在代码方面,我希望能够做到这样的事情.
t.kill()
Run Code Online (Sandbox Code Playgroud)
请注意,我使用的是Python 2.4.
对于由类表示的LLVM基本块,BasicBlock如何识别哪个最近的循环(如果有)包含该块.我希望在runOnModule传球中识别出这一点.
我有一个非常大的只读数据,我希望同一节点上的所有执行程序都能使用.这可能在Spark中.我知道,你可以广播变量,但是你可以广播真正的大数组.在引擎盖下,它是否在同一节点上的执行程序之间共享数据?这如何能够在同一节点上运行的执行程序的JVM之间共享数据?