Win API 内存整理
记得我的笔记本上曾经安装了一款名为内存整理大师的软件,当时觉得挺好用而且挺NB的,就是导致开机启动有点慢。
当时我就在想,内存整理是怎么实现的?不过那是水平实在是不怎么样,估计连windows程序的消息概念都不清楚吧。所以虽然不明白原因,但是觉得,很NB。
今天看到网上有关于EmptyWorkingSet函数的介绍,然后就看了下。看那几个函数的调用,不是很明白,所以直接去MSDN查看函数原型以及介绍。
看明白了那两个函数,就突然觉得,实现内存整理太简单了……
首先摆出来几个API函数,分别是:
EnumProcess http://msdn.microsoft.com/en-us/library/windows/desktop/ms682629(v=vs.85).aspx
OpenProcess http://msdn.microsoft.com/en-us/library/windows/desktop/ms684320(v=vs.85).aspx
SetProcessWorkingSetSize http://msdn.microsoft.com/en-us/library/windows/desktop/ms686234(v=vs.85).aspx
EmptyWorkingSet http://msdn.microsoft.com/en-us/library/windows/desktop/ms682606(v=vs.85).aspx
看原型,点连接……
其中第一个函数的作用,就是枚举全部的运行中进程,将其所有的进程ID放入到一个数组中。
第二个函数的作用,是根据进城ID获取到进程句柄。这里需要提一点的就是,在其flag标志位中需要特别设置
第三个函数的作用,设置此进程的工作集大小。
第四个函数的作用,清理指定进程工作集中未使用的页。
这里涉及一个概念,就是工作集。什么是工作集呢?其实最简单的理解,就是进程一映射到物理内存的部分。
这个概念的出现,是因为如果把一个进程的全部代码和资源都映射到内存中,必然存在很大的浪费,毕竟一个程序的执行代码使用率不是均等的。把使用率高的代码和资源映射到内存,把使用率低的代码调到虚拟从内存中显然是很明智的选择。我就理解到这啦,如果理解有误,欢迎更正。
所以步骤如下:
1调用 EnumProcess 函数获取进程ID列表
2做一个循环,对其进行如下访问:
2.1调用OpenProcess函数以PROCESS_SET_QUOTA权限打开进程句柄。
2.2调用SetProcessWorkingSetSize函数来对指定进程的工作集进行紧缩,后两个参数只均为-1,尽可能空余出来未使用的页(page)。
2.3调用EmptyWorkingSet函数来清除进程中未使用的页
2.4关闭句柄
3 完成
简单的很是吧?没错,就是这么简单。
所以现在对于当时的那个什么内存管理大师特别不屑一顾,还好意思说大师……那可真是遍地都是大师了。
运行效果如下:
整理前:
整理后:

