实验六:系统内存使用统计

一、实验目的

1.了解windows内存管理机制,理解页式存储管理技术。

2.熟悉Windows内存管理基本数据结构。

3.掌握WIndows内存管理基本API的使用。

二、实验准备知识:相关数据结构及API函数介绍

1.相关系统数据结构说明:

系统结构MEMORYSTATUS中包含当前物理内存和虚拟内存和虚拟内存信息,使用函数GlobalMemoryStatus()可以将这些信息存储在结构MEMORYSTATUS中。

结构原型:

Typedef struct_MRMORYSTATUS{DWORD dwLength;                        //MOMORYSTATUS结构大小
DWORD dwMemoryLoad;                   //内存利用率
DWORD dwTotalPhys;                      //物理内存大小
DWORD dwAvailPhys;                      //空闲物理内存大小
DWORD dwTotalPageFile;                   //页文件大小
DWORD dwAvailPageFile;                   //空闲页文件大小
DWORD dwTotalVirtual;                    //虚拟地址空间大小
DWORD dwAvailVirtual;                    //空闲虚拟地址空间大小
} MEMORYSTATUS, *LPMEMORYSTAYUS;

成员说明:

dwLength;MEMORYSTATUS数据结构的大小,单位为字节。

dwMemoryLoad:当前内存利用率,取值范围为0~100%,0表示内存没有被使用,100%表示内存全部被使用。

dwTotalPhys:物理内存的总字节数。

dwAvailPhys:可用物理内存的字节数。

dwTotalPageFile:页文件的总字节数。页文件是虚拟内存系统占用的磁盘空间。

dwAvailPageFile:页文件中的可用字节数。

dwTotalVirtual:用户模式下调用进程可以访问的虚拟地址空间总字节数。

dwAvailVirtual:用户模式下调用进程虚拟地址空间中未提交和未保留的内存总字节数,即可用虚拟地址空间大小。

2.相关API函数介绍

获取系统物理内存和虚拟内存使用信息

原型:

VID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer       //指向MEMORYSTATUS数据结构);

参数说明:

lpBuffer: 指向MEMORYSTATUS数据结构的指针,函数GlobaiMemoryStatus()将内存的当前信息存储在该结构中。

返回值:该参数没有返回值。

保留或提交某一点虚拟地址空间

函数VirtualAlloc()可以在调用进程的虚拟地址空间中保留或提交若干页面。保留意味着这段虚拟地址地址不能被使用,当提交时,这段虚拟地址才真正被分配给进程。

原型:

