《Windows核心编程》---获得内存的当前状态のGlobalMemoryStatusEx

Windows 获取内存 API 汇总及使用方法 阅读详情

Win32系统中,一个进程可寻址的地址空间是4GB,用户可使用的地址空间是大概是2GB,但这不是说用户可以申请2GB的内存,因为这2GB只是可以使用的“地址”空间,而不是可以使用的“内存”空间,可分配内存的大小还受制于物理内存和磁盘交换文件的大小。因为物理内存和磁盘交换文件是供整个系统和所有用户程序使用的,所有系统内核、当前执行的所用用户程序的代码、数据,以及分配的内存总量并不能超过物理内存和磁盘交换文件的总和。

当设计一个可能需要申请大量内存的程序时,我们就需要预先得知系统的配置情况,这时可以使用GlobalMemoryStatusEx函数。

 

GlobalMemoryStatusEx函数用来获得系统当前物理内存和虚拟内存的使用情况:

BOOL WINAPI GlobalMemoryStatusEx(

  __inout  LPMEMORYSTATUSEX lpBuffer //指向MEMORYSTATUSEX结构的指针

);

函数调用成功返回非0值,失败返回0值。

 

其中MEMORYSTATUSEX结构如下:

typedef struct _MEMORYSTATUSEX {

  DWORD     dwLength; //本结构长度

  DWORD     dwMemoryLoad; //已用内存百分比

  DWORDLONG ullTotalPhys; //物理内存总量

  DWORDLONG ullAvailPhys; //可用物理内存

  DWORDLONG ullTotalPageFile; //交换文件总的大小

  DWORDLONG ullAvailPageFile; //交换文件中空余部分大小

  DWORDLONG ullTotalVirtual; //用户可用地址空间

  DWORDLONG ullAvailVirtual; //当前空闲的地址空间

  DWORDLONG ullAvailExtendedVirtual; //保留值,设为0

} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;

 

在调用之前需要首先将dwLength字段设置为MEMORYSTATUSEX结构的长度,当调用GlobalMemoryStatusEx函数后,函数会在结构中返回对应的数值。注意:dwTotalPageFile字段返回的是交换文件的最大值,并不是当前实际建立的交换文件的大小,一般当前的交换文件大小会小于该值,但这个数值的大小也不是确定的,如果需要的话,系统会增加它的大小直到不再有空余的磁盘空间放置交换文件为止。

 

实例如下:

//  Sample output:

//  There is       51 percent of memory in use.

//  There are 2029968 total Kbytes of physical memory.

//  There are  987388 free Kbytes of physical memory.

//  There are 3884620 total Kbytes of paging file.

//  There are 2799776 free Kbytes of paging file.

//  There are 2097024 total Kbytes of virtual memory.

//  There are 2084876 free Kbytes of virtual memory.

//  There are       0 free Kbytes of extended memory.

 

#include <windows.h>

#include <stdio.h>

 

// Use to convert bytes to KB

#define DIV 1024

 

// Specify the width of the field in which to print the numbers.

// The asterisk in the format specifier "%*I64d" takes an integer

// argument and uses it to pad and right justify the number.

#define WIDTH 7

 

void main(int argc, char *argv[])

{

  MEMORYSTATUSEX statex;

 

  statex.dwLength = sizeof (statex);

 

  GlobalMemoryStatusEx (&statex);

 

  printf ("There is  %*ld percent of memory in use./n",

          WIDTH, statex.dwMemoryLoad);

  printf ("There are %*I64d total Kbytes of physical memory./n",

          WIDTH, statex.ullTotalPhys/DIV);

  printf ("There are %*I64d free Kbytes of physical memory./n",

          WIDTH, statex.ullAvailPhys/DIV);

  printf ("There are %*I64d total Kbytes of paging file./n",

          WIDTH, statex.ullTotalPageFile/DIV);

  printf ("There are %*I64d free Kbytes of paging file./n",

          WIDTH, statex.ullAvailPageFile/DIV);

  printf ("There are %*I64d total Kbytes of virtual memory./n",

          WIDTH, statex.ullTotalVirtual/DIV);

  printf ("There are %*I64d free Kbytes of virtual memory./n",

          WIDTH, statex.ullAvailVirtual/DIV);

 

  // Show the amount of extended memory available.

 

  printf ("There are %*I64d free Kbytes of extended memory./n",

          WIDTH, statex.ullAvailExtendedVirtual/DIV);

}

 

