我正在写一个程序,对于业绩原因而使用共享存储器(卯和管道作为替代办法进行了评估,以及他们是不是足够快的我的任务,一般来说任何IPC方法,涉及到份太慢)。在共享存储器区,我写了许多结构的一个固定的尺寸。有一个程序负责编写的构成共享存储器和多的客户,从中读取。然而,有一个成员的每一个的结构,客户需要写信给(基准计,他们将更新的原子).所有其他成员应该只读到的客户。

因为客户需要改变,一个成员,他们不能地共享内存的区域为只读。但他们不应该修修补补的其他成员,并且由于这些节目是用C++编写、存储腐败是可能的。理想的情况下,应该尽可能难以对一个客户崩溃的另一个。我只是担心车的客户,而不是恶意的人,所以不完美的解决方案是被允许的。

我可以试图阻止的客户复盖通过声明的成员在标题,他们作为使用常数,但这不会阻止记忆腐败(缓冲区溢出,糟糕的演员,等等。) 从复盖。我可以插入 金丝雀, 但是我必须不断支付费的检查。

而不是储存的参考数成员是直接的,我可以存储指实际数据在一个单独的映射写的只有一页,同时保持结构在只读映页。这将工作,操作系统将军我应用程序的崩溃,如果我尝试写的指的数据,但是间接的储存,可以不时要写 锁免费的算法, 因为需要遵循的另一个级别的间接性可以更改的东西是否可以完成原子

是否有任何方式的标记规模较小的地区的存储这样,他们写,将导致应用到打击?一些有硬件平台观察点,也许我能活那些与内联会,但我被限制到只有4个在时间上的32位x86和每一个只能复盖的一部分的结构,因为它们局限于4个字节。它还使我的程序痛苦的调试;)

编辑:我找到了 这一相当令人叹为观止的纸, 但不幸的是,它要求使用ECC存和改进Linux内核。

有帮助吗?

解决方案

我不认为它可能使几位只读象,在操作系统的水平。

有一件事发生我只是现在是你可以把基准计算在不同的网页喜欢你的建议。如果该结构是一个共同的大小,都在顺序存地点可以使用的指针算找到一个参考数从结构指针,而不是具有内的指针的结构。这可能比具有一个针对你的使用情况。

long *refCountersBase;//The start address of the ref counters page
MyStruct *structsBase;//The start address of your structures page

//get address to reference counter
long *getRefCounter(MyStruct *myStruct )
{
    size_t n = myStruct - structsBase;
    long *ref = refCountersBase + n;
    return ref;
}

其他提示

你会需要增加一个信号处理"SIGSEGV"恢复从例外,但仅限于某些地址。起始点可能是 http://www.opengroup.org/onlinepubs/009695399/basedefs/signal.h.html 和相应的文档系统。

编辑: 我相信你想要的是执行写入和返回,如果所写的地址是实际上"确定",结尾呼叫前一例外处理程序(指你的时候你安装的例外处理程序),如果你想传播的例外。我没有经历过这些事情虽然。

我从来没有听说过执行的只读在不超过一页粒度,这样你可能会走运在那个方向,除非你能把每一结构在两个页面。如果你能得到两个网页每结构你可以把ref计一个网页,并使其他的只读。

你可以写一API而不是仅仅使用的标题。迫使客户使用API将消除最腐败的问题。

保持数据的参考数,而不是在一个不同的网页将有助于地方的数据,并因此提高高速缓存的性能。

你需要考虑的一个读者可以有一个问题,无法正确地更新它的参考计数。也是作家可能无法完成更新。应对与这些事情需要额外的检查。你可以将这种检查与API。这可能是值得尝试,以测量的业绩的影响的一些种类的完整性检查。它可能足够快,以保持一个检验和,一些简单的adler32.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top