通过 RTX64 控制面板中 Manage memory(内存管理)页面,可以设置 RTX64 子系统在内存分配时,与 Windows 交互的默认行为。详细说明如下:
注意:RTX64 控制面板的某些配置更改,需要重新启动 RTSS 子系统。
在 RTX64 控制面板中打开此页面
在 RTX64 控制面板中打开内存管理页面:
- 在 Windows 开始菜单中,导航至 RTX64 4.x Runtime,单击 RTX64 Control Panel;
- 单击 Configure the RTSS Subsystem -> Manage memory
了解内存属性
在 Memory profile 内存属性 下,您可以配置 RTX64 可用系统内存的大致数量(参阅下方 Calculating Available System Memory 计算可用系统内存),以及查看 RTX64 组件内存使用信息。当变更页面上的分配值时,使用值也会相应更新。这些信息为用户提供了非常有用的参考值,如初始化时分配多少内存,是否有足够的剩余内存来运行 RTSS 进程等。
计算可用系统内存
RTX64 可用的内存量使用两个主要值计算,您可以在内存配置文件下指定这两个值:
设置 | 描述 | 操作 |
---|---|---|
Available system memory 可用系统内存 | 可用的系统内存容量(以 GB 为单位)。 默认值基于 RTX64 安装程序检测到的可用内存量。 | 您可以在 Windows 任务管理中查看当前系统可用内存内存量(下图以 Windows 10 为例): 要更改可用系统内存容量,请先记下 Windows 任务管理器中的可用值,并将其输入 Memory Profile 页面对应的框中。 注意:最好定期将 RTX64 控制面板中的可用系统内存量与 Windows 任务管理器中的实际内存量进行比较。 |
Percentage expected to be used by Windows 预计 Windows 使用的百分比 | 该值是指与实时应用程序一起运行的 Windows 应用程序,预计使用的内存的百分比。默认值为 50%。可用系统内存的剩余百分比是 RTX64 可用的量。 可用系统内存 (GB) – Windows 使用的内存 (%)= 可用 RTX64 内存 (%) 该值的可接受范围是 1-99%。 | 要更改此百分比,请在文本字段中输入一个新值。 要估算此值,请满载运行全部 Windows 和 RTX64 应用程序,同时查看内存使用情况来自定义此值。 |
注意:这些值并不会强制执行。它们用于控制面板中的内存分配计算。
RTX64 组件内存使用
注意:外部分配可以通过控制面板设置。但是,内存使用量的计算会宏观考虑外部和内部资源分配。
注意:这些组件使用值仅适用于本地内存。
组件 | 描述 |
---|---|
Initial Subsystem usage 初始化子系统 | 初始化 RTX64 子系统需要的初始内存量。主要用于子系统内部结构。 详细信息,参阅 Allocation Spaces in Local Memory(在本地内存中分配空间) |
Monitoring usage 监控使用情况 | RTX64 监控使用的内存量。 注意:如果在 Configure the RTSS Subsystem -> Change Monitoring settings 设置中,未选中 Enable instrumentation within the Subsystem for monitoring real-time applications,则该值显示灰色,且其使用情况不会被计算。 |
Initial NAL usage 初始化 NAL | 初始化网络抽象层 (NAL) 需要的初始内存量。该值假定除了虚拟 NIC 外,还存在一个已启用的接口。如果启用了多个接口,则必须相应增加此值,或启用自动扩展设置。 注意:NAL 内存无法禁用。 |
Initial TCP/IP Stack usage 初始化 TCP/IP 栈 | 分配给 TCP/IP 栈的初始内存量,包括堆,但不包括设备驱动程序启动时分配的内存。该值假定除了虚拟 NIC 外,还存在一个已启用的接口。如果启用了多个接口,则必须相应增加此值,或启用自动扩展设置。 注意:当 TCP/IP 栈未被激活,该值显示灰色,且不会被计算。 |
Remaining memory available to RTSS processes RTSS 进程可用的剩余内存 | 基于所有其他分配状况,估算的 RTSS 进程可用剩余内存。 |
Approximate number of concurrent RTSS processes that can run 可并发运行的 RTSS 进程大致数量 | 可并发运行的 RTSS 进程大致数量,基于 Remaining memory available to RTSS processes( RTSS 进程可用的剩余内存)值。 注意:进程启动时,每个进程的的 MSpaces 默认值可以修改,所以是一个近似值。 |
管理子系统和应用程序内存分配行为
用户可以配置 RTX64 默认的内存分配行为:从本地池或 Windows 请求内存。
设置子系统和应用程序内存分配默认值:
选择一种内存分配方式:
- Request from local memory pool(从本地内存池请求):默认设置,确定性。所有 RTSS 应用将从本地内存分配空间 (MSpace) 请求内存。详细信息,参阅下面 Using Local Memory(使用本地内存);
- Request from Windows(从 Windows 的请求):非确定性。所有 RTSS 应用从 Windows 请求内存。如果有其他 RTSS 应用提前调用了 RtAllocateLocalMemory 或 RtAllocateMemoryEx 函数,RTX64 会为进程创建一个 MSpace。选择此选项后,就可以配置分配给 RT-TCP/IP 堆栈的内存量(以千字节为单位)。但这并不包括设备驱动程序在启动时分配的内存。
分配时清零内存
根据 Windows 遵循的 C99 规范,由 malloc 或类似的 C 函数分配的内存,不能初始化为零。为了保持向后兼容性,RTX64 提供了 Zero memory on allocation(分配时清零内存)设置。
默认情况下启用此设置。
注意:将内存清零可能会导致性能衰退。如果衰退不可接受,请禁用此设置。禁用后,来自某些 C 语言函数或 RTAPI 的内存请求,在分配时不会清零。但是,根据定义,来自 calloc/_recalloc、VirtualAlloc 和带有 HEAP_ZERO_MEMORY 标志的 HeapAlloc/HeapReAlloc 的内存请求,将在分配时初始化为零。
详细信息,参阅 Zeroing Memory on Allocation(分配时清零内存)。
重新启动 RTX64 使更改生效。
使用本地内存
本地内存配置包含了组成系统的多个分配空间 (MSpace):RTX64 子系统,NAL ,RT-TCP/IP 栈,以及每个 RTSS 进程和 Windows 代理进程。RTX64 子系统、网络组件以及每个 RTSS 进程和代理进程,都有一个用于内部对象和 bookkeeping 的内部 MSpace,以及一个用于进程分配的外部 MSpace。子系统内部对象所需内存,在内部 MSpace 中分配。而来自 RTAPI,包括 C 语言库的内存分配请求,在外部 MSpace 中分配。详细信息,请参阅 Allocation Spaces in Local Memory(本地内存中的空间分配)。
内存是从进程 MSpace 之一分配的,除非需要在进程退出时保留内存,例如 IPC 对象的内存和跨进程共享内存。这种分配是在子系统的 MSpace 中进行的。
当使用本地内存时,子系统的外部 MSpace 会在第一次内存请求时创建,但如果选择提交(commit),子系统启动时就会分配内存。 各个进程的外部 MSpace 的类似。除非使用 RtssRun 或 RTX64 任务管理器启动进程,或者向本地或托管 API 传递进程 MSpace 的初始大小,否则第一次内存请求时就会分配内存。这将为一般的非确定性功能提供确定性特征,并在系统停止想要(蓝屏)后,提供更大的灵活性和功能性。
用户可以指定本地内存分配空间 (MSpace) 的初始大小(KB)。如果 RTSS 应用程序耗尽了最初分配的内存,还可以将 MSpace 配置为自动扩展。
注意,当 MSpace 中的剩余可用内存无法满足分配请求时,扩展功能将请求内存。在扩展期间,从 Windows 请求的内存会导致不确定性,并且无法在关闭处理程序中调用。为了避免这种情况,了解应用程序的内存需求,并设置满足需求的初始 MSpace 大小非常重要。有关在 RTX64 中使用本地内存的更多信息,请参阅 Allocation Spaces in Local Memory(本地内存中的空间分配)。
进程内存分配空间
使用如下设置为本地应用程序配置内存分配。
设置 | 描述 | 操作 |
---|---|---|
Minimum size for internal MSpace (KB) 内部 MSpace 的最小大小 | 每个 RTSS 进程的内部 MSpace 的最小大小 | 拖动滑块或在文本字段中输入新值。 注意:对此值的更改会自动提交。 |
Minimum size for external MSpace (KB) 外部 MSpace 的最小大小 | 每个 RTSS 进程的外部 MSpace 的最小大小 | 拖动滑块或在文本字段中输入新值。 注意:对此值的更改会自动提交。 |
Auto expand MSpaces 自动扩展 MSpaces | 您可以将 RTX64 配置为在 MSpace 耗尽后自动请求额外(扩展)内存。 注意,扩展内存会引入不确定性。 此设置决定 RTSS 进程的 MSpace 是否将会自动扩展,以满足内存需求。 | 要自动扩展 MSpace,选中该复选框,并设置扩展大小(默认)。请拖动滑块或在文本字段中输入值。 要关闭自动扩展,取消选中该复选框。 注意:如果请求的内存不可用,则内存分配请求将失败。 |
Auto shrink MSpaces 自动缩小 MSpaces | 在释放直接从本地池分配的内存时,是否收缩 MSpace。 | 要自动收缩 MSpace,选中该复选框(默认)。 要关闭自动收缩,请清除取消选中该复选框。 |
系统进程内存分配空间
使用如下设置来配置子系统本地内存分配行为。
设置 | 描述 | 操作 |
---|---|---|
Minimum size for internal MSpace (KB) 内部 MSpace 的最小大小 | 系统进程内部 MSpace 的最小大小 | 拖动滑块或在文本字段中输入新值。 注意:对此值的更改会自动提交。 |
Minimum size for external MSpace (KB) 外部 MSpace 的最小大小 | 系统进程外部 MSpace 的最小大小 | 拖动滑块或在文本字段中输入新值。 注意:对此值的更改会自动提交。 注意:所有进程的共享内存和 IPC 对象的内存分配都取决于该值。 |
Commit at Subsystem startup 在子系统启动时提交 | 是否在子系统启动时,将 Windows 中的非分页内存分配到 MSpace 的本地池中 | 要在启动时提交 MSpace 内存(分配),请选中该复选框。反之取消选中该复选框。 |
Auto expand MSpaces 自动扩展 MSpaces | 您可以将 RTX64 配置为在 MSpace 耗尽后自动请求额外(扩展)内存。 注意,扩展内存会引入不确定性。 此设置决定系统进程的 MSpace 是否将会自动扩展,以满足内存需求。 | 要自动扩展 MSpace,选中该复选框,并设置扩展大小。请拖动滑块或在文本字段中输入值。 要关闭自动扩展,取消选中该复选框。 重要提醒!当 Auto expand MSpaces 禁用时,需要为整个系统中内部和外部资源配置子系统的内存用量。包括网络组件(NAL 和 RT-TCP/IP 栈)以及 RTX64 运行时提供的其他工具和实用程序。如果子系统没有足够的可用内存,实时进程将无法运行或无法创建 IPC 对象,并返回ERROR_NOT_ENOUGH_MEMORY。 |
Auto shrink MSpaces 自动缩小 MSpaces | 在释放直接从本地池分配的内存时,是否收缩 MSpace。 | 要自动收缩 MSpace,选中该复选框(默认)。 要关闭自动收缩,请清除取消选中该复选框。 |
网络内存分配空间
该设置用来配置网络抽象层 (NAL) 和 RT-TCP/IP 栈的内存分配空间。
网络抽象层 (NAL) 内存分配空间
设置 | 描述 | 操作 |
---|---|---|
Minimum size for external MSpace (KB) 外部 MSpace 的最小大小 | NAL 进程的外部 MSpace 最小大小。其最小值为 64 KB,默认值为 1024 KB。 根据启用的接口数量不同,该值大小也会不同。 可以使用如下公式计算需要分配的内存量: 外部 MSpace 的最小大小 = 128K+(64K* numberOfEnabledInterfaces) | 拖动滑块或在文本字段中输入新值。 注意:对此值的更改会自动提交。 |
Commit at Subsystem startup 在子系统启动时提交 | 是否在 NAL 进程启动时,将 Windows 中的非分页内存分配到 MSpace 的本地池中 | 要在启动时提交 MSpace 内存(分配),请选中该复选框。反之取消选中该复选框。 |
Auto expand MSpaces 自动扩展 MSpaces | 您可以将 RTX64 配置为在 MSpace 耗尽后自动请求额外(扩展)内存。 注意,扩展内存会引入不确定性。 此设置决定 NAL 进程的 MSpace 是否将会自动扩展,以满足内存需求。 | 要自动扩展 MSpace,选中该复选框,并设置扩展大小。请拖动滑块或在文本字段中输入值。 要关闭自动扩展,取消选中该复选框。 请注意,当 MSpace 最小尺寸太小时,无法关闭自动扩展。 |
TCP/IP 栈内存分配空间
注意:当 RT-TCP/IP 栈未激活,或已激活但未启动时,RT-TCP/IP 栈设置将显示灰色。
注意:根据启用的接口数量,以及其他相关因素,当对 TCP/IP 栈内存配置可能导致内存不足时,控制面板会显示警告。
设置 | 描述 | 操作 |
---|---|---|
Minimum size for external MSpace (KB) 外部 MSpace 的最小大小 | TCP/IP 栈进程的外部 MSpace 最小大小。其最小值为 64 KB,默认值为 6272 KB。 该值需要足够大才能保证 RT-TCP/IP 堆栈分配,并且必须至少为 RT-TCP/IP 堆栈分配大小加上 2176 KB。 可以使用如下公式计算需要分配的内存量: 外部 MSpace 的最小大小 = StackHeapK+128K+(64K* numberOfEnabledInterfaces) | 拖动滑块或在文本字段中输入新值。 注意:对此值的更改会自动提交。如果 RT-TCP/IP 栈正在运行,则需要重新启动。 |
MSpace memory allocated to the TCP/IP Stack heap (kilobytes, not including memory allocated by device drivers at startup) 分配给 TCP/IP 堆栈的 MSpace 内存 (KB,不包括设备驱动程序在启动时分配的内存) | TCP/IP 栈必须在启动时分配所有必要的内存才能保证确定性。分配的内存值应该足够大,能够包含所有发送和接收缓冲区。 该设置最小值为 2048 KB,最大允许值为 4 GB。 可以使用如下公式计算需要分配的内存量: 堆栈内存 = 2048K + (50K* numberOfEnabledInterfaces) + (200K* numberOfActiveConnections); 注意:这不包括 NIC 驱动程序在启动时分配的内存。 注意:此内存是从 MSpace 分配的,如果未启用自动扩展 MSpace,则 TCP/IP 栈堆大小必须比外部 MSpace 的最小值(KB)少 2176KB。 | 在文本字段中输入一个值。 |
Auto expand MSpaces 自动扩展 MSpaces | 您可以将 RTX64 配置为在 MSpace 耗尽后自动请求额外(扩展)内存。 注意,扩展内存会引入不确定性。 此设置决定 TCP/IP 栈进程的 MSpace 是否将会自动扩展,以满足内存需求。 注意:如果外部 MSpace 的最小大小值,小于分配给 TCP/IP 栈堆的 MSpace 内存值,则无法禁用自动扩展 MSpace。 | 要自动扩展 MSpace,选中该复选框,并设置扩展大小。请拖动滑块或在文本字段中输入值。 要关闭自动扩展,取消选中该复选框。 请注意,当 MSpace 最小尺寸太小时,以至于无法支持堆栈时,无法关闭自动扩展。 |
管理监控内存使用
拖动滑块或在文本字段中输入值,来指定子系统收集监控事件需要的连续非分页内存大小。该内存从非分页池内存中分配,并且在启用监控时分配。
注意:未启用监控时,此部分呈灰色。
注意:根据您正在监视的事件数量以及这些事件的频率,您可能需要增加此值的大小,从而避免由于内部缓冲区空间不足而丢失数据。如果遇到数据丢失事件,请增加专用于监控的内存量(同时考虑监控较少类型的事件)。