(注意:GetGlobalMemoryStatus有时会返回错误值,因此建议使用GetGlobalMemoryStatusEx!!)

 

 

Mediapipe手势识别实战——基于关节角度计算实现动态手势分类 本文详细介绍了如何利用Mediapipe进行手势识别,通过计算手指关节弯曲角度实现动态手势分类。文章从基础原理出发,讲解了关节角度计算的数学方法,并提供了Python实现代码。同时,还分享了数字手势和OK手势的识别实战经验,以及性能优化和工程实践中的关键技巧,帮助开发者快速掌握实时手势识别技术。 阅读详情

相关推荐

SPSS中的数据分析—信度效度检验【1】

前一段时间跟大家分享了好几篇关于EXCEL方面的数据分析知识,不知道大家都掌握得怎么样了。今天咱们换个口味,给大家讲一下关于SPSS中的数据分析——信度效度检验。 现阶段正处在毕业季阶段,很多同学可能都正在忙着去弄自己的论文和答辩(不知道大家在翟天临上热搜这个事情上有没有做出过一定贡献),很多时候我们在写论文答辩甚至于其他课题研究的时候都会选择用问卷这种形式来收集数据。最后我们只需要针对问卷所取...

小白数据营的博客 6万+

用GlobalMemoryStatus获取系统内存信息

用GlobalMemoryStatus获取系统内存信息 摘要:用GlobalMemoryStatus函数获取系统内存的信息,用GlobalMemoryStatusEx获取内存的使用信息。两者的区别就是前者用4个字节来保存内存大小,后者用8个字节来保存内存大小。 关键字:GlobalMemoryStatusExGlobalMemoryStatusMEMORYSTATUSMEMORYSTATUSEX 获取Windows内存信息需要使用GlobalMemoryStatus函数和MEM...

yaowang107的博客 1362

三轴云台稳定控制算法优化实战:从PID到模糊自适应

本文深入探讨了三轴云台稳定控制算法的优化实践,从经典PID控制到模糊自适应算法的进阶应用。通过实战案例和代码示例,详细解析了PID调参技巧、模糊控制实现及多传感器数据融合方法,帮助工程师在复杂环境下提升云台抗干扰能力和响应速度,特别适用于无人机航拍等场景。

green的博客 908

操作系统实验:系统内存使用统计

实验六:系统内存使用统计 一、实验目的 (1).了解Windows内存管理机制,理解页式存储管理技术。 (2).熟悉Windows内存管理基本数据结构。 (3).掌握Windows内存管理基本API的使用。 二、实验准备 1.Windows内存管理基本数据结构 系统结构MEMORYSTATUS中包含当前物理内存和虚拟内存和虚拟内存信息,使用函数GlobaiMemoryStatus()可以将这些信息存储在结构MEMORYSTATUS中。 结构原型: Typedef struct_MRMORYSTAT

1999吴的博客 2658

ANSYS APDL齿轮建模实战:从渐开线方程到完整3D模型的保姆级教程

本文详细介绍了使用ANSYS APDL进行齿轮建模的全过程,从渐开线方程的数学基础到完整3D模型的创建。通过参数化命令流实现高精度齿轮建模,特别适合机械设计和仿真分析需求。教程包含关键参数计算、APDL环境配置、单齿齿廓建模以及全齿轮阵列复制等实用技巧,帮助工程师快速掌握ANSYS APDL在齿轮建模中的应用。

