使用 C 或 C++ 在 OS/400 中获取可用 RAM?
Posted
技术标签:
【中文标题】使用 C 或 C++ 在 OS/400 中获取可用 RAM?【英文标题】:Getting available RAM in OS/400 with C or C++? 【发布时间】:2014-05-16 05:18:46 【问题描述】:我需要确定几个 C 或 C++ 平台上的可用 RAM。
我在这里找到了一些跨平台代码:https://www.opensource.apple.com/source/text_cmds/text_cmds-84/sort/physmem.c
我的项目的目标平台之一是 OS/400。 我上面链接的代码会返回 OS/400 上实际可用的 RAM 吗? 如果没有,我怎样才能在 OS/400 上获得可用的 RAM?
在短期内,我认为我仅限于使用 C++98 或 C++03,因为 Windows 项目目前在 Visual Studio 2003 中维护。我不知道在什么编译器上使用其他平台。
编辑:一些背景... 我正在开发我的雇主大约 10 年前开发的软件,但直到几个月前我才参与其中。 它使用存储为单个文件的数据库,内部格式分为多个固定大小的页面。 所有平台(我知道的 Windows、Linux、Solaris 和 OS/400)上的当前行为是根据需要将页面加载到内存中(以字符数组的形式),最大为 64 MB。总数据大小约为 1.1 GB。 在 Windows、Linux 和 Solaris 上进行的测试表明,通过增加 64 MB 的限制可以大幅提升性能。
考虑到 cmets,尤其是 Whozcraig 的 cmets,在 OS/400 上什么是合适的行为? 对使用多少“内存”没有限制是否可行? 没有足够的时间为一个很少使用的平台创建一种截然不同的数据结构和行为。
【问题讨论】:
如果操作系统有办法查看可用内存量,您可以使用内存查看器在显示它的任何应用程序上找到该值,并使用该地址来获取可用内存值。是的,这很骇人听闻,当操作系统收到补丁时,该地址可能随时更改,因此这不是一个稳定的修复。 我一直认为 OS/400 的整个想法是防止人们弄乱诸如“可用 RAM”之类的细节。 :) @oakad - 我不知道是不是这样。我对操作系统或它运行的硬件知之甚少。我只是想通过自动使用更多内存(如果可用)来使一些旧软件运行得更快。 @ScottLeis 除了少数例外(实际上很少)OS/400 是一个您不想想要做出内存决策的平台像这样,事实上,人们使用的大多数自缓存算法,将该文件加载到“内存”等,实际上是弄巧成拙。 OS/400 不同于您将体验过的大多数操作系统。其庞大的线性地址空间涵盖了宇宙,它的设计从硬件开始就可以针对内存利用等资源管理做出明智的决策,因此您不必这样做。 @WhozCraig - 非常有趣。请查看我对问题的编辑。 【参考方案1】:正如评论者所指出的,您对潜在问题(在背景部分)采取的方法对于这个特定平台是有问题的。然而,抛开这一点,只关注你最初的问题,即如何确定有多少可用 RAM,答案如下:
要找出您正在运行的 LPAR 可用的 RAM,您可以调用 dlpar_get_info
API。你需要#include <qpmlpmgt.h>
,然后做这样的事情:
dlpar_info_format1_t info1;
int rc = dlpar_get_info(&info1, dlpar_info_format1_ID, sizeof(dlpar_info_format1_t));
if (rc < 0) /* Handle error */
else
printf("Maximum Memory (MB): %llu\n", info1.max_memory);
printf("Minimum Memory (MB): %llu\n", info1.min_memory);
printf("Memory Increment (MB): %llu\n", info1.memory_region);
printf("Defined Memory (MB): %llu\n", info1.def_mem);
请注意,此 API 在 V5R3 中是新的。
【讨论】:
我对该信息投了赞成票,但我不太可能将其标记为答案,因为我没有能力进行测试(无法访问任何 OS/400 或类似系统),并且我不再从事这个项目。还是谢谢。以上是关于使用 C 或 C++ 在 OS/400 中获取可用 RAM?的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中通过 'recv' 和 'MSG_PEEK' 获取套接字中可用的字节数