操作系统内存分配c语言,操作系统:内存分配(C语言 winapi)

//windows 内存分配. windows/visual stdio*/cl xxx.cpp

#include #include#include#include#include#include#include

using namespacestd;

DWORD dwID;

MEMORYSTATUS memInfo;#define C(I, S) CreateSemaphore(NULL, (I), 3, (S))

#define P(S) WaitForSingleObject((S), INFINITE)

#define V(S) ReleaseSemaphore((S), 1, NULL)

#define CT(func, args) CreateThread(NULL, 0, (func), (args), 0, &dwID)

#define PM(num, S) WaitForMultipleObjects((num), (S), true, INFINITE)DWORD WINAPI Tracer(LPVOID lpParam);

HANDLE hThread;

HANDLE s1, s2;

LPVOID lpvBase;//整个大内存基址

LPTSTR lpNxtPage; //下一个页面地址

LPTSTR lpPtr; //字符指针,用于测试访问,赋值

DWORD PageSize; //页面大小

DWORD showSysInfo()

{

SYSTEM_INFO siSysInfo;

GetSystemInfo(&siSysInfo);

cout<< "---------------BEG SYSTEM_INFO---------------" <

cout<< "OEM ID:" << siSysInfo.dwOemId <

cout<< "Number of processors:" << siSysInfo.dwNumberOfProcessors <

cout<< "Page size:" << siSysInfo.dwPageSize <

cout<< "Processor type:" << siSysInfo.dwProcessorType <

cout<< "Minimum application address:" << siSysInfo.lpMinimumApplicationAddress <

cout<< "Maximum application address:" << siSysInfo.lpMaximumApplicationAddress <

cout<< "---------------END SYSTEM_INFO---------------\n\n";returnsiSysInfo.dwPageSize;

}void showMemStatus(const char*s)

{

GlobalMemoryStatus(&memInfo);

cout<

cout<< hex << "dwAvailPhys: 0x" << memInfo.dwAvailPhys << ", dwAvailPageFile: 0x" <

}

DWORD WINAPI Tracer(LPVOID lpParam)

{for(int i = 0; i < 3; ++i) {

P(s2);

showMemStatus("提交页面了并且赋值了");

V(s1);

}return 0;

}

INT PageFaultExceptionFilter(DWORD dwCode)

{

LPVOID lpvResult;

cout<< "访问异常, 错误代码 = 0x" << dwCode << endl <

lpvResult= VirtualAlloc((LPVOID)lpNxtPage, 10000*PageSize, MEM_COMMIT, PAGE_READWRITE);if (lpvResult ==NULL) {

cout<< "VirtualAlloc failed" << endl <

}else{

showMemStatus("刚刚提交完页面");

}

lpNxtPage= (LPTSTR) ((PCHAR) lpNxtPage + 10000*PageSize);returnEXCEPTION_CONTINUE_EXECUTION;

}intmain()

{

PageSize=showSysInfo();

s1= C(1, "ss1");

s2= C(0, "ss2");

hThread=CT(Tracer, NULL);

showMemStatus("之前");

lpvBase= VirtualAlloc(NULL, 30000*PageSize, MEM_RESERVE, PAGE_NOACCESS); //先设置noacess, 赋值会出错,执行PageFaultExceptionFilter//cout <

if (lpvBase ==NULL) {

cout<< GetLastError() <

}else{

cout<< "成功初始化保留页面" <

}

showMemStatus("初始化: 保留页面");

lpPtr= lpNxtPage =(LPTSTR) lpvBase;for(int i = 0;i < 3; ++i) {

P(s1);for(int j = 0; j < 10000*PageSize; ++j) {

__try {//测试给申请的内存赋值

lpPtr[10000*i*PageSize + j] = 'a';

}

__except (PageFaultExceptionFilter(GetExceptionCode())) {

_tprintf (TEXT("出错了"));

ExitProcess( GetLastError() );

}

}

V(s2);

}

cout<< "第一个页面内容:" << lpPtr[3] << endl <

P(s1);

LPVOID lpvResult= VirtualAlloc(NULL, PageSize, MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE |PAGE_GUARD);if (lpvResult ==NULL) {

cout<< GetLastError() <

}else{

cout<< "已经成功提交了一个页面\n\n";

}//测试一次性的PAGE_GUARD功能!同时测试锁定

BOOL bLocked =VirtualLock(lpvResult, PageSize);if (!bLocked) {

cout<< "不能锁定" << lpvResult << ", 错误代码 =" << GetLastError() << "\n\n";

}else{

cout<< "成功锁定了" << lpvResult << "\n\n";

}

bLocked=VirtualLock(lpvResult, PageSize);if (!bLocked) {

cout<< "不能锁定" << lpvResult << ", 错误代码 =" << GetLastError() << "\n\n";

}else{

cout<< "成功锁定了" << lpvResult << "\n\n";

}

showMemStatus("锁定了一个页面");//测试解锁

bLocked =VirtualUnlock(lpvResult, PageSize);if (!bLocked) {

cout<< "不能解锁锁定" << lpvResult << ", 错误代码 =" << GetLastError() << "\n\n";

}else{

cout<< "成功锁定了" << lpvResult << "\n\n";

}

showMemStatus("解锁完一个页面");//测试reset

LPVOID lpvResult1 =VirtualAlloc(lpvResult, PageSize, MEM_RESET, PAGE_READWRITE);if (lpvResult ==NULL) {

cout<< GetLastError() <

}else{

cout<< "已经成功Reset了一个页面\n\n";

}

showMemStatus("Reset了一个页面");//测试释放, 整个,物理+页面虚拟

BOOL bSuccess = VirtualFree(lpvBase, 0, MEM_RELEASE);if (!bSuccess) {

cout<< "错误代码 =" << GetLastError() << "\n\n";

}else{

cout<< "成功释放了" << lpvBase << "\n\n";

}

showMemStatus("释放了大内存");

P(hThread);return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值