主存信息的观察

本文详细介绍了如何在Linux环境下使用free和vmstat命令监控内存使用情况,以及通过C语言的malloc、realloc和free函数进行内存申请、调整和释放。还涵盖了如何观察和分析虚拟内存统计信息以及内存泄漏的预防。
摘要由CSDN通过智能技术生成

一、实验目的

1、学习掌握主存信息的监视和主存的申请和释放。

2、熟悉掌握free和vmsat命令的原理和使用。

3、利用系统提供的主存操作函数进行的申请、调整、使用和释放。

二.实验环境

1、操作系统:Linux

2、编程语言:C语言

3、编译器:gcc

三、实验内容与步骤

一、Linux主存信息的监视:

1、用free命令监控主存使用情况

通过使用free命令,可以实时监测系统的主存使用情况,并了解主存和交换空间的分配情况。

totall:表示物理主存总量。

Used:表示总计分配的内存,包含buffers与cache使用的数量,但其中可能部分缓存并未实际使用。

free:未被分配的主存。

shared:共享主存,一般系统不会用到。

buffers\cache:表示缓存区,系统分配但未被使用的buffers数量和cache数量

available:可用内存

所以系统当前的内存使用情况如下所示:

总内存:3988424 KB  已使用:705080 KB  空闲:2777200 KB

共享内存:10368 KB  缓存/缓冲区:506144 KB  可用内存:3042616 KB

交换空间的情况如下:

总交换空间:998396 KB  已使用:0 KB  空闲:998396 KB

从中可以看出:free表示未被使用的buffers 与cache和未被分配的主存之和,这就是系统当前实际可用的主存量。可以整理出如下等式:

totall=used+free 即3988424 =705080+2777200+506144

used=buffers(已分配)+cached(已分配)+used(已分配)

free=buffers(未分配)+cached(未分配)+free(未分配)

这些数字表示系统当前的内存和交换空间的使用情况。但是,这些数字可能会随着系统的运行而发生变化。

2、通过“-s”参数,使用命令来不间断地监视主存使用情况,如命令“free –b –s  5”将会在终端窗口中连续不断地报告主存的使用情况,每5秒种更新一次。

  每5秒种报告一次主存的使用情况。

二、用vmstat命令监视虚拟主存使用情况

1、vmstat命令:

vmstat(Virtual Memory Statistics)是一个命令行工具,用于显示关于系统虚拟内存的统计信息。它提供了一些重要的指标,包括内存使用、交换空间、CPU利用率和进程等。

显示当前系统的虚拟内存统计信息。输出将包含以下列:

(1)procs:显示有关进程和线程的信息,包括运行队列长度、阻塞进程数量等。

- r:正在运行的进程数。

- b:等待资源的进程数。

当前没有正在运行的进程(r和b列都为0)。

(2)memory:提供有关内存使用的信息,包括总内存、空闲内存、缓冲区和缓存的使用、交换空间使用等。

- 交换:交换空间的使用情况。

- 空闲:可用的空闲内存量。

- 缓冲:用于缓冲的内存量。

- 缓存:用于缓存的内存量。

内存使用情况中,交换空间未被使用(交换列为0),可用的空闲内存为2794440 KB。缓冲区使用了52320 KB,缓存使用了399504 KB。

(3)Swap交换页面。显示有关交换空间的信息,包括总交换空间、使用的交换空间和可用的交换空间。

si:每秒从磁盘交换到内存的数据量(swap in)。

so:每秒从内存交换到磁盘的数据量(swap out)

没有发生交换操作(si和so列都为0)。

(4)I/O块设备。bi表示发送到块设备的块数,单位为块/秒;bo表示从块设备接收到的块数,单位为块/秒。

bi(块输入)为150,表示每秒从块设备(磁盘)读取的块数量为150。

bo(块输出)为11,表示每秒写入到块设备(磁盘)的块数量为11。

(5)系统(system)。in是每秒的中断数,包括时钟中断;cs是每秒的环境(上下文)切换次数。

- in(中断数量)为114,表示每秒发生的硬件中断次数为114。

- cs(上下文切换数量)为350,表示每秒的上下文切换次数为350。

较高的中断数量可能表示系统正在处理大量的硬件事件,例如设备输入/输出、网络通信等。而较高的上下文切换数量可能表示系统在不同的进程之间频繁切换执行,这可能会增加系统的开销。

(6)CPU:提供有关CPU利用率的信息,包括用户态、内核态和空闲时间等。

- us:用户空间占用CPU的百分比。

- sy:内核空间占用CPU的百分比。

- id:CPU空闲时间的百分比。

- wa:等待I/O完成的CPU时间的百分比。

- st:虚拟化环境中被偷取的CPU时间的百分比。

  所以CPU利用率方面,用户态使用时间(us)为2%,内核态使用时间(sy)为2%,空闲时间(id)为97%,等待I/O完成的时间(wa)为0%,没有被虚拟机监控程序限制的时间(st)为0%。

这些统计数据可以提供有关系统的性能和资源使用情况的信,并可以用于监控和诊断系统的运行状态。

三、利用系统提供的主存操作函数进行内存的申请、调整、使用和释放。

使用malloc和realloc函数来分配和重新分配内存空间,并使用strcpy函数将字符串复制到分配的内存中。

1、首先是代码所需的头文件,分别包含了标准输入输出函数、动态内存分配函数和字符串处理函数。

#include <stdio.h>  #include <stdlib.h>  #include <string.h>

2、然后在main函数中,声明了一个名为str的字符指针变量。接着,使用malloc函数分配了一个长度为10的内存块,并将返回的指针赋值给str。如果内存分配失败(即返回的指针为NULL),则打印错误消息并退出程序。