lg888的博客 446

汽车诊断之UDS入门-0x19 0x0A服务

0x19 0x0A解析

weixin_44842720的博客 3836

计算机操作系统 第三章 内存管理

内存管理 无存储器抽象 早期的计算机的存储器没有抽象,程序引用的内存地址都是物理地址,这样的话程序中只可以运行一个进程,如果说运行两个进程的话就容易造成一个进程访问另一个进程的地址空间,然后两个进程同时崩溃。 还可以把一个进程暂停运行后把信息保存在磁盘中,然后把另一个进程的信息从磁盘中中读取到内存中,当这个进程暂停运行后,再把另一个进程的信息从磁盘中读取到内存中,这样就会发生大量的内存交换,效率低下。 不使用存储器抽象的情况下运行多个程序 即使没有存储器抽象,也可能同时运行多个程序,操作系统只需要把当前内存

qq_29498749的博客 1996

VsCode+JLink+GCC替代Keil开发GD32程序-个人总结

对个人使用vscode+Jlink开发GD32程序做了总结,供需要者参考。

MyCollege1999的博客 2762

CPU占有率

CPU占有率 指标细分 CPU使用率从以下3个方面监控: 1、具体进程的CPU占有率及其随时间的变化规律(纵向对比)。        不能超过特定数值或百分比。 2、各CPU独立内核CPU占有率分配情况(横向对比)。        横向分配均匀。 查看CPU核心的运行情况 主要有sar,mpstat,vmstat,top。 其中,top消耗资源较多,不适合在性能期间持续运行。

jakung的专栏 1349

《自然语言处理实战入门》文本分类 ---- 使用词向量与SVM 进行文本分类

文本分类用电脑对文本集(或其他实体或物件)按照一定的分类体系或标准进行自动分类标记。 它根据一个已经被标注的训练文档集合, 找到文档特征和文档类别之间的关系模型, 然后利用这种学习得到的关系模型对 新的文档进行类别判断 。文本分类从基于知识的方法逐渐转变为基于统计 和机器学习的方法。

shiter编写程序的艺术 2388

RK3588 平台部署实战:OpenCV + LibTorch + FFmpeg 环境搭建与深度学习推理全流程解析

现在,你已经掌握了在RK3588上搭建OpenCV+LibTorch+FFmpeg环境的完整流程,也完成了深度学习模型的部署测试。不妨从一个具体的应用场景入手(如检测自家宠物的品种),亲手打造属于你的第一个边缘智能应用——当你看到模型在RK3588上精准输出结果时,你会发现:嵌入式深度学习的门槛,其实并没有想象中那么高。这些依赖是编译OpenCV、FFmpeg的基础,安装过程中若提示权限不足,可在命令前加。若能输出预测的类别索引,则说明环境搭建成功,模型推理流程通畅。文件,实现模型加载、图像预处理与推理。

FJN110的博客 534

GlobalMemoryStatus()显示当前物理内存和虚拟内存信息

轻轻的改了改代码,竟然运行成功

梓川枫的博客 1131

【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(二) - 网络规划

2. 全三层架构设计思路 采用全三层网络架构设计的出发点是: 使用尽量少的交换机高级功能,可以尽可能减少由于功能bug故障造成的问题; 使用尽量少的网络协议,以兼容不通厂商的网络设备 实现简单,易于维护,绝对可靠的路由协议; 通过控制路由来调度流量,尽量减少设备或协议的故障域; 牺牲高级功能带来的便捷,得到更高的可用性和性能; 由上述原则,本文的设计选择只使用静态路由和BGP...

因吹斯汀 1万+

GlobalMemoryStatusEx详解

函数原型:       BOOL GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer) 功能:    此函数用来获得当前可用的物理和虚拟内存信息,是GlobalMemoryStatus的64位版本。 包含头文件:    winbase.h   MEMORYSTATUSEX结构定义:     typedef st