简单整理一下代码,贴下来如下:
#include <windows.h>
#include <iostream>
#include <cstdlib>
#include <Psapi.h>
#include <TlHelp32.h>
#include <assert.h>
#pragma comment(lib, "Iphlpapi")
#pragma comment(lib, "Psapi") int _tmain(int argc, _TCHAR* argv[])
{
DWORD pdwPIDArray[];
TCHAR StrBuf[];
DWORD dwPIDArraySize;
EnumProcesses(pdwPIDArray, , &dwPIDArraySize);
for(int i = ; i < dwPIDArraySize; ++ i)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_SET_QUOTA, , pdwPIDArray[i]);
SetProcessWorkingSetSize(hProcess, -, -);
EmptyWorkingSet(hProcess);
CloseHandle(hProcess);
}
system("pause");
return ;
}
Win API 内存整理的更多相关文章
- 文件操作(CRT、C++、WIN API、MFC)
一.使用CRT函数文件操作 二.使用标准C++库 std::fstream std::string 1)std::string对象内部存储了一个C的字符串,以'\0'结尾的. 2)std::strin ...
- 如何使用google地图的api(整理)
如何使用google地图的api(整理) 一.总结 一句话总结:直接用script标签引google地图api即可. 1.如何使用google地图的api? 页面引用javascript文件<s ...
- 【百度地图API】多家地图API内存消耗对比测验(带源码)
原文:[百度地图API]多家地图API内存消耗对比测验(带源码) 任务描述: 啊,美妙的春节结束了.酸奶小妹和妈妈的山西平遥之旅也宣告成功!距离平遥古城7km,有一个同样身为“世界文化遗产”的寺庙,叫 ...
- C#用WebBrowser与WIN API辅助模拟获取网站完整Cookie
网上找到的可以完整获取Cookie的方法,转载一下希望能帮助更多人. 亲测可用 在Winform中使用WebBrowser控件获取网站的Cookie有时候是不完整的,默认调用Document.Cook ...
- 各类无次数限制的免费API接口整理
各类无次数限制的免费API接口整理,主要是聚合数据上和API Store上的一些,还有一些其他的. 聚合数据提供30大类,160种以上基础数据API服务,国内最大的基础数据API服务,下面就罗列一些免 ...
- 黑客编程教程(二)Win API编程简介
第二节 Win API编程简介 下面介绍一下WIN API. 我们需要自己编写一个工具时,必然会用到很多操作windows和控制windows的函数,这些函数就是windows API. API是Ap ...
- C# 调用win api获取chrome浏览器中地址
//FindWindow 查找窗口 //FindWindowEx查找子窗口 //EnumWindows列举屏幕上的所有顶层窗口,如果回调函数成功则返回非零,失败则返回零 //GetWindowText ...
- Win API:之GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId
Win API:之GetCurrentThread.GetCurrentThreadId.GetCurrentProcess.GetCurrentProcessId {返回当前线程的虚拟句柄} Get ...
- 网络免费API接口整理
转载自: https://www.cnblogs.com/doit8791/p/9351629.html 从网上看到一些免费API接口,在个人开发小程序等应用练手时可试用. 各类无次数限制的免费API ...
随机推荐
- python 解析web接口的json数据
实例1-使用urllib2 #utf-8 import urllib2 import json url="http://xxx.com" #获取json格式的字符串 page=ur ...
- 在ubuntu上搭建reviewboard
review board 2.0.5 ubuntu ubuntu-12.04.1-desktop-amd64 基本上基于这个教程:http://alephnullplex.appspot.com/bl ...
- 02.Apache FtpServer使用数据库管理用户
1.创建数据库及表 使用\apache-ftpserver-1.0.6\res\ftp-db.sql建表,内容如下: CREATE TABLE FTP_USER ( userid VARCHAR(64 ...
- BZOJ1565 植物大战僵尸
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1565 这题看上去并不会做,结果又是最大权闭合子图的裸题. 于是就去看了一发论文,明白建图的 ...
- 图片放大镜插件 Cloud Zoom v3.1
Cloud Zoom是一个图像放大jQuery插件,效果堪比Magic Zoom.相对于流行jQZoom插件,Cloud Zoom体积小,有更多的功能和更强大的跨浏览器兼容性. 猛击这里查看演示DEM ...
- 贴代码—CF230 DIV1 B
题目在此: http://codeforces.com/contest/392/problem/B 一直理解错了一句话,以为是用最小的move求最小的花费, 读错题目的有木有!!! 不懂汉诺塔的原理有 ...
- Oracle自带的用户
Oracle安装完毕创建数据库实例的时候,会自动生成三个用户sys,system,scott. sys用户是超级管理员,具有最高权限,充当sysdba角色,可以执行create database,默认 ...
- 斌哥的 Docker 进阶指南—监控方案的实现
过去的一年中,关于 Docker 的话题从未断过,而如今,从尝试 Docker 到最终决定使用 Docker 的转化率依然在逐步升高,关于 Docker 的讨论更是有增无减.另一方面,大家的注意力也渐 ...
- javascript 注意事项
1.submit input 标签的 type里的submit是提交表单的按钮 提交时应注意 为 标签加上 “name=""”字段和form标签,才能达到想要的效果 2.正则表达 ...
- HDU 2159 FATE (二维完全背包
FATE http://acm.hdu.edu.cn/showproblem.php?pid=2159 Problem Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备 ...