//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;

}

c语言 sysinfo_操作系统:内存分配(C语言 winapi)相关推荐

  1. C/C++语言变量声明内存分配

    [cpp] view plaincopy <span style="font-family: Verdana, Arial, Helvetica, sans-serif; " ...

  2. C语言中动态内存分配的本质是什么?

    摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...

  3. c语言malloc引用类型作参数,c语言中动态内存分配malloc只在堆中分配一片内存.doc...

    c语言中动态内存分配malloc只在堆中分配一片内存 .C语言中动态内存分配(malloc)只在堆中分配一片内存,返回一个void指针(分配失败则返回0),并没有创建一个对象.使用时需要强制转换成恰当 ...

  4. 【C语言】动态内存分配

    [C语言]动态内存分配 文章目录 [C语言]动态内存分配 一.malloc 与free函数 二.calloc 三.realloc 四.常见的动态内存的错误 本期,我们将讲解malloc.calloc. ...

  5. C语言——操作系统内存分配过程

    内存分配机制的发展过程: 第一阶段--程序直接操作物理内存. 某台计算机总的内存大小是128M,现在同时运行两个程序A和B,A需占用内存10M,B需占用内存100.计算机在给程序分配内存时会采取这样的 ...

  6. C语言:动态内存分配

    个人博客网址:https://ljsblog.com 动态内存分配(十) 在不知道所需要的空间大小的情况下,这时就可以使用动态内存开辟. 当开辟的空间不再使用时,用free函数来释放calloc.ma ...

  7. 用c语言为程序分配内存,关于C语言程序的内存分配的入门知识学习

    C语言程序的存储区域 C语言编写的程序经过编绎-链接后,将形成一个统一的文件,它由几个部分组成,在程序运行时又会产生几个其他部分,各个部分代表了不同的存储区域: 代码段(Code or Text):代 ...

  8. 【C语言进阶深度学习记录】三十三 C语言中动态内存分配

    如何在程序运行的时候动态给程序分配内存? 文章目录 1 动态内存分配的意义 1.1 C语言中如何动态申请内存空间 1.2 malloc和free的用法 1.3 calloc与realloc 1.31 ...

  9. c语言紧凑算法的内存分配,C语言(第二章.1)算法与数据结构A.ppt

    C语言课件(第二章.1)算法与数据结构A资料 课程设置目的 本课程是非计算机专业学生的技术基础课,通过本课程的学习,应使学生掌握传统的结构化程序设计的一般方法,以C为语言基础,培养学生严谨的程序设计思 ...

最新文章

  1. linux设备驱动第五篇:驱动中的并发与竟态
  2. OVS之vhost-net中VM通信(九)
  3. c#实现显式的用户自定义类型转换(关键字explicit operator)
  4. 玩转SVN系列之【如何放弃本地/服务器端所做的修改】
  5. Python到底是有什么魅力,让程序猿为它折腰?
  6. SQL Server数据库--过滤数据
  7. 2.开发Mip组件的第一个demo(点击关闭按钮,关闭外层dom)
  8. 【渝粤教育】国家开放大学2018年春季 0100-22T程序设计基础 参考试题
  9. 个人博客 修改markdown代码块背景颜色
  10. 网络爬虫-爬取飞常准航班信息
  11. 网络爬虫相关软件以及论文检索与推荐网站调研
  12. 剧本供不应求,会写课堂助力创作者入局剧本杀
  13. STM32F103c8t6超频
  14. 动态图解实例 ConstraintLayout Chain
  15. phpspreadsheet 读取 Excel 表格问题
  16. HTTPS与TOKEN
  17. 死亡搁浅运送系统服务器,死亡搁浅图文攻略 主线流程+订单系统+运送流程+建筑搭建_操作介绍_游侠网...
  18. 【CSS】笔记3-三大样式、盒子模型、PS、圆角、阴影
  19. 数据结构1800关于图的代码精选(三)
  20. 【产业互联网周报】三家量子计算初创企业宣布融资,华为公开量子密钥相关专利;钉钉高调押注低代码,腾讯云低码平台开启公测...

热门文章

  1. 细说 iOS 消息推送
  2. 15条有用的Linux/Unix 磁带管理指令
  3. C# SQLite数据库 访问封装类
  4. 实验四:Telnet远程登录服务器的安装、管理及Telnet客户端的应用
  5. java中JUnit单元测试的使用方法
  6. cmd运行Java中文乱码,无法加载主类Error: Could not find or load main class
  7. UOJ37. 【清华集训2014】主旋律
  8. Java中谈尾递归--尾递归和垃圾回收的比较
  9. 堆积木(基本数据结构-ArrayList数组的使用)
  10. python学习笔记 -- reduce合并减少