我在业余时间一直在玩C ++。我是手动内存管理的新手,需要学习很多东西。我正在努力做到以下几点。
有一个带有一个简单表的数据库。我创建了一个在应用服务器上运行的C ++控制台应用程序,并读取该表的内容并将其存储在RAM中。然后它将内存地址写入一个小文本文件并进入休眠状态。 Web服务正在服务器上运行(与DB不同的服务器,除了与控制台应用程序相同的服务器)。某些网站传递了对Web服务的调用。 Web Service不是命中数据库,而是执行以下两种操作之一。如果网站正在进行第一次查询,则会传入一个空值以及它要查找的记录的ID。在这种情况下,Web服务从文本文件中读取地址并从RAM中检索记录。它返回记录以及内存地址。网站使用记录并将内存地址堵塞到不可见标签中。下一次调用时,它会传递它要查找的记录的ID和内存地址。 Web服务直接进入该内存地址并检索记录。如果它在内存地址中找到的内容无法解析为记录,则会检出文本文件以查找可能的新位置。
我希望我做错了。从理论上讲,这可以工作,并且比Web服务只是访问数据库更快吗?控制台应用程序是否正在保留内存以防止Web服务检查内存?
答案 0 :(得分:0)
将指针从一个进程传递到另一个进程,为了访问共享内存,需要 - 共享内存。
在具有现代操作系统进程的现代计算机上,默认情况下不共享任何内存;他们有独立的记忆空间。您在C ++中处理的指针是逻辑地址,它们在每个进程的基础上自动映射到硬件使用的物理地址。因此,当在进程B中使用时,来自进程A的指针值极不可能映射到相同的物理地址。
您原则上可以实现共享内存或使用实现它的库,但我建议使用其他形式的inter-process communication。在Windows中,您有许多可能性,包括WM_DATA窗口消息,COM服务器默认封送,邮件插槽(与邮件无关),常规RPC等。对于更多可移植代码,请考虑使用网络套接字。
答案 1 :(得分:0)
长话短说。现代操作系统能够保护不同的进程免于弄乱每个地址空间。事实上,每个进程都有自己的虚拟地址空间,它们由OS映射到物理地址空间。这意味着进程A的地址0x00000001和进程B的地址0x00000001不指向RAM中的相同物理位置。
所以你不能做你想做的事(简单的方法)。
如果您为了实现Web服务器的纯粹性能而这样做,您可能希望让Web服务器从数据库中读取数据并将其存储在自己的内存中,而不是使用其他应用程序。或尝试使用一些商业缓存解决方案。