对windows系统内存使用统计的分析

Linux内核:系统内存使用统计 该实验通过使用Windows系统提供的函数和数据结构显示了系统存储空间的使用情况,当内存和虚拟存储空间变化时,观察到系统显示变化情况如下:(1)程序开始运行时,显示可用物理内存为330MB,可用页文件大小为1097MB,可用虚拟内存为2031MB。(2)当分别使用函数VirtualAlloc()和malloc()分配了32MB虚拟内存和2MB物理内存后,系统显示可用物理内存为328MB,可用页文件大小为1063MB,可用虚拟内存为1997MB。 阅读详情

实验题目:系统内存使用统计
一、实验目的
1、了解Windows内存管理机制,了解页式存储管理技术。
2、熟悉Windows内存管理基本数据结构。
3、使用Windows内存管理基本API的使用
二、实验要求
1、使用Windows系统提供的函数和数据结构显示系统存储空间的使用情况。
2、内存和虚拟存储空间变化时,给出系统显示变化结果。
3、分析实验结果。

入坑(全网都是这一个的改编)

错误代码(但大家都在用):

#include "stdio.h"
#include "windows.h"

void MemoryStatus(void)                             //统计内存的状态
{
	MEMORYSTATUS lpmemory;

	GlobalMemoryStatus(&lpmemory);//此函数用来获得当前可用的物理和虚拟内存信息

	printf("物理内存总大小: %dMB\n", lpmemory.dwTotalPhys / (1024 * 1024));
	printf("可用物理内存: %dMB\n", lpmemory.dwAvailPhys / (1024 * 1024));
	printf("页文件总大小: %dMB\n", lpmemory.dwTotalPageFile / (1024 * 1024));
	printf("可用页文件大小: %dMB\n", lpmemory.dwAvailPageFile / (1024 * 1024));
	printf("虚拟地址空间总大小: %dMB\n", lpmemory.dwTotalVirtual / (1024 * 1024));
	printf("可用虚拟地址空间大小:%dMB\n", lpmemory.dwAvailVirtual / (1024 * 1024));
	printf("内存加载率: %d%% \n", lpmemory.dwMemoryLoad);
}

int main()
{

	LPVOID  Virtualbase;
	char *string;
	printf("================当前内存的使用情况================\n");
	MemoryStatus();//获取当前的内存状态
	printf("\n\n现在开始分配10MB物理内存和100MB虚拟内存\n\n");
	string = (char *)malloc(10 * 1024 * 1024); //分配物理内存
	Virtualbase = VirtualAlloc(NULL, 100 * 1024 * 1024 , MEM_COMMIT, PAGE_READWRITE);             //分配虚拟内存
	if (Virtualbase == NULL)	printf("虚拟内存分配失败\n");
	
	printf("================分配完之后的内存状态如下================\n");
	MemoryStatus();
	printf("\n\n现在开始分配10MB物理内存和100MB虚拟内存\n\n");
	free(string);  //释放物理内存
	if (VirtualFree(Virtualbase, 0, MEM_RELEASE)==0) //释放虚拟内存
		printf("释放虚拟内存失败!!\n");
	
	printf("================释放完之后的内存状态如下================\n");
	MemoryStatus();

	return 0;

}

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结果分析:
(1)对于物理内存,我选择分配10MB(对于MB分配的时候,这个单位应该是1024*1024),但是分配之后的结果出现了三种:大于、小于、等于10MB的都有;另外,释放完之后一般是回不到最初的状态。
(2)对于虚拟内存,分配的是100MB,结果显示分配的大小总是:分配的虚拟内存+分配的物理内存,释放完之后都能回到最初的状态。
这已经出现问题了,完全不符合预期结果?!是的,真的达不到预期!!!
即使从分页管理方式碎片、用户行为不能对内存修改等这样的角度,总有说不通的地方。

出坑尝试

从老师那里得知,malloc申请的是虚拟内存,因此,尝试将malloc换成new。
new的正确打开方式:

char *string=new char[10 * 1024 * 1024];

释放new的正确打开方式:

delete string;

观察运行结果:
在这里插入图片描述
事实上,和malloc没什么区别。
原来new在Windows中也是在堆中分配,应该也是虚拟内存。

出坑的正确打开方式

最简单的方法就是:去了解windows系统的内存管理机制
(不过,网上这方面的资料真的不多,原创的更是少)
这里贴出来查到的一些优质文章:
全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
全面介绍Windows内存管理机制及C++内存分配实例(二):内存状态查询
全面介绍Windows内存管理机制及C++内存分配实例(三):虚拟内存
改后的代码:

