跳转至主要内容

你可以在VOS和OpenVOS中完成许多编程任务,而不需要知道操作系统如何管理用户地址空间的细节。 但了解这些细节是很有趣的,有时为了完成一个任务,你需要调整默认配置。 本篇文章就是对VOS用户地址空间的介绍。

VOS用户地址空间分为5个区域,每个区域都有特定的用途。 从最低地址(@0x)到最高地址(@7FFFFFFFx)依次是程序模块区、动态分配的共享虚拟内存区、用户堆、用户栈和一小块保留给操作系统本身使用的区域。下图显示了这些区域的顺序。该图未按比例显示。此图是V系列实现(VOS 15.0及更高版本)所特有的。

OpenVOS用户地址空间
程序模块
共享虚拟内存
用户堆
(死区)
用户栈
系统数据

程序模块区域的大小固定为128MB。 系统数据区的大小固定在2 MB以下。 其他3个区域的大小可以根据运行程序的需要进行调整。 共享虚拟内存区域的默认大小为896 MB。因此,前两个区域占据了1千兆字节或一半的地址空间。 用户堆的默认大小因VOS或OpenVOS的版本不同而有一定的差异。 在17.0版本中,默认大小为64MB。 用户堆的默认大小是8MB。 堆和栈之间未使用的空间称为死区。 由于堆向上生长(低地址到高地址),而栈向下生长(高地址到低地址),所以死区可以被堆或栈要求扩展。堆、栈和系统数据可用的虚拟内存总量又是1千兆字节。 全部加起来,一个用户进程可以访问2千兆字节的虚拟内存。

可以使用的堆空间总量是有管理限制的。栈空间和总空间量(即程序模块空间、共享虚拟内存空间、堆空间和栈空间的总和)也是如此。 模块范围的限制可以通过list_default_cmd_limits命令查看,也可以通过update_default_cmd_limits命令修改。 新进程会继承这些模块范围的值。 在进程启动并运行后,可以使用list_process_cmd_limits命令查看它们的限制,并使用update_process_cmd_limits命令进行修改。

然后,全过程的限制值被用来初始化每次执行程序时使用的限制。 一旦程序启动并运行,它就可以调用s$get_current_cmd_limits和s$set_current_cmd_limits子程序来检索或修改其执行期间的限制。 通过这种方式,程序可以为其堆栈保留比系统初始默认值更多的空间,或者可以增加允许使用的堆空间。 反之,如果担心使用空间过大,可能是由于编码错误,也可以减少它可以使用的空间。

更多信息,请阅读 update_default_cmd_limits 和 bind 命令的说明。

 

© 2024Stratus Technologies.