liunx主存信息的监视

2024-05-27 09:44
文章标签 信息 liunx 主存 监视

本文主要是介绍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主存信息的监视的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007121

相关文章

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

Linux命令(11):系统信息查看命令

系统 # uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo # 查看CPU信息# hostname # 查看计算机名# lspci -tv # 列出所有PCI设备# lsusb -tv

【小迪安全笔记 V2022 】信息打点9~11

第9天 信息打点-CDN绕过篇&漏洞回链8接口探针&全网扫指&反向件 知识点: 0、CDN知识-工作原理及阻碍 1、CDN配置-域名&区域&类型 2、CDN绕过-靠谱十余种技战法 3、CDN绑定-HOSTS绑定指向访问 CDN 是构建在数据网络上的一种分布式的内容分发网。 CDN的作用是采用流媒体服务器集群技术,克服单机系统输出带宽及并发能力不足的缺点,可极大提升系统支持的并发流数目,减少或避

Weex入门教程之4,获取当前全局环境变量和配置信息(屏幕高度、宽度等)

$getConfig() 获取当前全局环境变量和配置信息。 Returns: config (object): 配置对象;bundleUrl (string): bundle 的 url;debug (boolean): 是否是调试模式;env (object): 环境对象; weexVersion (string): Weex sdk 版本;appName (string): 应用名字;

Python批量读取身份证信息录入系统和重命名

前言 大家好, 如果你对自动化处理身份证图片感兴趣,可以尝试以下操作:从身份证图片中快速提取信息,填入表格并提交到网页系统。如果你无法完成这个任务,我们将在“Python自动化办公2.0”课程中详细讲解实现整个过程。 实现过程概述: 模块与功能: re 模块:用于从 OCR 识别出的文本中提取所需的信息。 日期模块:计算年龄。 pandas:处理和操作表格数据。 PaddleOCR:百度的

[轻笔记] ubuntu Shell脚本实现监视指定进程的运行状态,并能在程序崩溃后重启动该程序

根据网上博客实现,发现只能监测进程离线,然后对其进行重启;然而,脚本无法打印程序正常状态的信息。自己通过不断修改测试,发现问题主要在重启程序的命令上(需要让重启的程序在后台运行,不然会影响监视脚本进程,使其无法正常工作)。具体程序如下: #!/bin/bashwhile [ 1 ] ; dosleep 3if [ $(ps -ef|grep exe_name|grep -v grep|

linux上查看java最耗时的线程信息

找到JAVA进程pid ps -ef|grep java或则jps -mlv 找进行下耗时的线程TID 使用top -Hp pid可以查看某个进程的线程信息 -H 显示线程信息,-p指定pid top -Hp 10906 查看最耗时的 TID即线程id printf "%x\n" [tid] 转成16进制 java中的线程类相关信息 jstack 线程ID 可以查看某个线程的堆栈情况,特别对于h

在糖尿病患者信息管理系统中,导入病人信息功能!

在糖尿病患者信息管理系统中,导入病人信息功能!form表单提交数据(Excel文件),在后台得不到file文件,解决方法:         private File filePath; //文件         private String fileName; //文件名         private String fileType; //文件类型 注:上面filePath必须有,否则下面

前缀和 — 利用前缀信息解决子数组问题

【前缀和的核心思想是预先处理数组来快速计算任意子数组的和,基本上用于数组和序列问题。】 前缀和算法具体步骤 构造前缀和数组: 给定一个数组nums,其前缀和数组prex定义为prex[i]表示为数组nums从起始位置到第i个位置的元素累加和。构建前缀和公式: p r e x [ i ] = n u m s [ i ] ( i = = 0 ) p r e x [ i ] = p r e x