#include<stdio.h>
#include<Windows.h>
#include<iostream>
using namespace std;

//尝试调用Windows API激活Lock Pages in Memory权限
BOOL LoggedSetLockPagesPrivilege(HANDLE hProcess, BOOL bEnable)
{
	struct {
		DWORD Count;//数组的个数
		LUID_AND_ATTRIBUTES Privilege[1];
	} Info;

	HANDLE Token;

	//打开本进程的权限句柄
	BOOL Result = OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&Token);
	if(Result != TRUE)
	{
		printf("不能打开进程的权限句柄\n");
		return FALSE;
	}
	else
	{
		printf("能打开进程的权限句柄\n");
	}

	//只改变一个属性
	Info.Count = 1;
	//准备激活
	if (bEnable)
		Info.Privilege[0].Attributes = SE_PRIVILEGE_ENABLED;
	else
		Info.Privilege[0].Attributes = 0;

	//根据权限名字找到LGUID
	Result = LookupPrivilegeValue(NULL,SE_LOCK_MEMORY_NAME,&(Info.Privilege[0].Luid));
	if (Result != TRUE)
	{
		printf("无法获取内存中锁定页SE_LOCK_MEMORY_NAME的权限\n");
		return FALSE;
	}
	else
		printf("可获取内存中锁定页SE_LOCK_MEMORY_NAME的权限\n");

	// 激活Lock Pages in Memory权限
	Result = AdjustTokenPrivileges(Token, FALSE, (PTOKEN_PRIVILEGES)&Info, 0, NULL, NULL);
	if (Result != TRUE)
	{
		printf("不能调整进程句柄权限", GetLastError());
		return FALSE;
	}
	else
	{
		if (GetLastError() != ERROR_SUCCESS)
		{
			printf("不能使用内存中锁定页SE_LOCK_MEMORY_NAME权限\n");
			printf("请检查本地权限\n");
			printf("\n");
			return FALSE;
		}

	}
	CloseHandle(Token);
	return TRUE;
}


//内存和虚拟存储空间变化情况
void D_F()
{

	const int content=100;
	MEMORYSTATUS memStatusVirtual;
	GlobalMemoryStatus(&memStatusVirtual);

	PVOID pVirtual = VirtualAlloc(NULL, content * 1024 * 1024, MEM_RESERVE | MEM_PHYSICAL, PAGE_READWRITE);
	if (pVirtual == NULL)
		cout << "没有那么大连续进程空间!" << endl;

	MEMORYSTATUS memStatusVirtual2;
	GlobalMemoryStatus(&memStatusVirtual2);

	cout << "=========分配虚拟内存(可用进程空间)=========" << endl;
	cout << "减少物理内存=" << memStatusVirtual.dwAvailPhys - memStatusVirtual2.dwAvailPhys << endl;
	cout << "减少可用页文件=" << memStatusVirtual.dwAvailPageFile - memStatusVirtual2.dwAvailPageFile << endl;
	cout << "减少可用进程空间="
		<< memStatusVirtual.dwAvailVirtual - memStatusVirtual2.dwAvailVirtual << endl;
	cout << endl;
	if (VirtualFree(pVirtual, 0, MEM_RELEASE) == 0)//释放虚拟内存
		printf("释放虚拟内存失败\n");
	
	MEMORYSTATUS memStatusVirtual3;
	GlobalMemoryStatus(&memStatusVirtual3);
	cout << "=========释放虚拟内存(可用进程空间)=========" << endl;
	cout << "增加可用进程空间="
		<< memStatusVirtual3.dwAvailVirtual- memStatusVirtual2.dwAvailVirtual << endl << endl;
	cout << endl;

	LoggedSetLockPagesPrivilege(GetCurrentProcess(), true);//尝试调用Windows API激活Lock Pages in Memory权限

	//物理内存的变化情况
	SYSTEM_INFO sysInfo;
	GetSystemInfo(&sysInfo);

	ULONG_PTR pages = (ULONG_PTR)100 * 1024 * 1024 / sysInfo.dwPageSize;
	ULONG_PTR *frameArray = new ULONG_PTR[pages];

	//如果没激活权限,是不能调用这个方法的,可以调用,但是返回FALSE
	BOOL flag = AllocateUserPhysicalPages(GetCurrentProcess(), &pages, frameArray);

	if (flag == false)
	{
		cout << "=========物理内存分配=========" << endl;
		cout << "分配物理内存失败!" << endl;
		cout << endl << endl;
		system("pause");
	}
	else
	{
		MEMORYSTATUS memStatusVirtual4;
		GlobalMemoryStatus(&memStatusVirtual4);

		cout << "=========分配物理内存=========" << endl;
		cout << "减少物理内存=" << memStatusVirtual3.dwAvailPhys - memStatusVirtual4.dwAvailPhys << endl;
		cout << "减少可用页文件=" << memStatusVirtual3.dwAvailPageFile - memStatusVirtual4.dwAvailPageFile << endl;
		cout << "减少可用进程空间=" << memStatusVirtual3.dwAvailVirtual - memStatusVirtual4.dwAvailVirtual << endl << endl;

		MEMORYSTATUS memStatusVirtual5;
		GlobalMemoryStatus(&memStatusVirtual5);
		cout << "=========释放物理内存=========" << endl;
		cout << "增加物理内存=" << memStatusVirtual5.dwAvailPhys - memStatusVirtual4.dwAvailPhys << endl;
		
	}
}

