`

内存管理--函数 GlobalMemoryStatus

阅读更多

 

转自:http://www.cnblogs.com/del/archive/2008/05/06/1184847.html

 

经验证,源码可运行

 

Windows 是多任务的操作系统, 一个任务就是一个应用(应用程序)、一个应用占一个进程; 在一个进程里面, 又可以运行多个线程(所以就有了很多"多线程编程"的话题).



对 Win32 来讲, 系统给每个进程 4GB 的地址空间:
低端 2GB($00000000 - $7FFFFFFF) 给用户支配;
高端 2GB($80000000 - $FFFFFFFF) 留给系统使用.



文件或程序要调入内存才能工作, 先看看我们的内存到底有多大吧.

在系统盘根目录下有个 pagefile.sys 文件, 这就是我们的 "虚拟内存"(虚拟内存是以文件的形式存在的).

把 pagefile.sys 叫做 "虚拟内存" 似乎不妥, 所谓的 "虚拟" 只是相对真实的物理内存(RAM)来讲的; 很多书上的 "物理内存" 指的其实是: RAM + 虚拟内存, 也就是所有可用内存.

"虚拟内存" 在有些书上也被称作 "页文件" 、"页面文件" 或 "交换文件". "虚拟内存" 的大小可以从 "控制面板" 里设置, 默认是由系统自动管理的.

使用 "虚拟内存" 是系统的机制, 不管 RAM 有多大, 也应该使用 "虚拟内存".

RAM 大了, 系统就会少用 "虚拟内存", 从而提高速度; 但 RAM 也不是越大越好, 如果你真的放 4G 的内存条, 系统能够识别并使用的也就是 3G 左右, 因为 Win32 只有 4G 的管理能力(寻址能力), 当然这在 Win64 下要另当别论.



所谓系统给每个程序 4G, 是给 4G 的 "虚拟的地址表", 绝不是真实的内存, 不然一个记事本、一个计算器就得需要 8G.

这个 "虚拟的地址表" 在有些书上叫 "虚地址表"、"页映射表" 或 "虚内存地址", 也有叫 "虚拟内存地址", 很容易和 "虚拟内存" 的概念混淆.

这个 "虚拟的地址表" 上有 4G 个(4294967296 个)地址(0 - $FFFFFFFF), 虽然每个程序都有这样一个表, 但它们并不会冲突, 就因为这些地址是虚拟的, 系统在需要的时候会把它们映射成具体的真实内存的地址. 这样就阻断了一个进程对另一个进程的访问.

在 Win2000 以前的版本中, 用 GlobalAlloc 申请公用内存, 用 LocalAlloc 申请私有内存; 现在通过 "虚拟的地址表" 使用内存, 在进程中申请的内存都是私有的, 现在的 GlobalAlloc、LocalAlloc 没有区别, 都是执行同样的代码.

如果需要跨进程的公用内存空间, 需要用 "内存映射" 等手段, 这需要再专题学习.



总结概念: 物理内存、虚拟内存、虚地址表.
函数 GlobalMemoryStatus 可以获取它们的信息, 获取后放在 TMemoryStatus 结构中.


//TMemoryStatus 是 _MEMORYSTATUS 的重命名:
_MEMORYSTATUS = record
  dwLength: DWORD;        {结构长度}
  dwMemoryLoad: DWORD;    {表示可用内存比例的一个整数, 100 表示内存都可用}
  dwTotalPhys: DWORD;     {物理内存总数}
  dwAvailPhys: DWORD;     {可用物理内存总数}
  dwTotalPageFile: DWORD; {虚拟内存总数}
  dwAvailPageFile: DWORD; {可用虚拟内存总数}
  dwTotalVirtual: DWORD;  {虚地址表中的地址总数}
  dwAvailVirtual: DWORD;  {虚地址表中可用的地址总数}
end;

做个小程序看看内存情况:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  m: TMemoryStatus;
const
  num = 1024 * 1024;
begin
  GlobalMemoryStatus(m);
  Memo1.Clear;
  with Memo1.Lines do begin
    Add(Format('dwLength:'        + #9 + '%d', [m.dwLength]));
    Add(Format('dwMemoryLoad:'    + #9 + '%d', [m.dwMemoryLoad]));
    Add(Format('dwTotalPhys:'     + #9 + '%d', [m.dwTotalPhys div num]));
    Add(Format('dwAvailPhys:'     + #9 + '%d', [m.dwAvailPhys div num]));
    Add(Format('dwTotalPageFile:' + #9 + '%d', [m.dwTotalPageFile div num]));
    Add(Format('dwAvailPageFile:' + #9 + '%d', [m.dwAvailPageFile div num]));
    Add(Format('dwTotalVirtual:'  + #9 + '%d', [m.dwTotalVirtual div num]));
    Add(Format('dwAvailVirtual:'  + #9 + '%d', [m.dwAvailVirtual div num]));
  end;
end;

end.

我这里的运行效果图:

 

 

 

分享到:
评论

相关推荐

    《系统内存统计使用》实验报告

    - 实验过程中涉及的关键函数如`GlobalMemoryStatus()`用于获取当前内存状态,`VirtualAlloc()`和`VirtualFree()`用于动态分配和释放虚拟内存,这些函数的使用对于理解内存管理至关重要。 - 实验结果表明,动态内存...

    java管理windows系统内存_java释放内存缓存_java获得CPU使用率_系统内存_硬盘_进程源代码

    在Windows操作系统中,内存管理是一个非常重要的方面。Windows实现按需调页的虚拟内存机制,使得应用程序可以使用超过物理内存容量的虚拟内存。此外,Windows还使用了页面文件来扩展物理内存的容量。 在Java中,...

    内存管理实验报告

    ### 内存管理实验报告知识点解析 #### 一、实验设计与要求 ##### 设计目标与功能 本次实验旨在深入理解Windows操作系统中的内存管理机制,尤其是虚拟内存的分配与控制。设计要求涵盖以下几点: 1. **双线程设计*...

    .net CPU及内存监测

    在Windows操作系统中,开发者可以调用WIN32 API函数来获取这些数据,如`GlobalMemoryStatus`和`GetSystemInfo`。 1. **`GlobalMemoryStatus`函数**: 这个函数用于获取当前系统的全局内存状态信息,包括物理内存、...

    操作系统课程设计内存管理.pdf

    此外,Windows API提供了一组内存管理函数,如VirtualAlloc、VirtualFree、VirtualQuery等,用于应用程序动态地分配和释放内存。 Windows API中关于内存管理的函数调用主要包括: - reserve:保留一块内存区域,该...

    WinCE 下内存使用情况查看程序源码

    2. **内存管理**:在WinCE中,内存管理是至关重要的,因为内存泄漏会导致系统性能下降,甚至系统崩溃。内存泄漏是指程序分配的内存未能被正确释放,久而久之,可用内存会逐渐减少。 3. **GlobalMemoryStatus函数**...

    操作系统实验——内存管理

    ### 操作系统实验——内存管理 #### 实验背景与目的 在现代计算机系统中,内存管理是操作系统最为关键的功能之一。良好的内存管理不仅能够提高系统的性能,还能够确保多个应用程序安全稳定地运行。通过本实验,...

    WinCE内存管理报告

    Windows CE内存管理报告深入解析了该操作系统如何高效地管理和利用内存资源。WinCE与传统的PC机在内存使用上有显著区别,特别体现在ROM和RAM的划分、虚拟内存机制以及内存分配方式上。 首先,Windows CE对ROM和RAM...

    操作系统实验报告11-系统内存使用统计.doc

    操作系统实验报告11-系统内存使用统计主要关注的是Windows操作系统中的内存管理机制,特别是通过API接口获取和理解系统内存的使用情况。实验的目标是让学生深入理解Windows内存管理的基础,包括页式存储管理技术和...

    操作系统 系统内存使用统计

    在操作系统中,内存管理是至关重要的一个部分,它负责有效地分配、使用和回收内存资源。这个实验主要关注的是系统内存的使用统计,特别是针对Windows操作系统。实验的主要目标是理解和掌握Windows内存管理机制,包括...

    易语言内存

    在易语言中,内存管理是编程过程中的一个重要环节,对于程序的运行效率和稳定性起着关键作用。 内存管理涉及到多个方面,包括内存的申请、释放、读写以及对内存状态的监控。在易语言中,我们可以使用特定的函数和...

    操作系统原理实验系统内存使用统计5.doc

    实验的核心在于使用Windows系统提供的内存管理函数,如GlobalMemoryStatus()和MEMORYSTATUS结构来获取系统内存和虚拟内存的使用状态。GlobalMemoryStatus()函数用于获取系统内存的状态信息,这些信息被封装在...

    易语言COOL内存监控显示

    学习这个源码不仅可以提升易语言编程技能,还能加深对内存管理的理解,尤其是如何使用API函数和易语言特性来实现系统级别的操作。 通过以上分析,我们可以看出“易语言COOL内存监控显示”是一个结合了易语言编程、...

    C#物理内存检测

    通过深入理解`MEMORY_INFO`结构体和`GlobalMemoryStatus`函数的工作原理,开发者可以更加高效地监控和管理应用程序的内存使用,从而提升软件的整体性能和用户体验。 需要注意的是,虽然本文介绍的方法适用于特定的...

    易语言内存监控显示

    易语言是一种专为中国人设计的编程语言,它以简体中文作为编程语句,降低了编程的门槛,使得更多非计算机专业的人也能进行程序开发...通过学习和实践,不仅可以提升易语言编程技能,还能深入理解计算机内存管理的原理。

    windows api

    这些API提供了对系统资源的直接访问,如文件系统、内存管理和进程线程的控制。下面将详细阐述这些知识点。 一、文件系统 1. **磁盘和驱动器管理**: - `GetLogicalDriveStringsW` 用于获取所有逻辑驱动器的名称,...

    获取CPU、内存、硬盘利用率

    - 使用`GlobalMemoryStatus`函数获取内存状态信息,并据此计算内存利用率。 #### 扩展知识点 - **系统调用与API**:在Windows系统中,可以通过调用特定的API函数来获取系统信息,如内存状态(`GlobalMemoryStatus`)...

    在C#中運用API函數獲取系統資訊.doc

    API是由操作系统提供的接口,允许程序员访问底层的功能,如内存管理、用户界面交互和图形输出。在Visual C#中调用API函数可以让我们获取到丰富的系统信息。 **Win16与Win32 API** - **Win16 API**:这是为16位...

    API函数获取系统的相关信息

    类似地,可以声明其他获取系统信息的API,如`GetSystemDirectory`(获取系统目录)、`GetSystemInfo`(获取CPU信息)、`GlobalMemoryStatus`(获取内存状态)和`GetSystemTime`(获取系统时间)。这些函数可能还需要...

Global site tag (gtag.js) - Google Analytics