使用SharedMemory MMF实现快速.NET无锁进程

时间:2016-02-24 16:01:45

标签: c# multithreading performance ipc wait-free

我是multitaskingIPC的新手,我正在尝试使用共享内存构建快速进程间通信的方法(起初我正在研究IPC术语,考虑到{{1 }} wcfsockets最终只能发现MMF。)

现在我已经通过使用named pipesLock信令在两个进程之间使用共享内存成功实现了一个小测试,我采用了一种实现非阻塞/无等待模式的方法。现在,我正在尝试合并EventWaitHandle&从Thread.MemoryBarrier()读取signalling Sector

问题无法识别!第一轮通过,第二轮最后一个位于百慕大三角...超出了调试器的范围......

处理正在向{strong>进程进程b 发送一连串请求。

MemoryMapedFile

当我第一次使用命名的管道解决方案时,与命名管道方法相比,Mmf方法(尽管showMsg()和事件等待处理)是很好的性能提升,但我甚至可以去以某种方式进一步使用上述方法..?

我可以像条纹Raid一样克隆这个模式......

                                         //offset positions in mmf
MemoryMappedViewAccessor MmfAcc; const int opReady= 0, opCompleteRead = 4, .....



ReadTrd()
{
  //[0,3] - Reader is stationed
  //[4,7] - Read Complete successfully
  //[8,11] - Data-size 
  //[12,15] - Reader-exiting
  "format" the signals Section (write zeroes). 

   for(;;){if (WrTrd-StepMMF1  Confimed) break;}
  MmfAcc- read DataSize val @offset[8]
  MmfAcc- read Data val @offset[50]
  MmfAcc Write exit to offset....
  ....heavy use of  Thread.MemoryBarrier(); sets !!! (all over the place, on every shared variable...)

}

writeTrd()
{
  heavy use of  Thread.MemoryBarrier() !!!
  //[15-19] - wr is stationed
  //[20-23] - wr Complete successfully
  //[24-27] - wrExiting
  "format" the signals Section . 
   for(;;){if Reader-StepMMF1 is Confim break;}
   MmfAcc- DataSize to offset[8]
   write Data To offset[50] using the method below
   for(;;){if Read StepMMF2 is Confim break;}
 } 

所以我试了一下,然后陷入了困境。

这种有效的方法是使用全存储器吗? sharedmemory for signaling?

如果是这样,剩下的就是看第二次迭代失败的原因,即性能差异。

编辑 - 添加额外线程测试背后的逻辑

这是" Bridge"我正在使用操作编写器线程(读者使用相同的方法。

Lock

使用写句柄读取&写实际数据(类似的写代码)

Reader1 + Reader2 & WriteThred1  + WriteThread2

正如我所说,我已经通过非阻塞/无等待/等等研究了数据和共享内存的同步问题。信号量锁,所以我试图在每次数据事务处理过程中删除任何类型的开销进入共享内存映射文件。我在这里问一下,消除Lock和EventWaitHandle并将其替换为内存栅栏的逻辑并通过mmf发出信号可能是什么问题?

1 个答案:

答案 0 :(得分:0)

如果您计划将此用于R& D以外的特定用途,最简单的方法是使用已提供该功能的库。考虑这个的一种方法是,Lock Free = Message Passing。两种可能的方法是:对于简约的消息传递实现,ZeroMQ IPC,提供出色的.Net支持和卓越的IPC性能(http://www.codeproject.com/Articles/488207/ZeroMQ-via-Csharp-Introduction),以及更完整的Actor-Model实现(包括对IPC的支持),看起来在Akka.net(http://getakka.net/docs/#networking)。

如果目的本质上是更多R& D(意思是,想要编写自己的实现,这很酷),我仍然建议查看这些产品的来源(特别是,Akka.net,因为它是用C#编写的,用于实现关于消息传递和基于Actor的IPC的想法。

相关问题