动态内存
计算机科学领域术语
动态内存(Dynamic Memory),使用户能够指定虚拟操作系统启动的RAM容量,并将平台可用的系统内存最大化。
定义
Integrity VM 的可选功能,通过该功能,您可以更改虚拟机使用的物理内存量,而无须重新引导该虚拟机。在 Integrity VM 的本发行版中,只能在 HP-UX guest 虚拟机上使用动态内存。
例如,该功能允许将作为 Servicegard 节点的 guest 虚拟机用作多个 Serviceguard 程序包的备用服务器。当程序包故障切换到 guest 虚拟机时,可在故障切换之前、之后或期间更改 guest 虚拟机的内存,使其符合程序包的要求。要使用动态内存,guest 虚拟机必须安装 guest 虚拟机管理软件。
管理
在 VM Host 中,动态内存软件随 Integrity VM 一起提供。可使用 hpvmcreate、hpvmmodify 或 hpvmclone 命令的 -x 选项在 VM Host 上管理动态内存。-x 选项可将各种配置参数与 guest 虚拟机(包括 guest 虚拟机的动态内存和网络管理)相关联。 表 1提供了用于动态内存的 -x 关键字的完整列表。
表 1 动态内存控制命令选项
使用
缺省情况下,不启用动态内存。要配置虚拟机以使用动态内存,请输入 hpvmcreate、hpvmmodify 或 hpvmclone 命令。包含以下 -x 选项以设置初始值:
可在引导过程的早期阶段配置虚拟机,以减少其内存大小,从而使虚拟机在 VM Host 系统上保持可用并使内存开销较低。使用以下 -x 选项可启用此功能:
可在同一命令行上提供多个动态内存关键字。例如,要启用动态内存并配置名为 compass1 的 guest 虚拟机以便在引导进程初期减少其大小,请输入以下命令:
该命令指定下列值:
将虚拟机内存大小设置为 6 GB。
通过使用任何可用的动态内存支持启用了动态内存。
虚拟机可以减少至的最小内存量为 1222 MB。
此虚拟机可以增加至的最大内存量为 6 GB。
引导后减少至的内存量为 2 GB。
首次配置动态内存功能时,如果虚拟机正在运行,必须重新引导此虚拟机,才能使配置更改生效。
查看
可使用 Integrity VM 标准命令,为每个 guest 虚拟机显示动态内存参数和状态。例如,对于名为 compass1 的 guest 虚拟机,使用 hpvmstatus 命令可显示以下动态内存信息:
表 2 说明了 hpvmstatus 命令和 hpvmmgmt 命令显示的动态内存的特性。
表2 动态内存的特性
在 VM Host 上修改虚拟机的内存大小
配置动态内存后,可以以块大小 (64 MB) 为增量,将虚拟机内存大小更改为介于最小大小 (ram_dyn_min) 和最大大小 (ram_dyn_max) 之间的任意值。请使用 hpvmmodify 命令的以下 -x 选项更改内存大小:
启用
缺省情况下,从 guest 虚拟机管理动态内存的功能将被禁用,必须通过 VM Host 启用此功能。如果未启用此功能,则可显示动态内存信息,但是无法更改内存大小。
可使用 hpvmcreate、hpvmmodify 或 hpvmclone 命令,并包含 -x dynamic_memory_control 选项。指定 1 作为该选项的参数。例如,在 VM Host 系统中,输入以下命令可在名为 compass1 的 guest 虚拟机上启用动态内存控件:
从 Guest 虚拟机查看动态内存信息
可在 HP-UX guest 虚拟机上使用 hpvmmgmt 命令管理和查看动态内存信息。安装 guest 虚拟机管理软件时将安装该命令。
表 3说明了 hpvmmgmt 命令的选项。
表 3 hpvmmgmt 命令的选项
例如,在 guest 虚拟机上,使用 hpvmmgmt 命令列出动态内存信息。输入以下命令:
要显示详细信息,请包含 —V 选项。例如:
在 Guest 虚拟机上修改虚拟机的内存大小
配置和启用动态内存功能后,可以一个块的大小 (64 MB) 为单位,将虚拟机内存大小更改为介于最小大小 (ram_dyn_min) 和最大大小 (ram_dyn_max) 之间的任意值。可使用 hpvmmgmt 命令的以下 -x 选项:
例如,要将 guest 虚拟机内存大小修改为 4 GB,请输入以下命令:
排除故障
动态内存限制
使用动态内存具有下列限制:
虚拟机大小不能增加到其初始引导大小(如 -r 选项所指定)以上。如果虚拟机内存已产生碎片,则尝试减少虚拟机大小可能会失败或需要很长时间。如果无法将虚拟机大小降低到所需大小,请通过设置新的目标大小来异常中止操作。增加虚拟机大小需要 VM Host 上具有一定的可用内存。如果 VM Host 内存不足,该操作可能需要很长时间才能完成,并可能失败。如果 ram_target 和 ram_dyn_target_start 的值不在 ram_dyn_min 和 ram_dyn_max 值之间,则会发出一条警告。
VM Host 资源注意事项
HP-UX 支持“大型页面”内存管理功能,可用于提高性能。Integrity VM 可通过确保在虚拟机启动时分配容量最大的可用页面来实现此功能。一旦分配并锁定这些页面之后,将无法更改其大小。此限制可使大型页面的碎片降至最低。
该功能会限制可在 VM Host 系统上运行的软件类型。如果 VM Host 系统支持虚拟机以外的其他工作负荷,则大型页面可能会产生碎片,并可能导致新启动的虚拟机性能降低。
动态内存增加了 VM Host 内存产生碎片的可能性。动态内存的当前实现方式可释放向虚拟机分配的内存部分。必须以大型连续块为单位执行这些操作;否则,减少虚拟机大小会使为该虚拟机分配的 VM Host 内存产生碎片。可通过软件防止产生此潜在碎片,即以物理连续内存的最小块大小 64 MB 的倍数为单位减少虚拟机大小。
Guest 虚拟机资源注意事项
运行某一工作负荷的系统正常运行期间,大型页面可能会逐渐产生碎片。VM Host 和运行 HP-UX 操作系统的虚拟机都会出现这种情况。如果虚拟机内存产生碎片,动态内存子系统将无法减少 guest 虚拟机的大小。这是因为此减少大小的操作使用最小块大小。如果动态内存无法删除至少 64 MB 的物理连续 guest 虚拟机内存,则不会减少大小。
指定足够的 Guest 虚拟机内存
如果将 ram_dyn_target_start 的值设置得过小,则 guest 虚拟机操作系统可能会在引导时挂起或崩溃。此种情况下,guest 虚拟机无法访问足够的内存量。通常,降低分配给 HP-UX guest 虚拟机的内存时降幅不能超过其分配的内存大小的 75%。对于配置了 2 GB 内存的虚拟机,其内存降低幅度不能超过 50%。
如果 guest 虚拟机在引导时崩溃,请在 VM Host 上使用 hpvmmodify 命令增大 ram_dyn_target_start 参数的值。例如,要增加名为 compass1 的 guest 虚拟机内存大小,请在 VM Host 上输入以下命令:
设置该参数之后,请重新引导该 guest 虚拟机。
如果 guest 虚拟机挂起,请在 VM Host 上使用 hpvmstatus 命令查看 guest 虚拟机上的内存统计信息。例如:
该问题的一个指示为可用内存量过小或为零,并且内存压力值较大 (100)。如果出现这些指示,请在 VM Host 上使用 hpvmmodify 命令增加 guest 虚拟机的内存大小。然后,按正常方式引导该 guest 虚拟机。
实际内存分配可能不相同
如果指定的 ram_target 或 ram_dyn_target_start 参数的值所更改的内存大小不是 64 MB 的倍数,则会重置目标值。
例如,如果指定 6 GB 的内存,HP-UX guest 虚拟机实际可访问 6135 MB 的内存。如果尝试将内存大小设置为 2048 MB,则实际删除的内存大小为 4087 MB。由于它不是 64 MB 的倍数,因此会将目标内存大小重置为 2103 MB。
在 Guest 虚拟机和 VM Host 上启用动态内存
在 VM Host 系统中使用动态内存参数之前,必须在 guest 虚拟机上安装 guest 虚拟机管理软件。例如,如果未安装 guest 虚拟机管理软件,hpvmstatus 命令将显示以下内容:
如果尝试从 VM Host 修改 guest 虚拟机的动态内存,则会显示下列错误:
如果尝试从 guest 虚拟机修改动态内存,则会显示下列错误:
在升级 Integrity VM 时升级 Guest 虚拟机工具包
动态内存软件包含两个组件:VM Host 支持和 HP-UX guest 虚拟机支持。要使动态内存正常运行,以上两个组件的版本级别必须相同。升级 Integrity VM 时,还必须在 guest 虚拟机上安装新的 guest 虚拟机工具包(如果不再支持 guest 虚拟机操作系统,则应同时升级该操作系统)。在此升级过程中,动态内存可能无法运行。
如果版本不匹配,启动 guest 虚拟机时会向 VM Host 的 syslog 文件 (/var/adm/syslog/syslog.log) 写入一条消息。例如:
此示例表明编号为 5 的虚拟机上的 guest 虚拟机管理软件工具包已过期。要确定编号为 5 的虚拟机,请使用 hpvmstatus 命令。在以下示例中,guest 虚拟机 5 名为 dale:
解析
对于指针,正确的分配动态内存是十分重要的,本文将着重阐述动态内存分配函数malloc,calloc,realloc以及memset的用法。
i.对于malloc,在终端输入 #:man malloc可以知道函数原型
Void *calloc(size_t size) ,包含在库函数 stdlib.h中,作用是在内存的堆区分配一个大小为size的连续空间,如果分配内存成功,函数返回新分配内存的首地址,否则,返回NULL,注意:鉴于上述这点,一般在写程序需要判断分配内存是否成功,如下程序语句:
int *p;
p=(int *)malloc(sizeof(int));
if(p!=NULL)
.................................//需要执行的语句
else
.........................//打印分配内存不成功出错信息
通常造成内存分配失败的原因如下:
1、 内存访问越界
2、 所需连续的内存空间不足
ii.对于函数calloc用法大致与malloc相同,函数原型为:
void *callo(size_t num,size_t size),作用是在内存中分配连续大小为
num*size的空间,这一点在动态数组内存分配有所体现,返回值以及判断返回是否成功与上面相同,下面重点来讨论
malloc与calloc区别:
1、后者在返回指向内存的指针之前把它初始化为0。
2、请求内存数量的方式不同。malloc的参数仅仅是需要分配的内存字节数;calloc的参数包括元素的数量和每个元素的字节数。
iii.对于 realloc(),函数原型是*void realloc(void *ptr,size_t size),改变ptr所指内存区域的大小为size长度,如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用 free() 函数将内存块释放。
有一点需要注意:当内存释放之后,应将原本的指针ptr=NULL,否则会形成野指针,可能造成系统崩溃。
提示:不论是以上那种方式申请内存,在申请内存之后,最终都要用free释放空间,不然会造成内存泄漏
参考资料
最新修订时间:2024-07-24 09:48
目录
概述
定义
管理
参考资料