int main()
{
	D_F();	
	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述
结果分析:
本实验采取了先对虚拟内存进行分配和释放,再对物理内存进行分配和释放的方式,通过Windows系统提供的函数和数据结构显示观察了虚拟内存空间和物理内存空间的变化,显示结果如以上两图所示。通过实验结果分析,具体如下:
(1)对于虚拟内存来说,分配时有时会产生页目和页表放在物理内存里,相应地物理内存会减小(减少的物理内存比较小),释放分配的虚拟内存时,增加的虚拟内存空间大小=减少的虚拟内存空间大小,符合预期结果。
(2)对于物理内存来说,用户行为往往不能改变物理内存的分配和释放,在本实验中,对激活物理内存中的锁定页进行了尝试,虽然能打开进程的权限句柄并获取到内存锁定页的权限,但是却不能使用内存锁定页的权限,所以最终无法分配物理内存。
(3)如果想要进一步解决不能使用内存中锁定页权限的问题,可以通过查阅资料,检查本地权限,然后对其尝试不同的方式进行修改。
(终于可以把自己说服了)

小小总结一下

(1)malloc和new在windows系统中分配的都是虚拟内存。
(2)如果想要分配物理内存,需要调用allocateuserphysicalpages命令。(但是,使用这个API之前,需要激活内存中锁定页权限,因为用户行为是不能对物理内存进行修改的)

结语

如果你喜欢我写的文章,欢迎来踩我个人搭建的博客~
ChengNing’s Blog

WinDbg使用教程:使用!address和!pool分析内核泄漏基础篇 通过windbg使用教程掌握!address和!pool命令,深入分析Windows内核内存泄漏问题,定位资源异常消耗的关键线索,提升系统调试效率。 阅读详情

相关推荐

如何在Windows系统中获取单个进程的CPU使用率?

CPU使用率和内存使用率是衡量系统性能的两个关键指标。CPU使用率显示了处理器的工作负载,它表明CPU在特定时间段内执行任务所花费的时间比例。内存使用率则指示了计算机的随机存取存储器(RAM)的使用情况,反映了系统用于存储运行中程序和数据的内存空间的占用率。psutilWMI,即Windows Management Instrumentation,是Windows操作系统中的一个重要管理框架。它为获取操作系统、硬件、应用程序和服务的管理信息提供了标准化的方法。

weixin_42577735的博客 1572

实验六 系统内存使用统计

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

G453473123的博客 1309

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

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

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

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

晚安Alice 1552

医疗影像技术实战:如何用Python快速生成DRR图像(附完整代码)

本文详细介绍了如何使用Python实现数字重建放射影像的快速生成。通过实战代码,从基础光线投射算法到性能优化,逐步讲解DRR图像生成的核心原理与工程实践,帮助开发者掌握医疗影像处理的关键技术,赋能放射治疗规划与图像引导手术等临床工具开发。

k8l9m0n的博客 72

POVME3口袋体积计算:从.ini配置到实战解析

本文详细解析了POVME3口袋体积计算工具,从核心原理、环境准备到实战应用。重点剖析了控制计算行为的.ini配置文件,包括如何定义口袋区域、精修范围及锁定目标,并提供了固定坐标与配体引导两种实战策略,帮助研究人员从分子动力学轨迹中量化分析蛋白质结合口袋的动态变化。

weixin_29043895的博客 537

window系统CMD查看内存使用情况

打开CMD输入: systeminfo 单击回车

weixin_44708254的博客 1万+

嵌入式设备低功耗设计误区:为什么你的RK3568总是被‘意外’唤醒?

本文深入分析RK3568嵌入式设备低功耗设计中的常见误区,重点探讨唤醒源管理不当导致的意外唤醒问题。通过解析硬件设计陷阱、软件配置错误及系统化审计方法,帮助开发者有效排查和解决GPIO配置、唤醒源设置等关键因素引起的功耗异常,提升设备续航能力。

php55的博客 460

ProcessHacker内存碎片分析:评估系统内存使用效率的终极工具

ProcessHacker是一款免费、功能强大的多用途系统工具,主要用于监控系统资源、调试软件和检测恶意软件。本文将聚焦其内存碎片分析功能,教你如何利用这款工具评估系统内存使用效率,解决内存管理难题。 ## 什么是内存碎片?为何它如此重要? 内存碎片是指系统内存中存在大量不连续的空闲块,虽然总空闲内存可能足够,但由于这些块太小或分散,导致无法满足大内存分配请求的现象。严重的内存碎片会导致: -

gitblog_00636的博客 486

一份针对零基础学习AI Agent详细学习计划

以下是针对零基础学习者制定的AI Agent详细学习计划,结合最新行业动态和实用资源推荐,帮助你从入门到进阶系统掌握核心技能

sexy19910923的博客 1904

APS生产排程系统——ERP、MES、APS系统的关联和区别

APS生产排程系统——ERP、MES、APS系统的关联和区别

这里有一只小马吖 2万+

【亲测免费】 Windows内存监控工具-MemoryMonitor

Windows内存监控工具-MemoryMonitor 【下载地址】Windows内存监控工具-MemoryMonitor MemoryMonitor是一款专为Windows平台设计的内存监控工具,能够精确统计程序的内存使用情况,帮助用户深入分析程序性能并优化内存管理。通过实时监控和详细的数据统计,MemoryMonit...

gitblog_06728的博客 677

新手如何结合pbootCMS和宝塔面板快速构建网站

摘要: 新手可通过pbootCMS(轻量CMS)和宝塔面板(可视化工具)快速搭建网站,无需命令行。步骤包括:1) 准备服务器(Linux/CentOS7.x)和域名;2) 安装宝塔面板并配置LNMP环境(PHP7.4+MySQL5.7);3) 创建网站目录,上传并解压pbootCMS源码,设置文件权限;4) 运行安装向导,填写数据库信息和管理员账号;5) 测试前台/后台功能,优化性能并绑定域名。全程约30-60分钟,宝塔简化运维,pbootCMS便于内容管理,适合零基础用户。注意定期更新和备份以保障安全。

