本文主要是介绍liunx主存信息的监视,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
主存信息的观察
【预备知识】
1.liunx主存信息的监视
用free命令监控主存使用情况,如:
$ free
Totall used free shared buffers cached
Mem 255268 238332 16936 0 85540 126384
-/+ buffers/cacahe: 26408 228860
Swap: 265000 0 265000
其中,Mem表示主存统计,“-/+ buffers/cache”表示物理主存的缓存统计,Swap表示硬盘上交换分区的使用情况。在本例中,系统的总物理主存为255268K(256MB),使用totall、used、free、buffers、cached名称来代表上面统计数据的各值,第一行代表名称、第二行代表数据。
totall: 表示物理主存总量。
Used 表示总计分配的内存,包含buffers与cache使用的数量,但其中可能部分缓存并未实际使用。
free:未被分配的主存。
shared:共享主存,一般系统不会用到。
buffers:系统分配但未被使用的buffers数量。
cached:系统分配但未被使用的cache数量。
used:实际使用的buffers与cache总量,也是实际使用的主存总量。
free:未被使用的buffers 与cache和未被分配的主存之和,这就是系统当前实际可用的主存量。可以整理出如下等式:
total1=used+free
used=buffers(已分配)+cached(已分配)+used(已分配)
free=buffers(未分配)+cached(未分配)+free(未分配)
默认状态下,free命令以千字节(也就是1024字节为单位)来显示主存使用情况。还可以通过“-s”参数,使用命令来不间断地监视主存使用情况,如命令“free –b –s5”将会在终端窗口中连续不断地报告主存的使用情况,每5秒种更新一次。
Swap表示Linux的交换分区。Linux系统中的Swap交换分区是物理主存(RAM)被充满时,作为物理主存的缓存来使用。当系统需要更多的主存资源,而物理主存已经充满时,主存中不活跃的页就会被移动到Swap分区上。Linux交换分区位于硬盘上,所以它的存取速度比物理主存要慢。一般情况下,Linux交换分区的大小应当相当于计算机主存的两倍,但不能超过2048MB(2GB)。
Cache(高速缓存)是位于CPU与主存之间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主存,CPU直接从主存中存取数据要等待一定的时间周期,cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可以从cache中直接调用,这样就减少了CPU的等待时间,提高了系统的使用效率。Cache又分为一级cache(L1 cache)和二级cache(L2 cache),L1 cache集成在CPU内部,L2 cache早期直接焊接在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB。
Buffer(缓冲区)是一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备操作进程不发生中断。
2.用vmstat命令监视虚拟主存使用情况
Vmstat(Virtual Meomory Statistics,虚拟主存统计)是一个通用监控程序,可对操作系统的虚拟主存、进程、CPU活动进行监视。它对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。如果使用vmstat命令的时候没有任何命令行参数,将会得到一个一次性的报告,通常使用“vmstat 5 5”(表示5秒内进行5次采样)命令。
Vmstat命令的输出分成六部分。
1)进程(procs)。r表示在运行队列中等待的进程数;b表示在等待I/O的进程数;w表示可以进入运行队列但被替换的进程数。
2)主存(memoy)。Swpd表示现时可用的交换主存数(单位:KB);free为空闲的主存数(单位:KB);buff是缓冲区中的主存数(单位:KB);cache是高速缓存的主存数(单位:KB)。
3)Swap交换页面。si表示从磁盘交换到主存的交换页数量,单位为KB/s; so则为主存交换到磁盘的交换页数量,单位KB/s。
4)I/O块设备。bi表示发送到块设备的块数,单位为块/秒;bo表示从块设备接收到的块数,单位为块/秒。
5)系统(system)。in是每秒的中断数,包括时钟中断;cs是每秒的环境(上下文)切换次数。
6)CPU:cs是用户进程使用的时间,sy是系统进程使用的时间,id是CPU的空闲时间,均以百分比表示。
如果r经常大于4,且id经常小于40,表示CPU的负荷很重。如果bi、bo长期不等于0,表示物理主存容量太小。
主存的瓶颈由scan rate(sr)来决定scan rate为通过时钟算法计算得到的每秒扫描的页数。如果scan rate(rs)连续大于每秒200页,则表示可能存在主存缺陷;同样,如果page项中的pi和po两栏表示每秒页面的调入页数和每秒的调出页数,如果该值经常为非零值,也可能说明主存在瓶颈。当然,如果个别时候不为0,属于正常的页面调度。可以通过调节applications & servers使得对主存和cache的使用更加有效或通过增加系统主存的方法解决主存问题。
3.主存的申请和释放
(1)malloc()函数用来在堆中申请主存空间。
malloc()函数是在主存的动态存储中分配一个长度为size字节的连续空间。其参数是一个无符号整型数,返回一个指向所分配的连续存储域的起始地址的指针。当函数未能成功分配存储空间时(如主存不足)则返回一个NUII指针。由于主存区域总是有限的,不能无限的分配下去,而且程序应尽量节省资源,所以当分配的主存区域不用时,则要释放它,以便其他的变量或程序使用。
两个函数定义如下:
vid *malloc(size_t size) //返回类型为空指针类型
void free*(void *ptr)
(2) free()函数释放原先申请的空间
调用free()释放主存后,不能再访问释放的主存空间。主存释放后。很可能该指针仍然指向该主存单元,但这块主存不在属于原来的应用程序了,此时指针为悬挂指正(可以赋值为NULL)。
不能两次释放相同的指针。因为释放主存空间后该空间就交给了主存分配子程序,再次释放主存空间会导致错误。也不能用free()释放非mallco()、calloc() realloc()函数创建的指针空间。在编程时也不要将指针进行自加操作,使其指向动态分配的主存空间中的某个位置,然后直接释放,这样也可能引起错误。
进行C语言程序开发中,malloc()函数与free()函数是配套使用的,即不需要主存空间都需要释放回收。
(3)函数calloc()也可以用来动态分配主存空间.
定义如下:
void *calloc(size_t nobj, size_t size);
calloc()分配足够的主存给nojb个大小为size的对象组成的数组,并返回指向所分配区域的第一个字节的指针;若主存不够,则返回NULL。给空间的初始化大小为0字节。
函数malloc()和calloc()的区别
函数malloc()和calloc()都可以用来动态分配主存空间,但两者稍有区别。
malloc()函数有一个参数。即要分配的主存空间大小;calloc()函数有两个参数,分别为元素的数目和每个元素的大小。
函数malloc()不能初始化所分配的主存空间,而函数calloc()可以。
如果由malloc()函数分配的主存空间原来没有被使用过,则其中的每一位都为0;反之,如果这部分主存曾经被使用过,则其中可能遗留有各种各样的数据。也就是说,使用malloc()函数的程序开始时(主存空间还没有被重新分配)能正常运行,但经过一段时间(主存空间已被重新分配)可能会出现问题。
函数calloc()会将所分配的主存空间中的每一位都初始化为0,如果为指针类型的元素分配主存,那么这些元素通常会被初始化为空指针;如果为是实型数据分配主存,则这些元素会被初始化为浮点型的0。
函数relloc()用来调整主存空间的大小,定义如下:
void *realloc(void *mem address, int newsize);
relloc()改变mem_address所指主存区域的大小为newsize长度。如果重新分配成功则返回指向被分配的指针,否则返回空指针NULL。当主存不再使用时,应使用free()函数将主存块释放。
命令实验
利用free和vmsat命令观察主存分配结果及使用情况。
编程实现
【任务】
利用系统提供的主存操作函数进行的申请、调整、使用和释放。
【程序】
#include<stdio.h>#include<string.h>#include<malloc.h>int main(void) {char *str;if ((str=(char*)malloc(10))==NULL){Printf(“Not enough memery to allocate buffer\n”);exit (1);}strcpy(str,Hello”);printf(“String is %s\n Address is %p\n”,str,str);if ((str=(char*)realloc(str,20))==NULL) {printf(“Not enough memery to allocate buffer\n”);exit(1);}printf(“String is %s\n New address is %p\n”,str,str);free(str);return 0;
修改后能够正常运行的代码:
运行结果:
实验总结:
在这个程序中,我们通过实验了动态内存分配和重新分配的过程,以及如何使用malloc、realloc和free函数。具体来说:
1. 动态内存分配:使用malloc函数分配内存块时,我们需要指定要分配的内存大小。如果分配成功,malloc函数返回一个指向分配内存块的指针,否则返回NULL。在这个程序中,我们尝试分配了一个长度为10的内存块,并将字符串"Hello"复制到该内存中。
2. 动态内存重新分配:如果原先分配的内存空间不足以满足需求,我们可以使用realloc函数来重新分配更大或更小的内存空间。在这个程序中,我们通过realloc函数将原先的内存块扩展到长度为20。注意,realloc函数可能会将内存块移动到新的位置,因此需要确保重新分配后更新相应的指针。
3. 内存释放:使用完动态分配的内存后,需要通过free函数将其释放,以避免内存泄漏。在这个程序的最后,我们通过free函数释放了先前分配的内存块。
这篇关于liunx主存信息的监视的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!