您的位置:首页 > 运维架构 > Linux

WINDOWs平台,利用CreateProcess实现进程复制

2009-11-13 23:48 696 查看
由于某种原因,要实现在主机端空CPU与内存利用的工具,CPU还比较容易控制,但内存控制比较不容易。

 

在WINDOWs/Linux平台上,用户进程虽然有4G逻辑地址空间,但实际上用户可控制的只有2G(Linux应为3G)的地址空间

 

因此在主机端内存大于2G以后,单进程无法控制内存利用率,需要将当前进程复制一份,或者多份(在Linux下fork() 可实现该功能,但Windows实现起来比较不容易)

 

 

首先定义读取内存信息,包括物理内存总量 与可用内存总量

 

runmemory.h 头文件定义

 
#ifndef _RUN_MEMORY_H

#define  _RUN_MEMORY_H

struct MemoryInfo
{
unsigned long totalPhyMemory;

unsigned long availablePhyMemory;
};

class MemoryInfoManager
{

public:
MemoryInfoManager();

public:
~MemoryInfoManager();

public:
MemoryInfo *GetMemoryInfo();
};

#endif
 

 

runmemory.cpp 文件定义

 

#include "windows.h"
#include "runmemory.h"

MemoryInfoManager::MemoryInfoManager()
{

}

MemoryInfoManager::~MemoryInfoManager()
{

}

MemoryInfo* MemoryInfoManager::GetMemoryInfo()
{
MEMORYSTATUS memoryStatus;

memoryStatus.dwLength=sizeof(MEMORYSTATUS);

GlobalMemoryStatus(&memoryStatus);

MemoryInfo *info=new MemoryInfo;

info->totalPhyMemory=memoryStatus.dwTotalPhys;

info->availablePhyMemory=memoryStatus.dwAvailPhys;

return  info;
}


 

 

主文件定义

#include "windows.h"
#include <iostream>

#include "runmemory.h"

using namespace std;

int main(int argc,char* argv[])
{

cout<<argv[0]<<endl;
STARTUPINFO si; //一些必备参数设置
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi; //必备参数设置结束

char *cmdLine=new char[sizeof(argv[0])+10];

cmdLine=strcat(argv[0]," 100");
if(argc<2)
{
if(!CreateProcess(NULL,cmdLine,NULL,NULL,FALSE,NULL
,NULL,NULL,&si,&pi))
//"d://test//te.exe"是您要运行的程序//的路径
{
cout<<"Create Fail!"<<endl;
exit(1);
}
else
{
cout<<"Success!"<<endl;
}
}

MemoryInfoManager manager;

while(TRUE)
{
Sleep(2000);

MemoryInfo *info=manager.GetMemoryInfo();

cout<<"Total Physical Memory:"<<info->totalPhyMemory<<" Available Physical Memory:"<<info->availablePhyMemory<<endl;

delete info;
cout<<"resume"<<endl;
}

return 0;

}


 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息