【问题标题】:C++ pointers accessed by other applications其他应用程序访问的 C++ 指针
【发布时间】:2014-02-15 04:11:31
【问题描述】:

我在业余时间一直在玩 C++。我对手动内存管理完全陌生,还有很多东西要学。我正在尝试执行以下操作。

有一个带有一个简单表的数据库。我创建了一个 C++ 控制台应用程序,它在应用服务器上运行并读取该表的内容并将其存储在 RAM 中。然后它将内存地址写入一个小文本文件并进入睡眠状态。 Web 服务正在服务器上运行(与数据库不同的服务器,除了与控制台应用程序相同的服务器)。某些网站会传入对 Web 服务的调用。 Web Service 不访问数据库,而是执行以下两项操作之一。如果网站进行第一次查询,它会传入一个空值和它正在查找的记录的 ID。在这种情况下,Web 服务从文本文件中读取地址并从 RAM 中检索记录。它返回记录以及内存地址。该网站使用该记录并将内存地址塞入一个不可见的标签中。下一次调用,它传递它正在寻找的记录的 ID 和内存地址。 Web 服务直接访问该内存地址并检索记录。如果它在该内存地址中找到的内容无法解析为记录,则会检查文本文件以寻找可能的新位置。

我希望我只是做错了。简单来说,这可以工作吗?它会比让 Web 服务简单地访问数据库更快吗?控制台应用程序保留内存的事实是否会阻止 Web 服务检查内存?

【问题讨论】:

    标签: c# c++ web-services memory


    【解决方案1】:

    将指针从一个进程传递到另一个进程,以访问共享内存,需要 -- 共享内存。

    在具有现代操作系统的现代计算机上,默认情况下进程不共享任何内存;它们有单独的内存空间。您在 C++ 中处理的指针是逻辑地址,它们会在每个进程的基础上自动映射到硬件使用的物理地址。因此,来自进程 A 的指针值在进程 B 中使用时极不可能映射到相同的物理地址。

    原则上您可以实现共享内存或使用实现该功能的库,但我建议改用其他形式的inter-process communication。在 Windows 中,您有很多可能性,包括 WM_DATA 窗口消息、COM 服务器默认封送处理、邮件槽(与邮件无关)、通用 RPC 等。对于更便携的代码,请考虑使用网络套接字。

    【讨论】:

    • 进程间通信是否会遭受与调用单独的 DBMS 调用相同的惩罚?汇编是否适用于直接的物理地址?也许这两个应用程序都可以用 C++ 编写,并使用内联汇编来处理有关寻址的必要部分。
    • (1) 可能不是单独使用,但在一切就绪后,它甚至可能需要更长的时间。唯一的决定方法是测量。 (2) 语言不是决定您使用逻辑地址还是物理地址(或某种中间形式:在普通 PC 上存在三个寻址级别)。普通应用程序使用逻辑地址。 (3) 通常,内联汇编所做的优化是针对在最内层循环中完成的事情,这显然不是这里的场景。我怀疑 过早的优化,根据 Knuth 的说法,这只是邪恶的。 ;-)
    【解决方案2】:

    长话短说。现代操作系统有能力保护不同的进程不弄乱彼此的地址空间。事实上,每个进程都有自己的虚拟地址空间,它们由操作系统映射到物理地址空间。这意味着进程 A 的地址 0x00000001 和进程 B 的地址 0x00000001 并不指向 RAM 中的相同物理位置。

    所以你不能做你想做的事(简单的方法)。

    如果您这样做是为了纯粹的网络服务器性能,您可能希望网络服务器从数据库中读取数据并将其存储在自己的内存中,而不是使用其他应用程序。或者尝试使用一些商业缓存解决方案。

    【讨论】:

    • 如果 Web 服务最初在先前的调用中写入文本文件并将该调用置于睡眠状态,从而为后续调用保留 RAM 或将每个调用视为单独的调用,这会有所帮助吗?过程?
    • 通过调用我假设您的意思是请求到达服务器。我假设您在不同的线程中处理这些请求。如果是这种情况,您根本不需要文本文件,就在第一个请求到来时将数据提取到数组或其他数据结构中。将其存储在“全局”位置(可能是全局变量/私有字段等)。当下一个请求到来时,使用该“全局”持有者从中获取数据。当心多个线程同时访问数组/持有者。你需要实现线程同步。
    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多