使用用户模式和内核之间共享内存的慢速通信
Slow communication using shared memory between user mode and kernel
我正在Windows内核中运行一个线程,该线程通过共享存储器与应用程序通信。一切正常,除了由于睡眠循环而沟通缓慢。我一直在调查旋转锁,静音和互锁的旋转锁,但无法真正弄清楚。我还考虑了Windows事件,但不知道该事件的性能。请建议什么是一个更快的解决方案,以使沟通能否超越共享记忆可能暗示Windows事件。
内核代码
typedef struct _SHARED_MEMORY
{
BOOLEAN mutex;
CHAR data[BUFFER_SIZE];
} SHARED_MEMORY, *PSHARED_MEMORY;
ZwCreateSection(...)
ZwMapViewOfSection(...)
while (TRUE) {
if (((PSHARED_MEMORY)SharedSection)->mutex == TRUE) {
//... do work...
((PSHARED_MEMORY)SharedSection)->mutex = FALSE;
}
KeDelayExecutionThread(KernelMode, FALSE, &PollingInterval);
}
应用程序代码
OpenFileMapping(...)
MapViewOfFile(...)
...
RtlCopyMemory(&SM->data, WriteData, Size);
SM->mutex = TRUE;
while (SM->mutex != FALSE) {
Sleep(1); // Slow and removing it will cause an infinite loop
}
RtlCopyMemory(ReadData, &SM->data, Size);
更新1 目前,这是我提出的最快解决方案:
while(InterlockedCompareExchange(&SM->mutex, FALSE, FALSE));
但是,我发现您需要进行交流很有趣,并且没有比较的功能。
您不想使用InterlockedCompareexchange。它燃烧CPU,使另一个线程共享该物理核心可能需要的核心资源饱和,并且可以饱和。
您确实需要做两件事:
1)编写InterlockedGet
功能并使用它。
2)防止循环燃烧CPU资源,并在最终被封锁时将所有错误预测分支的母亲带走。
对于1,众所周知,这在所有支持InterlockedCompareExchange
的编译器上都可以使用,至少上次我检查:
__inline static int InterlockedGet(int *val)
{
return *((volatile int *)val);
}
为2,将其作为等待循环的主体:
__asm
{
rep nop
}
对于x86 cpu,这是为解决资源饱和度和分支预测问题的指定。
将其放在一起:
while ((*(volatile int *) &SM->mutex) != FALSE) {
__asm
{
rep nop
}
}
如果不合适,请根据需要更改int
。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 进程间通信堆内存
- 使用用户模式和内核之间共享内存的慢速通信
- VC++和Qt应用程序之间使用共享内存进行通信
- 进程间通信 -- 在共享内存中锁定互斥体
- 使用匿名管道是否为线程间通信引入了内存屏障
- Boost::asio,共享内存和进程间通信
- 使用通信器进行远程内存访问
- 共享内存进程间通信
- Java -> C++ 使用 SWIG over JNI 的通信。防止C++错误和内存泄漏