qinzhenyan的博客 1642

Windows---进程状态信息获取的核心接口<Psapi.h>

摘要: Windows系统编程中,<Psapi.h>头文件提供了一组API用于查询进程和模块的详细状态信息,包括进程ID、模块路径、内存使用情况等。其核心功能包括进程枚举、模块信息查询和内存统计,适用于系统监控和调试工具开发。与<TlHelp32.h>相比,<Psapi.h>更注重实时性和精细化数据,但需要更高的权限。主要数据结构包括MODULEINFO(模块基地址、大小)和PROCESS_MEMORY_COUNTERS_EX(内存统计),关键API如EnumProces

MzKyle的博客 846

GEE土地分类:一文读懂精度评定—混淆矩阵confusion matrix、整体精度OA、用户者精度、生产者精度、kappa系数和F1score系数含案例

本文介绍了如何在 Google Earth Engine (GEE) 中构建和分析混淆矩阵,以评估分类模型的性能。首先,通过 ee.Array 构建混淆矩阵,并展示了如何指定自定义类标签。接着,计算了多种性能指标,包括准确率、Kappa 值、F1-score、消费者准确率和生产者准确率。此外,还演示了如何计算不同类别的 F1-score。最后,通过一个实际案例,展示了如何利用 GEE 进行土地分类,并评估分类器的性能,包括训练和验证样本的准确率、Kappa 值等指标。这些步骤帮助用户理解模型的优缺点,并进行

此星光明博客 443

信号处理仿真:自适应信号处理_(8).自适应信道均衡

在无线通信系统中,信道的多径效应和时变特性会导致信号的失真,从而影响通信质量。自适应信道均衡技术通过实时调整均衡器的参数,以补偿信道失真,提高信号的质量和可靠性。本节将详细介绍自适应信道均衡的原理、算法和实现方法,并通过具体的仿真例子来说明其应用。

2401_87715305的博客 1039

Python 解析 Windows 进程信息并获取内存占用情况

Windows 操作系统通过任务管理器为我们提供了丰富的进程信息,包括 CPU 占用率、内存使用量等。然而,有时候我们需要通过编程的方式获取这些信息,以便自动化处理或集成到其他系统中。Python 提供了多种库来实现这一目标,其中最常用的是psutil库。通过使用 Python 的psutil库,我们可以轻松地解析 Windows 进程信息并获取内存占用情况。无论是基础的内存使用统计还是更详细的内存分析,psutil都能提供强大的支持。