malloc函数

malloc函数是C语言中用于动态分配内存空间的函数。它的原型如下:void *malloc(size_t size);

malloc函数接受一个size_t类型的参数 size,表示需要分配的内存空间的大小(以字节为单位)。它返回一个指向分配内存的指针,或者在分配失败时返回NULL

使用malloc函数时,需要注意以下几点:

(1)malloc函数分配的内存空间是在堆(heap)上,而不是在栈(stack)上。这意味着该内存空间在程序的执行过程中保持有效,直到显式地释放它。

(2)分配的内存空间是未初始化的,其中的内容是不确定的。可以使用其他函数(例如memset)将其初始化为特定的值。

(3)使用malloc分配的内存空间应在使用完毕后及时释放,以免造成内存泄漏。使用free函数来释放通过malloc函数分配的内存空间。

(4)当分配失败时,malloc函数返回NULL指针。因此,在使用返回的指针之前,应检查分配是否成功。

3、再使strcpy函数将字符串"Hello"复制到str指向的内存空间中。然后,使用printf函数打印字符串和内存地址。

4、使用realloc函数重新分配之前分配的内存空间,将大小调整为20个字节。如果重新分配失败,则打印错误消息并退出程序。

realloc函数

realloc函数是C语言中用于重新分配内存空间大小的函数。它的原型如下:void *realloc(void *ptr, size_t size);

realloc函数接受两个参数:

-ptr:一个指向之前通过malloc、calloc或realloc分配的内存块的指针。如果ptr是NULL,则realloc的行为类似于malloc,即分配新的内存空间。

-size:需要重新分配的内存空间的大小(以字节为单位)。

realloc函数会尝试重新分配给定大小的内存空间。它有以下几种情况:

1. 如果ptr是NULL,则realloc的行为类似于`malloc`,即分配新的内存空间,并返回指向该空间的指针。

2. 如果size为0,且ptr不是NULL,则realloc的行为类似于free,即释放ptr指向的内存空间,并返回NULL指针。

3. 如果ptr和size都不为NULL,realloc会尝试重新分配给定大小的内存空间。有以下几种情况:

 - 如果重新分配成功,则返回指向新分配内存的指针,且原有的`ptr`指针将失效。

 - 如果重新分配失败,则返回`NULL`指针,并保持原有的`ptr`指针和内存不变。

5、最后使用printf函数打印重新分配后的字符串和内存地址,然后使用free函数释放动态分配的内存空间。程序正常结束并返回0。

free函数

free()函数是C语言中用于释放通过动态内存分配函数(如malloc()、calloc()、realloc()等)分配的内存空间的函数。它的原型如下:

void free(void *ptr);

free()函数接受一个指向动态分配内存空间的指针ptr,并将该内存空间释放回系统供其他程序使用。

使用free()函数时,需要注意以下几点:

(1)传递给free()函数的指针必须是通过动态内存分配函数分配的有效指针。如果传递了无效的指针(如空指针或已释放的指针),则可能导致未定义的行为。

(2)被释放的内存空间会被返回给系统,并标记为可供其他程序使用。因此,在使用free()函数释放内存后,应避免对已释放内存进行访问,以防止出现悬空指针(dangling pointer)。

(3)free()函数只会释放指定的内存块,并不会改变指针本身的值。释放后的指针仍然指向原来的内存地址,但是已经不再是有效的指针。

一旦使用free()函数释放了内存空间,就不应再使用已释放的指针来访问该内存空间,否则可能会导致未定义的行为。

6、实验运行结果:

程序输出了以下内容:

字符串为:Hello

地址为:0x55e7280d72a0

字符串为:Hello

新地址为:0x55e7280d72a0

(1)第一个输出表示分配的内存空间中存储的字符串为Hello。

(2)第二个输出表示分配的内存空间的地址为0x55e7280d72a0。

(3)第三个输出表示重新分配内存后,仍然存储着字符串Hello。

(4)第四个输出表示重新分配后的内存空间的新地址与之前的地址相同,都为0x55e7280d72a0。

四、实验总结

通过这次实验,掌握了free和vmsat命令的原理和使用,以及实现了动态内存分配的过程。

首先,使用malloc()函数分配了一个大小为10字节的内存空间,并使用`strcpy()`函数将字符串"Hello"复制到该空间中。然后,打印分配的内存空间中存储的字符串及其地址。接下来,使用realloc()函数重新分配内存空间的大小为20字节,并将新的指针赋值给str。最后,打印重新分配后的内存空间中存储的字符串及其新地址。最后,使用free()函数释放分配的内存空间,以避免内存泄漏。

下面是本次实验新学习的一些函数:

1. malloc(size_t size):动态分配指定大小的内存空间,并返回指向该空间的指针。如果分配失败,返回NULL指针。

2. strcpy(char* destination, const char* source):将源字符串拷贝到目标字符串所指向的位置,包括字符串结束符'\0'。要求目标字符串必须具有足够的空间来容纳源字符串。拷贝成功后,返回指向目标字符串的指针。

3. realloc(void* ptr, size_t size):重新分配指定大小的内存空间,用于扩大或缩小原有内存块。传入的ptr参数是之前分配的内存块的指针。如果分配成功,返回指向新分配内存的指针;如果分配失败,返回NULL指针。需要注意,重新分配内存后,原有的指针ptr可能会失效。

4. free(void* ptr):释放通过动态内存分配函数分配的内存空间,将该内存空间返回给系统供其他程序使用。传入的ptr参数是指向待释放内存空间的指针。

实验中需要注意的是,动态分配的内存空间在使用完毕后,应及时使用free()函数释放,以便系统可以回收该内存空间供其他程序使用。

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值