VPVOID VirtuailAlloc( LPVOID lpAddress,           //待分配空间的起始位置DWORD dwSize,            //待分配空间的大小DWORD flAllocationType,        //分配类型DWORD flaProtect           //存取保护的类型);

参数说明:

①lpAddress:待分配空间的其实位置。若该值为NULL,系统将为其分配一合适的起始地址,否则用户要指定一个准确的起始地址。

②dwSize:待分配空间的大小。如果参数lpAddress不为NULL,则待分配空间在lpAddress~ lpAddress+ dwSize范围内。

③flAllocationType:分配类型,可以为表3-1所列标志的任意组合。

表3-1

标志 描述
MEM_COMMIT 提交,即在内存或磁盘页文件中分配物理内存
MEM_RESERVE 保留进程的虚拟地址空间,而不分配物理内存。表留的空间在没有被释放之前,不能被其他分配操作如Malloe()和LocalAlloc()使用。被保留的地址空间可随后使用VirtuaiAlloc()函数提交

④flProtect:指定存取保护的类型。若虚拟地址空间已经被提交,则在指定下面任何一个属性时要随同PAGE_GUARD(页保护)和PAGE_NOCACHE(页无缓存)这两个属性。存取保护位的类型如表3-2所示。

标志 描述
PAGE_READONLY 被提交的虚拟地址空间只读
PAGE_READWRITE 被提交的虚拟地址空间可读/写
PAGE_EXECUTE 被提交的虚拟地址空间可执行
PAGE_EXECUTE_READ 被提交的虚拟地址空间可执行、可读
PAGE_EXECUTE_READWRITE 被提交的虚拟地址空间可执行、可读/写
PAGE_GUARD 保护
PAGE_NOACCESS 不允许访问
PAGE_NOCACHE 无缓存

返回值:

如果函数调用成功,则返回值为已分配虚拟地址空间的起始地址。如果函数调用失败, 则返回值为NULL。若要得到更多的错误信息,可调用GetLast6Error()函数。

(3)释放或注销某一段虚拟地址空间

函数VirtualFree()用于释放或注销某一段虚拟地址空间。

原型:

BOOL VirtualFree(LPVOID lpAddress,        //待分配空间的起始位置DWORD dwSize,          //待分配空间的大小DWORD dwFreeType        //释放操作类型
);

参数说明:

①lpAddress: 待释放空间的起始位置。如果dwFreeType值为MEM_RELEASE,该参数必须使用VirtualAlloc()函数返回的地址。

②dwSize: 待释放空间的大小。如果dwFreeType值为MEM_RELEASE,该参数必须为0,否则待释放空间在lpAddress~ lpAddress+dwSize范围内。

③dwFreeType: 释放类型。可以为表3-3所示标志的任意组合。

表3-3 释放类型

标志 描述
MEM_DECOMMIT 注销提交,如果注销一个没有提交的虚拟地址空间,也不会导致失败,即提交或没有提交的虚拟地址空间都可以注销
MEM_RELEASE 释放保留的虚拟地址空间,如果使用该标志,dwSize参数必须为0,否则函数失败

返回值:
如果函数调用成功,则返回值为非零。

如果函数调用失败,则返回值为零。若要得到更多的错误信息,可调用GetLastError()函数。

(4)分配内存空间

原型:

void *malloc(site_t size);

参数说明:

Size:要分配内存大小,单位为B(字节)。

返回值:

该函数返回分配内存空间void类型的指针。如果返回NULL,说明没有有效的内存空间可供分配。

(5)释放内存空间

原型:

Void free(void * memblock);

参数说明:

*memblock:要释放的内存地址。

返回值:无。

三、实验内容

使用Windows系统提供的函数和数据结构显示系统存储空间的使用情况,当内存和虚拟存储空间变化时,观察系统显示变化情况。

// MALLOC.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include "MALLOC.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/
// The one and only application objectCWinApp theApp;using namespace std;
void GetMemSta(void)
{MEMORYSTATUS MemInfo ;GlobalMemoryStatus (&MemInfo) ;printf("\t Current Memory Status is : \n") ;printf("\t Total Physical Memory is % dMB\n",MemInfo. dwTotalPhys/(1024*1024)) ;printf("\t Available Physical Memoryis % dMB\n", MemInfo.dwAvailPhys/(1024*1024));printf("\t Total Page File is % dMB\n",MemInfo.dwTotalPageFile/(1024*1024)) ;printf("\t Available Page File is % dMB\n",MemInfo. dwAvailPageFile/(1024*1024)) ;printf("\t Total Virtual Memory is % dMB\n",MemInfo. dwTotalVirtual/(1024*1024)) ;printf("\t Available Virtual Memory is % dMB\n",MemInfo.dwAvailVirtual/(1024*1024)) ;printf("\t Memory Load is % d% %\n\n",MemInfo. dwMemoryLoad) ;
}int _tmain(int arcg, TCHAR* argv[],TCHAR* envp[])
{int nRetCode = 0 ;LPVOID BaseAdder ;char * str ;GetMemSta() ;printf("Now Allocate 32M Virtual Memory and 2M Physical Memory\n\n") ;BaseAdder = VirtualAlloc(NULL,1024*1024*32,MEM_RESERVE,PAGE_READWRITE) ;if (BaseAdder == NULL)printf("Virtual Allocate Fail\n") ;str = (char * )malloc(1024*1024*2) ;GetMemSta() ;printf("Now Release 32M Virtual Memory and 2M Physical Memory\n\n") ;if (VirtualFree(BaseAdder,0,MEM_RELEASE) == 0);printf("Release Allocation Fail\n ");free (str) ;GetMemSta() ;return nRetCode;
}

四、实验结果与总结

(1)程序开始运行时,显示可用物理内存为106MB,可用页文件大小为399MB,可用虚拟内存为2021MB。

(2)当分别使用函数VirtualAlloc()和malloc()分配了32MB虚拟内存和2MB物理内存后,系统显示可用物理内存为104MB,可用页文件大小为365MB,可用虚拟内存为1987MB。

(3)当分别使用函数VirtualFree()和free()释放了32MB虚拟内存和2MB物理内存后,系统的显示情况又恢复到了(1)的情况。

操作系统实验六、系统内存使用统计相关推荐

  1. 【操作系统】实验六 系统内存使用统计

    实验六 一.实验目的 (1)了解Windows内存管理机制,理解页式存储管理技术. (2)熟悉Windows内存管理基本数据结构. (3)掌握Windows内存管理基本API的使用. 二.实验准备 相 ...

  2. 操作系统实验六--设备管理

    文章目录 操作系统实验六--设备管理 一.实验目的 二.实验内容 三.设计原理及相关算法 四.结果分析 五.源代码 操作系统实验六–设备管理 一.实验目的 1.通过实验,进一步了解设备独立性的概念: ...

  3. 操作系统真象还原实验记录之实验六:内存分页

    操作系统真象还原实验记录之实验五:内存分页 对应书P199页 5.2 1.相关基础知识总结 页目录 页目录项 页表 页表项 物理页 虚拟地址 物理地址 概念略 页目录项及页表项 低12位都是属性.高2 ...

  4. 操作系统实验六 设备管理

    实验六 设备管理 一.实验目的 1. 理解设备管理的概念和任务. 2. 掌握独占设备的分配.回收等主要算法的原理并编程实现. 二.实验内容与基本要求 1. 在Windows系统中,编写程序实现对独占设 ...

  5. 操作系统实验11:内存管理实验(DAY 62)

    文章目录 1:实验要求: 2:代码实现 3:实验分析: 4:结果分析 1:出现两个进程 2:设置内存空间为256 3:再重复一次上一步操作 4:输入5,展示内存空间 5:输入4,杀死2号进程. 1:实 ...

  6. 操作系统实验六:Linux下的C语言编程

    实验六 Linux下的C语言编程 一.实验要求 (1)熟悉Linux环境下C语言应用程序开发的基本过程: (2)熟悉基本库函数的使用: (3)具有初步的应用程序设计能力. 二.实验内容 (1)有三个程 ...

  7. 操作系统实验六:作业调度算法模拟

    一.实验目的 (1)掌握周转时间.等待时间.平均周转时间等概念及其计算方法. (2)理解五种常用的进程调度算法(FCFS.SJF.HRRF.HPF.RR),区分算法之间的差异性,并用C语言模拟实现各算 ...

  8. 操作系统实验四:内存管理

    实验四 内存管理 一.实验要求 (1)通过在Linux环境下对内存管理的基本操作了解Linux如何对内存及虚拟内存进行管理: (2)掌握可变分区管理内存的方法. 二.实验内容 (1)验证实验: ① L ...

  9. 作业必备:操作系统实验六【生产者消费者实验:用信号量实现PV操作】

最新文章

  1. linux vim 基本操作
  2. Objective C 链式调用
  3. 虚拟机非法关机不能重启了
  4. 微信小程序点击button按钮后重置输入框等表单内容
  5. Linux单系统手动分区教程,【教程贴】Linux类系统手动操作篇--标准分区硬盘和目录扩容...
  6. lucene 增量 全量 更新索引_搜索引擎:该如何设计你的倒排索引?
  7. transform: translateY(-50%)实现垂直居中效果
  8. Linux C编程 —— 通过文件描述符获得文件路径
  9. python批量图片合并
  10. 基于DRL的城市TSC 综述笔记(一)
  11. MaxCompute 助力衣二三构建智能化运营工具
  12. 尚硅谷2021新版spring5课堂笔记
  13. P5149 会议座位(逆序对 离散化 hash 归并排序)
  14. 【Java学习笔记】2023_03_10Java基础
  15. harmonyos1.0.1,华为正式发布鸿蒙系统HarmonyOS 1.0
  16. ViewPager嵌套ViewPager,内层ViewPager
  17. 消除oracle 中 job 的时间误差?
  18. VS Code 空闲时的 CPU 使用率是 13%
  19. 南昌工学院计算机挂科率,南昌工学院一年预科心声
  20. 微信小程序云开发查询数据库结果为空

热门文章

  1. Adaptive Context Network for Scene Parsing
  2. Python 用 os.listdir() 获取文件列表和筛选特定格式文件
  3. os.listdir(path)
  4. 论文笔记:基于并行注意力 UNet的裂缝检测方法
  5. 筛法求素数 (20分)
  6. 基于51单片机的单电源函数信号发生器设计仿真原理图方案
  7. Altium Designer重拾之学习资料推荐
  8. 超外差,固定码,破解
  9. jsrun和runjs 哪家强?
  10. JAVA POI WORD XWPFDocument 常用操作-随时更新