问题标签 [shared-memory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4254 浏览

go - Shared memory vs. Go channel communication

One of Go's slogans is Do not communicate by sharing memory; instead, share memory by communicating.

I am wondering whether Go allows two different Go-compiled binaries running on the same machine to communicate with one another (i.e. client-server), and how fast that would be in comparison to boost::interprocess in C++? All the examples I've seen so far only illustrate communication between same-program routines.

A simple Go example (with separate client and sever code) would be much appreciated!

0 投票
4 回答
1123 浏览

windows - 可以为多次调用 MapViewOfFileEx 回收地址空间而不会失败吗?

考虑一个在 Windows XP 上运行在 32 位地址空间内的复杂的、需要大量内存的多线程应用程序。

某些操作需要 n 个固定大小的大缓冲区,其中一次只需要访问一个缓冲区。

应用程序使用一种模式,其中一个缓冲区大小的一些地址空间被提前保留,并用于包含当前需要的缓冲区。

这遵循以下顺序:(初始运行)VirtualAlloc -> VirtualFree -> MapViewOfFileEx(缓冲区更改)UnMapViewOfFile -> MapViewOfFileEx

这里指向缓冲区位置的指针是通过调用 VirtualAlloc 提供的,然后在每次调用 MapViewOfFileEx 时使用相同的位置。

问题是windows(据我所知)不提供任何握手类型的操作来传递不同用户之间的内存空间。

因此,有一个小机会(在我上面的序列中的每个 -> 处)内存未锁定,另一个线程可以跳入并在缓冲区内执行分配。

对 MapViewOfFileEx 的下一次调用被中断,系统无法再保证地址空间中有足够大的空间用于缓冲区。

显然,重构以使用更小的缓冲区会降低重新分配空间的失败率。

HeapLock 的一些使用取得了一些成功,但这仍然存在问题 - 某些东西仍然设法从地址空间中窃取一些内存。(我们尝试调用 GetProcessHeaps 然后使用 HeapLock 锁定所有堆)

我想知道是否有锁定与 MapViewOfFileEx 兼容的特定地址空间块?

编辑:我应该补充一点,最终这段代码存在于一个库中,该库被我无法控制的应用程序调用

0 投票
4 回答
204 浏览

c# - 如何在 C# 中查询另一个正在运行的应用程序中的变量?

我有一个应用程序,它在启动时会检查自身的重复进程。

那部分我是对的 - 但我需要检查原始运行过程中的状态变量以运行一些逻辑。

那么:我如何让其他应用程序公开可用的变量(例如 bool),以便他们可以查询它?

0 投票
10 回答
80222 浏览

concurrency - 消息传递和共享内存并发模型有什么区别?

如果我错了,请纠正我,但我很惊讶以前没有在这里问过这个问题......

0 投票
3 回答
1038 浏览

c++ - C++:我什么时候需要 std::vector 的共享内存分配器?

第一层

我有一个用 VC++6 服务包 6 编写的 win32 dll。让我们将此 dll 称为 FirstLayer。我无权访问 FirstLayer 的源代码,但我需要从托管代码中调用它。问题是 FirstLayer 大量使用 std::vector 和 std::string 作为函数参数,并且无法将这些类型直接编组到 C# 应用程序中。

第二层

我能想到的解决方案是先创建另一个用VC++6 service pack 6编写的win32 dll。我们把这个dll称为“SecondLayer”。SecondLayer 充当 FirstLayer 的包装器。该层包含 std::vector 的包装类,因此 std::vector 不会在该层的所有函数参数中公开。我们将 std::vector 的这个包装类称为 StdVectorWrapper。

该层不使用任何新的或删除的操作来分配或释放内存,因为这是由 std::vector 内部处理的。

第三层

我还创建了一个 VC++2005 类库作为 SecondLayer 的包装器。这个包装器完成了将非托管 SecondLayer 转换为托管代码的所有繁琐工作。让我们将此层称为“ThirdLayer”。

与 SecondLayer 类似,该层在处理 StdVectorWrapper 时不使用 new 和 delete。

第四层

最重要的是,我创建了一个 C#2005 控制台应用程序来调用 ThirdLayer。让我们将此 C# 控制台应用程序称为“FourthLayer”。

调用序列摘要

第四层(C#2005) -> 第三层(VC++2005) -> 第二层(VC++6) -> 第一层(VC++6)

问题

我注意到“ System.AccessViolationException: Attempted to read or write protected memory ”异常被抛出,我怀疑这是由于 SecondLayer 的内部 std::vector 分配内存,这对于 ThirdLayer 访问是非法的。

我认为这得到了证实,因为当我在 VC++2005 中重新编译 FirstLayer(模拟)和 SecondLayer 时,问题完全消失了。但是,无法重新编译 FirstLayer 的生产版本,因为我没有源代码。

我听说为了摆脱这个问题,我需要在 C++ 中为在 StdVectorWrapper 类中找到的 SecondLayer 的 std::vector 编写一个共享内存分配器。我不完全理解为什么我需要一个共享内存分配器以及它是如何工作的?任何的想法?

互联网上是否有任何现成的源代码可以编译并与我在 SecondLayer 中的代码一起使用?

请注意,我无法为此使用 boost 库。

0 投票
2 回答
1582 浏览

c - 64位共享内存段C\linux问题

我正在寻找在 C\Linux 中使用共享内存段做一些 IPC。

我继续像往常一样创建它:

...

最后一行是它中断的地方,在编译时它只给出一个:

从我之前所做的代码在 32 位机器上完美运行(没有警告)(没有测试完全相同的代码,但相同),但是在我的 64 位上它在编译时给出了这个警告。

并在运行时出现段错误。从我所做的研究来看,我相信从 void* 转换为我的指针会使指针混乱,原因是 64 位。

有什么想法我可以解决这个问题吗?或者是什么原因造成的?

0 投票
2 回答
248 浏览

.net - 我该如何做这些 IPC 技术?

我记得在使用 C 和 win32 时,我有许多 IPC 技术。到目前为止,我还没有在 .NET 中遇到过它们中的任何一个,也没有在 C 之外看到它们,所以我想我想问我如何使用这些进程间通信技术?

  1. 共享/全局内存。只需分配可以由另一个进程更改而没有任何信号的 ram。

  2. 窗口消息。我记得使用 SendMessage 并使用 WM_USER + N 并在我触摸共享内存时告诉另一个应用程序,要求它更改文件或设置,有时还告诉其他应用程序我输入了一些击键来充当宏,因为我有时会感到懒惰。

  3. 动态数据交换。我尝试过,但永远无法让它发挥作用。据我所知(警告这可能是完全错误的),您将自己注册到全局消息或事件,另一个应用程序(通常是您的)将发送消息,这两个左右的应用程序可以相互通信,发布消息,您可以进行集成以这种方式在两个应用程序之间。我很想知道是什么取代了它。

还有一些我知道仍在使用和看到的命名管道。我记得人们推荐 IPC 的套接字,但我从不喜欢这样做,我知道它仍然存在并且可以在需要时使用。

我还想念什么,是什么取代了这种技术?我知道有很酷的全局互斥锁。我仍在寻找一种在两个应用程序之间发送消息的现代方式(第 2 点)。我一直想知道是否存在某种不在管道中的 FIFO 队列。就像 Windows 消息一样,除了我可以推送数据(如 1k)而不是每次发送消息和分配全局内存。

-编辑-凹凸。这个线程目前仍然与我相关。

0 投票
3 回答
819 浏览

windows - 在服务和应用程序之间传递数据的首选方法是什么

可能重复:
Delphi 2009:如何在 Vista 下的 Windows 服务和桌面应用程序之间进行通信?

我有一个作为 Windows 服务运行的服务器。为了控制服务并显示它的状态,我有一个应用程序作为托盘图标运行。我想将数据(日志字符串)从服务传递到应用程序。

最好的方法是什么?

0 投票
4 回答
3441 浏览

c++ - 在共享内存 C++ 中实例化对象

我们需要多个程序来调用公共库中的函数。库函数访问和更新公共全局内存。每个程序的函数调用都需要看到这个公共的全局内存。也就是说,即使从另一个程序调用,一个函数调用也需要查看任何先前函数调用的更新。出于兼容性原因,我们对共享库公开的函数必须如何操作有几个设计限制:

  • 全局声明的任何数据项(标准数据类型和对象)必须对所有调用者可见,无论代码在哪个线程中运行。
  • 在函数中本地声明的任何数据项仅在该函数内可见。
  • 任何标准数据类型或任何类的实例都可能出现在本地或全局或两者兼而有之。

一种解决方案是将库的公共全局内存放在命名共享内存中。第一个库调用将创建命名的共享内存并对其进行初始化。随后的程序调用将获取共享内存的地址并将其用作指向全局数据结构的指针。全局声明的对象实例需要在共享内存中动态分配,而本地声明的对象实例可以放置在堆栈或调用线程的本地堆中。问题出现是因为全局内存中的初始化对象可以创建并指向分配(新)额外内存的子对象。这些新的分配也需要在共享内存中并被所有库调用者看到。另一个复杂之处是这些对象,其中包含字符串、文件等,也可以在调用程序中使用。当在调用程序中声明时,对象的内存对调用程序是本地的,而不是共享的。所以对象的代码需要处理这两种情况。在我们看来,该解决方案将要求我们覆盖全局放置 new、常规 new 和 delete 运算符。我们找到了一个内存管理系统的设计,看起来它可以工作,但我们还没有找到任何实际的实现。如果有人知道 Nathan Myers 的内存管理设计的实现(我们找到了一个内存管理系统的设计,看起来它可以工作,但我们还没有找到任何实际的实现。如果有人知道 Nathan Myers 的内存管理设计的实现(我们找到了一个内存管理系统的设计,看起来它可以工作,但我们还没有找到任何实际的实现。如果有人知道 Nathan Myers 的内存管理设计的实现(http://www.cantrip.org/wave12.html?seenIEPage=1)我会很感激它的链接。或者,如果有人知道另一个可以动态分配对象的共享内存管理器,我也很想知道它。我已经检查了 Boost 库和我能找到的所有其他资源,但似乎没有什么能满足我们的需要。我们宁愿不必自己写一个。由于性能和健壮性很重要,因此使用经过验证的代码会很好。提前感谢您的任何想法/帮助。

感谢您提供有关 ATL 和 OSSP 库的建议。我现在正在检查它们,尽管如果目标结果是 Unix,我担心 ATL 太以 Win为中心。

另一件事现在对我们来说似乎很清楚。由于对象可以在执行期间动态创建,内存管理方案必须能够分配额外的共享内存页面。这现在开始看起来像一个成熟的堆替换内存管理器。

0 投票
2 回答
3036 浏览

c - 是否可以使用 IPC 分配 2D 数组作为共享内存?

我想使用 IPC 将共享内存分配为二维数组。我尝试了以下方法:

问题是,每当我尝试将某些内容写入矩阵时,都会出现段错误。