• Win API 内存整理


    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 完成

    简单的很是吧?没错,就是这么简单。

    所以现在对于当时的那个什么内存管理大师特别不屑一顾,还好意思说大师……那可真是遍地都是大师了。

    运行效果如下:

    整理前:

    整理后:

    简单整理一下代码,贴下来如下:

    复制代码
     1 #include <windows.h>
     2 #include <iostream>
     3 #include <cstdlib>
     4 #include <Psapi.h>
     5 #include <TlHelp32.h>
     6 #include <assert.h>
     7 #pragma comment(lib, "Iphlpapi")
     8 #pragma comment(lib, "Psapi")
     9 
    10 int _tmain(int argc, _TCHAR* argv[])
    11 {
    12     DWORD pdwPIDArray[512];
    13     TCHAR StrBuf[128];
    14     DWORD dwPIDArraySize;
    15     EnumProcesses(pdwPIDArray, 512, &dwPIDArraySize);
    16     for(int i = 0; i < dwPIDArraySize; ++ i)
    17     {
    18         HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_SET_QUOTA, 0, pdwPIDArray[i]);
    19         SetProcessWorkingSetSize(hProcess, -1, -1);
    20         EmptyWorkingSet(hProcess);
    21         CloseHandle(hProcess);
    22     }
    23     system("pause");
    24     return 0;
    25 }
    复制代码
     
     
    分类: C/C++
  • 相关阅读:
    JAVA之代理2CGLib
    Java并发编程:Lock
    synchronized详解
    redis哨兵机制--配置文件sentinel.conf详解
    redis.conf讲解
    [Java并发包学习八]深度剖析ConcurrentHashMap
    [Java并发包学习七]解密ThreadLocal
    T和Class以及Class的理解
    python学习笔记十:异常
    python学习笔记九:正则表达式
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3308940.html
Copyright © 2020-2023  润新知