fulminate的专栏 7291

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

易语言调用GlobalMemoryStatusEx读取系统内存信息

GlobalMemoryStatusEx函数用于获取系统内存信息,是Kernel32.dll提供的接口,,这个函数在预计程序会装在有4GB内存的机器上运行。 获取系统内存信息有2个api,分别是GlobalMemoryStatus和GlobalMemoryStatusEx GlobalMemoryStatus函数可以在C语言咧直接调用,但是GlobalMemoryStatusEx却不可以直接调用 看看这2个函数的不同,总的来说这2个函数都可以获取到内存信息,但是GlobalMemoryStatusEx

511遇见 4085

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Windows API一日一练(79)GlobalMemoryStatusEx函数

在开发软件的过程中,经常会碰到不同用户的PC系统配置不一样。比如有些用户的系统内存配置比较差,这样处理大量数据时,就不能把大量的数据读取到内存里处理了。而又有一些用户的内存比较多,或者是机器比较新,那么就可以加载大量的数据到内存里处理,这样可以随着系统的更新,软件的处理能力能大幅地提高性能。这样就需要了解系统的配置信息了,最重要的资源之一内存,就是最需要了解的,需要调用函数GlobalM...

anjichan4261的博客 613

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Qt笔记(六十八)之获取内存信息

一.前言 楼主最近在获取电脑设备的一些信息,今天获取了关于内存的信息,于是分享记录下 二.获取过程 1.使用系统APIGlobalMemoryStatusEx和结构体MEMORYSTATUSEX 关于MEMORYSTATUSEX中各个变量的解释 typedef struct _MEMORYSTATUSEX { DWORD dwLength; // 结构体的大小 DWORD dwMemoryLoad; // 表示内存使用率,是一个0-100的数字

我是黄同学博客 3019

C++ 获取windows内存信息

【代码】C++ 获取windows内存信息。

修也 468

[c++] 获取物理内存和可用虚拟内存、内存使用率、cpu使用率

获取内存 MEMORYSTATUSEX 函数原型: typedef struct _MEMORYSTATUSEX {     DWORD dwLength;     DWORD dwMemoryLoad;     DWORDLONG ullTotalPhys;     DWORDLONG ullAvailPhys;     DWORDLONG ullTotalPageFile;     DW...

初阳-.-#的博客 4085

GlobalMemoryStatus 和 GlobalMemoryStatusEx

1、获取系统内存信息有2个api,分别是GlobalMemoryStatus和GlobalMemoryStatusEx。GlobalMemoryStatus函数可以在C语言里直接调用,但是GlobalMemoryStatusEx却不可以直接调用。 2、看看这2个函数的不同,总的来说这2个函数都可以获取到内存信息,但是GlobalMemoryStatusEx函数是GlobalMemoryS

HelloKandy's Blog 3701

GlobalMemoryStatusEx系统内存信息

GlobalMemoryStatusEx函数用于获取系统内存信息: BOOL WINAPI GlobalMemoryStatusEx(   __inout  LPMEMORYSTATUSEX lpBuffer ); 示例代码: void CTestDlg::GetMemoryInfo() {  MEMORYSTATUSEX statex;  statex.dwLength = si

sqcfj的专栏 1万+

Windows核心编程 - 探索虚拟内存

1. 系统信息 操作系统中有很多参数是由系统所运行的主机所决定的,如页面大小和分配粒度等,可使用GetSystemInfo函数来获取与主机相关的参数。为了让32位应用程序能够在64位版本Windows上运行,Microsoft提供了一个称为Windows 32-bit On Windows 64-bit的模拟层,称为WOW64。当32位应用程序在WOW64上运行时,调用GetSystem...

yjianlu的专栏 292
上一篇: 《ASCE1885的武术》---断骨
下一篇: 《Windows核心编程》---堆管理函数
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值