2501_91169478的博客 497

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

操作系统统计

本文对操作系统的市场份额、性能和安全性进行了统计分析。从统计数据来看,Windows操作系统在市场份额、性能和安全性方面均具有优势。然而,随着Linux等开源操作系统的崛起,市场竞争愈发激烈。未来,操作系统市场将呈现出多元化的发展趋势。

wjs2024的博客 2450

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

网速内存监控难?TrafficMonitor悬浮窗3步实现实时监测,效率提升50% Windows系统监控工具有哪些?TrafficMonitor轻量级工具推荐,支持任务栏嵌入显示

TrafficMonitor是一款专注于的轻量级工具,核心优势在于,能有效解决等问题,适配等高频使用场景。

wzk1681106的博客 1121

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

linux 下 任务管理器,Linux/Unix下的任务管理器-top命令

Windows下的任务管理器虽然不好用(个人更喜欢Process Explorer些),但也算方便,可以方便的查看进程,CPU,内存...也可以很容易的结束进程没有图形化界面下的Linux,也有命令可以实现Windows的任务管理器功能,这个命令就是"top",用户可以使用top来对进程排序,结束进程等.top 命令是 Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,默...

weixin_30610943的博客 308

Windows系统CPU内存网络性能统计第一篇 内存

最近翻出以前做过的Windows系统性能统计程序,这个程序可以统计系统中的CPU使用情况,内存使用情况以及网络流量。现在将其整理一下(共有三篇),希望对大家有所帮助。 目录如下: 1.《Windows系统CPU内存网络性能统计第一篇 内存》 2.《Windows系统CPU内存网络性能统计第二篇 CPU》 3.《Windows系统CPU内存网络性能统计第三篇网络流量》

fkfang的专栏 565

Windows查看Java内存使用情况

目录 1. 场景 2. jconsul使用 3. jconsul和任务管理器配合查看内存 4. Windows自带Java内存查看工具以及命令 5. 总结 1. 场景 有时候我们启动了多个java程序,需要查看各个java程序占用的的内存情况。 打开任务管理器选择“进程”,发现有好多java.exe进程,无法直接查看内存使用情况。 jconsole定义:jconsole是一个用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。 jps:与uni...

Map的博客 1万+

Windows进程内存使用分析 --- VMMap工具使用

VMMap下载地址:https://docs.microsoft.com/en-us/sysinternals/downloads/vmmap VMMap名词说明 Committed: 进程向OS宣称要使用的内存大小(在虚拟内存进行了分配),基本上都不等于进程实际使用的物理内存大小。一是其中统计了进程所链接的所有动态库的空间,比如标准C库,而实际上OS在内存中只加载一份C库的代码段,所有进程共...

To Be A Linux Graphics Coder 6661

介绍一个内存使用情况的统计工具:vmmap

最近接到一个任务,需要分析一下当前产品的内存使用情况,按照常理来书windows系统自带的任务管理器已经能够满足需求了,但是只是针对于整个进程在满负荷下的内存使用情况的了解提供的信息量并不足,因为需要有一个详细的内存使用情况的分析,从而能够对现有程序进行优化,所以这势必要分析出一些模块或者第三方库的内存使用情况,只有这样才能找准优化的方向。之前使用过sysinternal的Process ex

2374

windows下搭建python统计分析的环境

Windows下python统计分析环境搭建 Windows下使用Python进行统计分析的环境, 最简单的安装方法是下载Anaconda(https://www.anaconda.com/products/individual#Downloads并进行安装即可使用, 避免安装一个个的第三方包. 但是Anaconda比较大, 导致下载安装较慢, 另外其使用Python往往不是最新的. 只有自己动手搭建才可以使用最新的版本的Python. 一个基本的Python统计分析环境需要如下软件包: Numpy: 是

qq_35125180的博客 316

Fort Firewall:Windows防火墙的智能流量统计系统深度解析

在当今数字化时代,网络流量管理已成为每个Windows用户不可或缺的需求。无论你是普通用户想要监控家庭网络使用情况,还是企业管理员需要精细管控办公带宽,一个强大的流量统计系统都能为你提供关键的网络洞察力。Fort Firewall作为一款专为Windows系统设计的防火墙软件,其内置的智能流量统计系统正是解决这些痛点的利器。 ## 流量统计系统架构:三层设计理念 Fort Firewall的流

gitblog_00643的博客 848
上一篇: 计算机视觉之相机成像几何模型(原理)与相机标定内参和外参(代码)
下一篇: 页面置换算法(FIFO+LRU+Clock)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值